概要
Googleの検索結果をまとめてダウンロードしたくなったので書きました。
また一発でわかる情報がなかったので、まとめてみました。
注意事項
スクレイピングは用法用量を守って正しくお使いください
環境構築
自分はVagrantでUbuntu 16.04(ubuntu/xenial64)を使いました。
VagrantでVMをつくる場合は以下の通り。特にネットワークの設定等はいらないはずです。
vagrant init ubuntu/xenial64
vagrant up
vagrant ssh
Python3やらSeleniumやらFirefoxをいれてあげます。(こちらの記事(Firefox headlessモードをUbuntuとPythonとSelenium環境で動かす - Stimulator)を参考にさせていただきました。)
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
なので仮想ディスプレイ環境をいれてあげます。(必要な人はいれてください。デスクトップ版のUbuntu等は必要ない場合があります。)
sudo pip3 install pyvirtualdisplay
sudo apt-get install xvfb -y
スクレイピング用にPyQueryを入れてあげます→PyQueryのインストール - Qiita
sudo apt-get install libxml-dev libxslt-dev
pip3 install pyquery
サンプルコード
指定した検索結果からPDFファイルをダウンロードしてきます。
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を指定し、(サンプルだとこれ)
MAX_COUNT
で探索するページ数を指定してあげます。
そして以下のように実行。
python3 google_scraping.py
つぶやき
Google Search APIをタダ乗りしてる感が強い...大丈夫なのかな...?