LoginSignup
29
42

More than 5 years have passed since last update.

Python×Seleniumでクローリング備忘録

Last updated at Posted at 2018-06-03
1 / 7

Seleniumでブラウザを自動操作してWebサイトをクローリングするためのメモ。
BeautifulSoupはJavaScriptでガチャガチャしているWebサイトのクローリングには
向かないようなので、今回はSeleniumでやってみた。ブラウザはGoogleChromeを使用。


実行環境

Windows10
Python 3.6.0
Selenium 3.12.0
GoogleChrome 66.0.3359.181(64bit)
ChromeDriver 2.38


準備すること

※前提としてChromeとpython3がインストールされていること

1.セレニウムのインストール
$ pip install selenium

2.ChromeDriverをダウンロード
 Pathが通っているところに配置するか、実行時の引数でDriverの場所を渡すようにする。


基本的な操作

Google検索で「Python」を検索してみる。
考え方的にはJavaScriptでDOM操作するときと大差ない感じ。

google_search.py
from selenium import webdriver

# ChromeのDriverオブジェクト生成。(DriverにPathを通してない場合はここで引数として渡す)
driver = webdriver.Chrome(executable_path="C:\driver\chromedriver.exe")

# Googleのページを開く
driver.get("https://www.google.co.jp/")

#検索窓のelementを取得
search_box = driver.find_element_by_id("lst-ib")

#検索窓に"Python"を入力
search_box.send_keys("Python")

#検索ボタンのelementを取得
search_button = driver.find_element_by_name("btnK")

#検索ボタンを押下
search_button.click()


その他クローリングに必要そうなこと

1.要素の属性を取得

get_attribute.py

#リンクのhref属性の値を取得
href = driver.find_element_by_tag_name("a").get_attribute("href")

#画像のsrc属性の値を取得
src = driver.find_element_by_tag_name("img").get_attribute("src")

#etc....

2.画像を保存する

save_image.py

import shutil
import requests
import base64

def save_image(src, file_save_path):

    #Base64エンコードされた画像をデコードして保存する。
    if "base64," in src:
        with open(file_save_path, "wb") as f:
            f.write(base64.b64decode(src.split(",")[1]))

    #画像のURLから画像を保存する。
    else:
        res = requests.get(src, stream=True)
        with open(file_save_path, "wb") as f:
            shutil.copyfileobj(res.raw, f)

3.ブラウザを非表示で実行する。

画面を立ち上げずに裏で動いてくれるヘッドレスモードというモードがある。
普通に動かすよりもちょっとだけ処理が速いらしい。

headless_mode.py

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#ChromeのDriverオブジェクト生成時にオプションに引数を追加して渡す。
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)

#DriverにPathを通していない場合はこんな感じで一緒に渡す。
driver = webdriver.Chrome(executable_path="C:\driver\chromedriver.exe",chrome_options=options)



あとがき

単純なデータ収集なら、これくらいあれば問題なく作れました。

実際にクローリングする際のルールとして、
「リクエストとリクエストの間隔を最低一秒空ける。」
「robots.txtで許可されていない部分はクローリング対象に含めない。」
などを考慮してプログラムを組む必要がありそうです。
(一歩間違えると攻撃してるのと大差なくなってしまいますね。)

29
42
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
29
42