LoginSignup
3
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-25

概要

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ファイルをダウンロードしてきます。

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を指定し、(サンプルだとこれ)
MAX_COUNTで探索するページ数を指定してあげます。

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

python3 google_scraping.py

つぶやき

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0