11月6日、Twitterで元タレントの田代まさしがまた逮捕された。
トレンドに因んで、今回はスクレイピングに特化したPythonのライブラリ「Beautiful Soup」を使って、ヤフー画像検索から「田代まさし」の画像をスクレイピングしてみることにした。
コンテンツ
スクレイピング対象のページ
今回スクレイピングを行うのは、ヤフーの画像検索だ。
様々な「田代まさし」を確認することができる。
使用するライブラリ
Beautiful Soup
スクレイピングに特化したライブラリで、HTMLファイルのDOMを解析したデータをオブジェクトとして返し、簡単に必要な要素を抽出することができる。
urllib
Web上のURLを開いてデータを取得したりといった操作を行う。
ディレクトリ構成
今回は以下の構成にしてみた。
|-scraping
|—img
|—main.py
imgディレクトリにダウンロードした画像を保存する。
完成したコード
とりあえず完成形を見てもらおう。
from bs4 import BeautifulSoup
import urllib.request, urllib.error, urllib.parse
keyword = '田代まさし'
max_img = 20
dst_path = './img/'
url = 'https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=0&&at=s&ts=1820&p={}&meta=vc%3D'.format(urllib.parse.quote(keyword))
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
soup = BeautifulSoup(res)
div = soup.find('div', id='gridlist')
imgs = div.find_all('img')
for i in range(max_img):
img = imgs[i]['src']
tmp = urllib.request.urlopen(img)
data = tmp.read()
file_name = dst_path + 'img' + str(i) + '.jpg'
with open(file_name, 'wb') as save_img:
save_img.write(data)
コードの解説
ライブラリの読み込み
まずは、先述のライブラリを読み込む。
from bs4 import BeautifulSoup
import urllib.request, urllib.error, urllib.parse
各値の定義
keywordは画像検索の対象となるワードを、max_imgは画像の取得件数、dst_pathは画像を保存するディレクトのパスを設定している。
keyword = '田代まさし'
max_img = 20
dst_path = './img/'
指定のURLへアクセスしHTMLを取得
まず、urlにはヤフー画像検索のURLを指定している。
format関数内のurllib.parse.quoteは、変数keywordで定義した文字列をURLエンコードしている。
headersはUser-Agentの定義。
最後にBeautifulSoupを実行し、変数soupにHTMLのオブジェクトが格納された。
url = 'https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=0&&at=s&ts=1820&p={}&meta=vc%3D'.format(urllib.parse.quote(keyword))
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
soup = BeautifulSoup(res)
取得したHTMLから全ての画像を抽出
BeautifulSoupのfindメソッド、find_allメソッドを使用し、画像要素を全て抽出する。
div = soup.find('div', id='gridlist')
imgs = div.find_all('img')
for文を回し指定数の画像をダウンロード・保存
最初にmax_imgで指定した回数だけfor文を回す。
file_nameで指定したパス・ファイル名で、ダウンロードした画像を保存する。
for i in range(max_img):
img = imgs[i]['src']
tmp = urllib.request.urlopen(img)
data = tmp.read()
file_name = dst_path + 'img' + str(i) + '.jpg'
with open(file_name, 'wb') as save_img:
save_img.write(data)
完成したPythonコードを実行
ターミナルで完成したmain.pyを実行しよう。
python main.py
しばらく待つと画像のダウンロードが始まり、imgディレクトリにダウンロードした画像が保存されるはずだ。