[最終更新] 2017年12月26日
最近クローラ+スクレイピングの勉強をしている。Web周りはこれまで不勉強だったものだから、非常に苦労している。種々のサイトを見ていると、サイトも色々だなぁと一サイトの管理人として思う。まぁWordPressをテンプレートそのまんまで使っているだけだが、それだけにこのサイトは扱いやすいだろうなと思う。
とはいえ世の中扱いづらいサイトのほうが多いわけで、学ぶべきことは多い。ということで、とりあえずGoogle検索からしてみる。
やりたいこと
自動でGoogle検索で一番最初にヒットしたサイトにアクセスしたい。
調べたところ、python + selenium + PhantomJS がよくあるみたいだ。
pip install selenium
brew install phantomjs
seleniumはブラウザを操作できるソフトで、Chromeとかもスクリプトで自動操作できるようだ。が、ここではPhantomJSなるものを使う。PhantomJSは画面がなくても使えるヘッドレスブラウザというやつで、コマンドラインとの相性が良い。レンダリングエンジンはWebKit。JavaScriptも動くので、モダンなサイトでも使える。
ただ最近はChromeがヘッドレスモードを搭載したようで、それを受けてPhantomJSのメンテナーさんが降りたらしい。今後はそちらを使っていくべきか。まぁでも、とりあえず参考にした書籍がPhantomJSを使っていたので、そのとおりにやってみる。
ソースコード
このサイト名を検索して、トップ画像を撮影してみる。2秒待っているのは、表示のため。
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
wait_time = 2
class WebScrape:
def __init__(self):
self._driver = webdriver.PhantomJS()
self._driver.set_window_size(800,640)
def screenshot(self, url):
self._navigate(url)
output = 'screenshot.png'
self._driver.save_screenshot(output)
def _navigate(self, url):
self._driver.get(url)
time.sleep(wait_time)
class GoogleSearch(WebScrape):
def __init__(self):
super().__init__()
def search(self, s):
self._navigate('https://www.google.co.jp/')
# check
assert s in driver.title
# search
input_element = self._driver.find_element_by_name('q')
input_element.send_keys(s)
input_element.send_keys(Keys.RETURN)
time.sleep(wait_time)
# output
results = []
[results.append(a.get_attribute('href')) for a in self._driver.find_elements_by_css_selector('h3 > a')]
return results
if __name__ == '__main__':
gs = GoogleSearch()
sites = gs.search('或る阿呆の記')
ws = WebScrape()
ws.screenshot(sites[0])
画像を確認して、ちゃんと撮影されていることを確認。
ちなみに画面の遷移は.get(url)ではなく.navigate().to(url)でもいけるようだが、意味はそう変わらないらしい(参考「起動したWebDriverにただページ遷移をさせたい – Qiita」)。

もうちょっとちゃんと使っていきたい。
ところで、Google検索自体にはAPIが用意されている(「Custom Search JSON/Atom API | Custom Search | Google Developers」)。あまり評判芳しくないようだが、本格的にGoogle検索を扱うのであればこのAPIを利用すべきなのだろう。ロボットで色々やりすぎると最悪Googleからbanされてしまうようで、たいへん恐ろしい。
参考
参考にさせていただきました。
- 【Python】Seleniumを使ってGoogle検索結果のページ送り(ページネーション)をクリックして次のページヘ進む方法
- 2017年夏、Selenium、ヘッドレスブラウザ | To Be Decided
- ヘッドレス Chrome ことはじめ | Web | Google Developers
特にこの書籍「Python クローリング&スクレイピング」はたいへん勉強になりました。本記事はこの本の5.6節の内容にあたります。良い本です。
関連記事
Python の記事
- [2018年1月19日] pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ
- [2018年1月16日] Pythonでファイル・ディレクトリ操作
- [2018年1月9日] pythonで画像をダウンロードして、URLに応じてディレクトリ分けする
- [2017年12月27日] Pandasで行の追加(縦方向の連結)の操作メモ
- [2017年12月25日] PDFから文章を抽出する
- ---本記事---
- [2017年12月22日] pythonでExcelファイル内の半角をすべて全角にする
- [2017年11月14日] pythonのxlsxwriterでフォーマットの上書きをしたいが…
- [2016年10月22日] pythonのPyYAMLでブロック形式で書き込み(dump出力)
- [2016年10月4日] 旧版:とにかくRaspberry Piにpython3 + numpy + matplotlibをインストールする(pyenv使用)
- [2016年8月3日] Python3で意図せずしてfloatに…VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
スポンサーリンク