Seleniumを使ってGoogleの検索結果をたくさん取得する

# 概要
Googleの検索結果をまとめてダウンロードしたくなったので書きました。
また一発でわかる情報がなかったので、まとめてみました。

# 注意事項
スクレイピングは用法用量を守って正しくお使いください

# 環境構築
自分はVagrantでUbuntu 16.04(ubuntu/xenial64)を使いました。
VagrantでVMをつくる場合は以下の通り。特にネットワークの設定等はいらないはずです。

```bash
vagrant init ubuntu/xenial64
vagrant up
vagrant ssh
```

Python3やらSeleniumやらFirefoxをいれてあげます。(こちらの[記事(Firefox headlessモードをUbuntuとPythonとSelenium環境で動かす - Stimulator)](https://vaaaaaanquish.hatenablog.com/entry/2017/08/31/172020)を参考にさせていただきました。)

```bash
sudo apt-get update
sudo apt-get install python3-pip -y
sudo pip3 install selenium
sudo apt-add-repository ppa:mozillateam/firefox-next
sudo apt-get update
sudo apt-get install firefox -y
wget https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-linux64.tar.gz
tar -zxvf geckodriver-v0.18.0-linux64.tar.gz
sudo cp ./geckodriver /usr/local/bin
```

これだけだとディスプレイがないの怒られる場合があります→[python - selenium.common.exceptions.WebDriverException: Message: connection refused - Stack Overflow](https://stackoverflow.com/questions/39547598/selenium-common-exceptions-webdriverexception-message-connection-refused)
なので仮想ディスプレイ環境をいれてあげます。(必要な人はいれてください。デスクトップ版のUbuntu等は必要ない場合があります。)

```bash
sudo pip3 install pyvirtualdisplay
sudo apt-get install xvfb -y
```
スクレイピング用にPyQueryを入れてあげます→[PyQueryのインストール - Qiita](https://qiita.com/Kawa1128/items/9aa0091a8157816401f9)

```bash
sudo apt-get install libxml-dev libxslt-dev
pip3 install pyquery
```

# サンプルコード
指定した検索結果からPDFファイルをダウンロードしてきます。

```google_scraping.py
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from pyvirtualdisplay import Display
from pyquery import PyQuery as pq
import urllib.request
import sys
from urllib.parse import urljoin

SAVE_DIR = "./download"
START_URL = 'https://www.google.co.jp/search?q=filetype%3Apdf+%E7%A4%BE%E5%A4%96%E7%A7%98&oq=filetype%3Apdf+%E7%A4%BE%E5%A4%96%E7%A7%98&aqs=chrome..69i57j69i58.15927j0j7&sourceid=chrome&ie=UTF-8'
MAX_COUNT = 20

def download(url, filename, save_dir=SAVE_DIR):
    urllib.request.urlretrieve(url,"%s/%s" % (save_dir, filename))

def get_source(url_str):
    binary = FirefoxBinary('/usr/bin/firefox')
    binary.add_command_line_options('-headless')
    driver = webdriver.Firefox(firefox_binary=binary)
    driver.get(url_str)
    ret = driver.page_source
    driver.quit()
    return ret

# startは数値
def download_from_google(google_search_url):
    html = get_source(google_search_url)
    dom = pq(html)
    
    for elem in dom.find('a'):
        e = pq(elem)
        if e.attr('href') is None:
            continue

        if e.attr('href')[-4:].lower() == ".pdf":
            url = e.attr('href')
            filename = url.split("/")[-1]
            print(url, filename)
            download(url, filename)

    return urljoin(google_search_url, dom("#pnnext").attr('href'))

if __name__ == "__main__":
    display = Display(visible=0, size=(800, 600))
    display.start()

    current_url = START_URL

    for c in range(MAX_COUNT):
        print("count %d" % c)
        current_url = download_from_google(current_url)
        print()
```

`SAVE_DIR`にダウンロード先を設定し、
`START_URL`に最初の検索画面のURLを指定し、(サンプルだと[これ](https://www.google.co.jp/search?q=filetype%3Apdf+%E7%A4%BE%E5%A4%96%E7%A7%98&oq=filetype%3Apdf+%E7%A4%BE%E5%A4%96%E7%A7%98&aqs=chrome..69i57j69i58.15927j0j7&sourceid=chrome&ie=UTF-8))
`MAX_COUNT`で探索するページ数を指定してあげます。

そして以下のように実行。

```bash
python3 google_scraping.py
```

# つぶやき
Google Search APIをタダ乗りしてる感が強い...大丈夫なのかな...?