LoginSignup
3
6

More than 5 years have passed since last update.

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

Posted at

経緯

  • 機械学習で使うための画像データ収集をしたかったため、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);")は配列に入ってしまったノイズを削除しているだけ

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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6