Seleniumで行う画像収集

サイトのスクリーンショットを大量に集めるためのプログラムを書きました。

Attension

もともと自分用のプログラムを記事用にぼかしています。 ブログ初心者なので細かいところには...

以下を使用

なぜSeleniumなのか

どんな流れ?

  • ログイン
  • 手で入力したid(?)のページから、さらにそのidに関するページ一覧を取得
  • 上記で取得したページのスクリーンショットを保存

コードは口程に物を言うと言うわけで

早速コード

import time
import os
import re
from selenium import webdriver

driver_path = '(事前にダウンロードしたchromedriverのファイルパス)/chromedriver'
# ログインのURL
URL = ''

# スクショを取る関数
def save_capture(filename):
    driver.save_screenshot(filename)
    print('Save screenshot', filename)

driver = webdriver.Chrome(driver_path)
driver.set_window_size(1440, 900)
driver.get(URL)

time.sleep(3)

# ログイン
driver.find_element_by_xpath('(メアドのフォームのxpath)').send_keys('(メアドなど)')
time.sleep(1)
driver.find_element_by_xpath('(パスワードのフォームのxpath)').send_keys('(パスワード)')
time.sleep(1)
driver.find_element_by_xpath('(フォームの送信ボタンのxpath)').click()
time.sleep(3)

# chromedriverのウィンドウを最前面にする
driver.switch_to.window(driver.window_handles[0])
time.sleep(1)

# authorsは自分で手入力する
authors = []
for author in authors:
    # author用の保存ディレクトリを作成
    if not os.path.exists(author):
        os.mkdir(author)
    # 各authorのURLへ飛ぶ
    driver.get('URL + author')
    time.sleep(2)

    # 正規表現author別のtitle一覧を取得する
    titles = re.findall('(飛びたいURL)', driver.page_source)
    print(author, titles)
    time.sleep(1)
    for title in titles:
        # 一つあたり50件くらいと仮定
        for i in range(1, 50):
            # ファイル名に0パディング
            pad_i = '{0:02d}'.format(i)
            driver.get()
            # 1ページ目の表示に時間がかかるため
            if i == 1:
                time.sleep(10)
            else:
                time.sleep(5)
            current_url = driver.current_url
            if current_url == '(スクショが終わって欲しいURL)':
                break
            if not os.path.exists((ファイルを保存するディレクトリ)):
                os.mkdir((ファイルを保存するディレクトリ))
            filename = author + '/' + title + '/' + pad_i + '.png'
            save_capture(filename)

# これないとプログラム終わってもchromeが残ります
driver.close()
driver.quit()

解説

sleep()が多いのは、ページの読み込みを待つためです。
多すぎるのは、勢いで書いたからです。 読み込みが不完全だとfind_element_by_xpath()あたりでエラー出たりします。

xpathChromeの検証でCopy -> Copy Xpathから取ると楽です。

正規表現って u'hoge/(.*)/fuga' みたいな感じで()の中取れるんですね。 勉強になりました。

後書

大学生でお金がないです。
誰か仕事くれ
愛のままにわがままに、欲しいものリスト載せます。 Amazon.co.jp
励みになってもっと頑張ります。
引き出しはあるんで(swiftとか)