pythonでWeb上にあるファイルを、ダウンロードをしてみました。
ウェブスクレイピングってやつですかね。
ソース
今回は対象のサイトの、最初に出てくる画像ファイルをダウンロードする処理になります。
# -*- coding: utf-8 -*- import requests import bs4 # 対象のURL url = "http://xxx.com" # URLの情報を取得 r = requests.get(url) soup = bs4.BeautifulSoup(r.content) # imgタグを取得 tag = soup.img # imgタグからsrc要素を取得 imgSrc = tag['src'] # ファイル名を取得 fileName = imgSrc.split("/")[-1] # 画像URL req = requests.get(imgSrc) # リクエスト成功? if r.status_code == 200: # ファイルの保存 f = open(fileName, 'wb') f.write(req.content) f.close()
わりと短いコードでできることに驚きです。
requestsとBeautifulSoupの力ですね……
それでは解説していきます。
インポート
インポートはこの2つを行います。
- requests
- bs4
requestsは、対象のURLからソースを取得したりする、ネットのやり取り部分を扱うヤツですね。
bs4は、この中のBeautifulSoupという機能を使っています。
BeautifulSoupは、ソースのバイナリからテキスト化ができるみたいです。
2つとももっと色々と機能があるのかもしれませんが、まだ使い始めたばかりなので知識不足です……
対象URLからソースを取得
対象URLからソースを取得する箇所です。
url = "http://xxx.com" # URLの情報を取得 r = requests.get(url) soup = bs4.BeautifulSoup(r.content)
requests.get(対象URL)で、そのURLの情報が取得できます。
取得した情報のcontent(r.content)に、ソースが入っています。
このソースの内容は、Byte型となります。
中身を表示するとこんな感じ。
b'<!DOCTYPE html>\n<html lang="en">\n<head>~'
このr.contentを、BeautifulSoupで、変数soupに入れていますね。
コレを行うことで、ソースをテキスト化できます。
表示するとこんなイメージ。
<!DOCTYPE html> <html lang="en"> <head> :
ソースからimgタグの情報を取得
BeautifulSoupで、変数soupにテキスト版ソースを突っ込みましたね。
BeautifulSoupは、ここから更に力を発揮します。
imgタグが欲しい場合、「soup.img」とするだけで、最初に出てくるimgタグが取得できます。
# imgタグを取得 tag = soup.img print(tag) --- <img alt="" src="http://xxx.com/image.png"/>
さらにimgタグのsrc要素を取りたい!というときは、これだけで実現します。
# imgタグからsrc要素を取得 imgSrc = tag['src'] print(imgSrc) --- http://xxx.com/image.png
ここからpythonのsplit()を使えば、ファイル名も抽出可能!
# ファイル名を取得 fileName = imgSrc.split("/")[-1] print(fileName) --- image.png
ファイルの保存
画像の情報を取得できたら、今度は保存です。
まず、画像のURL*1からデータを取得します。
req = requests.get(imgSrc)
requests.get()で取得したオブジェクトは、status_codeに結果のコードが入っています。
これが「200」だと成功らしいです。
# リクエスト成功? if req.status_code == 200:
もし成功だったら、ファイルを保存します。
やっていることは大したことではなくて、上から順に
- バイナリ書込モードでファイルオープン
- 取得した画像データのByte列を書込
- ファイルクローズ
# ファイルの保存 f = open(fileName, 'wb') f.write(req.content) f.close()
内容が取得してきたバイナリ情報というだけで、普通のファイル書込と同じですね。
これで、指定したファイル名(今回の場合、image.png)で、画像ファイルが保存されているはずです!
あとがき
いかがでしたでしょうか?
ウェブスクレイピング素人なのですが、なんかいい感じのことができました!
コレを応用して、なんかしていきたいと思います。
というか、やりたいことあったからやってたんですけど(笑)
思ったより簡単だったので、皆さんも試してみてはいかがでしょうか?!