いっきのblog

技術とか色々

Scrapy + Selenium + Headless Chromeを使ってJupyterからスクレイピングする

以前Scrapyを利用してみたが、Jupyterで使えないのか調べて見たのと、ついでにHeadlessブラウザでスクレイピングできないかも調べてみた。

kzkohashi.hatenablog.com

Selenium + ChromeDriverのインストール

Seleniumはいつものpipでインストールする。

pip install selenium

ChromeDriverbrewでインストール。別の方法もあるみたいだが、自分はbrewがインストールされてるのでこちらで。

$ brew install chromedriver

Error: No available formula with the name "chromedriver" 
It was migrated from homebrew/core to caskroom/cask.
You can access it again by running:
  brew tap caskroom/cask

エラー。見ている先にはないので、言われた通り実行する。

$ brew tap homebrew/cask
$ brew cask install chromedriver

これでインストールできた。

最新のChromeDriverをダウンロードしたい場合は以下からいける。 sites.google.com

JupyterでSelenium + ChromeDriverの利用

まずはSelenium + ChromeDriverの使い方。

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

options = Options()

# ヘッドレスにするには必須
options.add_argument('--disable-gpu')
options.add_argument('--headless')

# 必須じゃないけどUserAgentとか変更したいなら追加する
options.add_argument('--lang=ja')
options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36')

# Chromeを指定。ここでFireFoxなども指定できるがHeadlessはないかも。
driver = webdriver.Chrome(chrome_options=options)

# 実際にURLから取得する処理
driver.get('http://localhost)

print(driver.page_source)

driver.quit()

設定も簡単で、これでデータを取得できる。
ただ、このままだとfor分で回してる時にエラーとか出て止まってしまうことがあるため、取得部分を以下のように変更した。

try:
    driver = webdriver.Chrome(chrome_options=options)
    driver.get('http://localhost')
except:
    print('error')
    pass
finally:
    driver.quit()

Scrapyを使って取得したデータの抽出

このままだと使いづらいので、Scrapyに渡して抽出する。

from scrapy.http import HtmlResponse

response = HtmlResponse(
                        driver.current_url,
                        body = driver.page_source,
                        encoding = 'utf-8')
sel = response.css('#id a::text')
if sel.extract_first():
    data = sel.extract_first().strip()

以上でできた。(あっさり・・)
補足しておくと、scrapy.httpではHTML形式だけではなく、XMLのパースにも対応してくれているので、利用する際は以下を見といたほうがいい。

Requests and Responses — Scrapy 1.5.1 documentation

終わりに

JupyterScrapy + Selenium + Headless Chromeの利用はかなり簡単にできた。
Pythonスクレイピングは情報が多く、めっちゃ楽だ。