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ディレクトリにダウンロードした画像が保存されるはずだ。