経緯
- 機械学習で使うための画像データ収集をしたかったため、beautifulsoupを使ってWebスクレイピングをしていた。
- jsで書かれたところ(「次へ」ボタン等)は処理できなかったため、1ページ分の画像しか収集できなかった。
- 機械学習で使うためにも、jsに対応してたくさんの画像を収集したい
beautifulsoup4
pythonのhtmlスクレイピング用ライブラリ
単体ではjsで書かれている動的な部分は触れない
Selenium
webブラウザ上でのテストによく使われているツール
今回はPhantomJSの制御に使用
PhantomJS
ヘッドレスブラウザ
Chromeやfirefoxなど、GUIのブラウザのCUI版
いちいちブラウザを立ち上げずにスクレイピングできる
JSで書かれたコードもレンダリングできる
環境構築
beautifulsoup4
$ pip install --upgrade beautifulsoup4
selenium
$ pip install --upgrade selenium
PhantomJS
公式ページからダウンロードしたファイルにpathを通す
# ダウンロードしてきたディレクトリに移動
# 以下の場合は、Downloadフォルダにある例です
cd ~/Downloads/phantomjs-2.1.1-macosx/
# /usr/local/bin にコピー
cp bin/phantomjs /usr/local/bin/
実行
コード→https://github.com/daaaisuke/scraping(scraping2.py)
sampleではyahooの画像検索で実行
手順
- dirnameで指定した名前のファイル(画像保存用ファイル)がなければ作成(35行目)
- PhantomJSをブラウザとして選択(40行目)
- 指定したurlのページをPhantomJS(ヘッドレスブラウザ)でレンダリング(43行目)
- レンダリング結果をPhantomJSから取得
- 取得したhtmlをbeautifulsoupに渡し、画像のurlを取得(52~55行目)
- 取得したurlの配列をfor文で回して、ローカルに保存する(57~70行目)
- 次ページへ進むためのjsを探し出し、クリック(73行目)
(4~7をloop)
注意点
- 最初のfor文のpage_numで指定した数だけ次のページへと遷移していく。
- 手順7でjsをクリックした後のhtmlを、次の周の手順4で、レンダリングしている。
-
remove("javascript:void(0);")
は配列に入ってしまったノイズを削除しているだけ
うまくいけば、ログが吐かれ続けた後、指定されたディレクトリに画像がたくさん入っているはず!