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.セレニウムのインストール
2.ChromeDriverをダウンロード
Pathが通っているところに配置するか、実行時の引数でDriverの場所を渡すようにする。
基本的な操作
Google検索で「Python」を検索してみる。
考え方的にはJavaScriptでDOM操作するときと大差ない感じ。
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.要素の属性を取得
#リンクの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.画像を保存する
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.ブラウザを非表示で実行する。
画面を立ち上げずに裏で動いてくれるヘッドレスモードというモードがある。
普通に動かすよりもちょっとだけ処理が速いらしい。
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で許可されていない部分はクローリング対象に含めない。」
などを考慮してプログラムを組む必要がありそうです。
(一歩間違えると攻撃してるのと大差なくなってしまいますね。)