2017年09月13日

「いらすとや」さんのWebサイトのスクレイピングで一括ダウンロード

computer_search_kensaku.png

みなさんおなじみの「いらすとや」さんですが、Pythonによる機械学習の勉強にイラストを使わせてもらいたいなーと思いました。まずは教師データが必要になるので、とりあえず画像データをスクレイピングするPythonのコードを作成しました。

コマンドと結果

コマンドの仕様としては、引数に「検索ワード」と「最大取得数」を渡すようにしました。
 > python.exe irasutoya_down.py インターネット 200

すると下記の様にひたすら画像がダウンロードされていきます。

http://4.bp.blogspot.com/-zTvzECyWEsk/VwIjHWMdszI/AAAAAAAA5e4/W_kAnVythXoHGzGO3AkgrHImS3cpvMiuQ/s800/internet_kanki_man1.png
http://4.bp.blogspot.com/-RK1r8J9kF_c/VwIjHdTzFVI/AAAAAAAA5e8/_N9Xhc0JtM0DLsHLU5eqhqxkk8lQ-aZSQ/s800/internet_kanki_man2.png
http://2.bp.blogspot.com/-llDpo-3-K7k/VwIjHt4UonI/AAAAAAAA5fA/PWpKhDKWK7IvwmC4yuyBZ8b4L4sXoZVMw/s800/internet_kanki_woman1.png
http://4.bp.blogspot.com/-IxWKND4JML8/VwIjILi7wFI/AAAAAAAA5fE/lgjzp6DwT6cVJKTZI5dOQe-AHX4hGDaYw/s800/internet_kanki_woman2.png

<<中略>>

http://2.bp.blogspot.com/-beSfKCyewTk/Udy6lPRVwhI/AAAAAAAAWI8/uNDgJL6OC3I/s800/computer_family.png
http://2.bp.blogspot.com/-KwGSRNHzsVA/UbVvOo58z5I/AAAAAAAAUsc/y2sh_GfnPQ8/s800/computer_wireless.png

フォルダにも下記のように保存されていきます。

20170916_irasutoya_0.jpg

続いて、コードになります。

メインコード

手順としては下記の通りです。

1.検索ワードで引っかかるイラストの個別ページのリンクを一通り取得
2.その個別ページの中をスクレイピングして画像のリンクを取得
3.画像をローカルにダウンロード

import sys,os
import re
import urllib.request as urlreq
from bs4 import BeautifulSoup
import requests

# 一時的に保存するページのリスト
linkData = []

if len(sys.argv) != 3:
print("Usage: python.exe irasutoya_down.py <SearchWord> <max num>")
quit()

keyword = sys.argv[1]
max = int(sys.argv[2])

# 検索結果から各ページのリンク先をmaxページ分だけ取得
for num in range(0,max,20):
res = requests.get("http://www.irasutoya.com/search?q="+keyword+"&max-results=20&start="+str(num))
soup = BeautifulSoup(res.text, "lxml")

# Linkの箇所をselect
links = soup.select("a[href]")
for a in links:
# Linkタグのhref属性の箇所を抜き出す
href = a.attrs['href']
# 画像データに対応するページのリンク先のみをリストに格納
if re.search(r"irasutoya.*blog-post.*html$",href):
if not href in linkData:
linkData.append(href)

# 各ページから画像データのリンクを取得して、画像を保存
for link in linkData:
res = requests.get(link)
soup = BeautifulSoup(res.text, "lxml")

# 記事中の画像データを抜き出す
# class separator -> a の抜き出し
links = soup.select(".separator > a")
for a in links:
# hrefのデータを取得
imageLink = a.get('href')
# ファイル名の取得
filename = re.search(r".*\/(.*png|.*jpg)$",imageLink)
# 画像をダウンロードする
urlreq.urlretrieve(imageLink,"down/"+filename.group(1))
# デバッグ用にダウンロード先Linkを表示
print(imageLink)

ただ、いまだにBeautifulSoupの使い方が分かっていなくて、ググったり本を片手にコードを書いています。


スポンサーリンク
posted by くまなべ at 08:00 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180946711
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック