Scrapy + Selenium + Headless Chromeを使ってJupyterからスクレイピングする
以前Scrapyを利用してみたが、Jupyter
で使えないのか調べて見たのと、ついでにHeadless
ブラウザでスクレイピングできないかも調べてみた。
Selenium + ChromeDriverのインストール
Selenium
はいつものpip
でインストールする。
pip install selenium
ChromeDriver
はbrew
でインストール。別の方法もあるみたいだが、自分は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
終わりに
Jupyter
でScrapy + Selenium + Headless Chrome
の利用はかなり簡単にできた。
Python
のスクレイピングは情報が多く、めっちゃ楽だ。