Selenium
PhantomJS
Python3
beautifulsoup4

python+beautifulsoup+selenium+phantomjsで画像スクレイピング

More than 1 year has passed since last update.

経緯

  • 機械学習で使うための画像データ収集をしたかったため、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の画像検索で実行

手順
1. dirnameで指定した名前のファイル(画像保存用ファイル)がなければ作成(35行目)
2. PhantomJSをブラウザとして選択(40行目)
3. 指定したurlのページをPhantomJS(ヘッドレスブラウザ)でレンダリング(43行目)
4. レンダリング結果をPhantomJSから取得
5. 取得したhtmlをbeautifulsoupに渡し、画像のurlを取得(52~55行目)
6. 取得したurlの配列をfor文で回して、ローカルに保存する(57~70行目)
7. 次ページへ進むためのjsを探し出し、クリック(73行目)
(4~7をloop)

注意点

  • 最初のfor文のpage_numで指定した数だけ次のページへと遷移していく。
  • 手順7でjsをクリックした後のhtmlを、次の周の手順4で、レンダリングしている。
  • remove("javascript:void(0);")は配列に入ってしまったノイズを削除しているだけ

うまくいけば、ログが吐かれ続けた後、指定されたディレクトリに画像がたくさん入っているはず!