エンジョイ☆スクレイピング
DESCRIPTION
SeleniumのTRANSCRIPT
エンジョイ☆スクレイピング
@fmkz___
もしもそれがヒトのようにアクセスし、ヒトのようにインターバルをとるのなら、それはヒトである
自己紹介 • kzfm (@fmkz___)
– blog.kzfmix.com – Shizuoka.py
• とある製薬企業の研究員 • 日本酒とdrum’n’bass好き
• Python歴は6年くらい – (その前はPerl)
• よく使うのはFlask, Pandas – 最近DjangoかRoRに移ろうかなと
あるサービスのRSSをクローラで定期的にチェックしてい
たのですが、
「ロボットアクセス禁止って書いてあるだろ」ってブロッ
クされました
文化の違いって難しいですね?
シンプルなサイト
簡単
requestsを使う • URLを指定すると、HTMLやXMLが返ってくるような – RSSや普通のウェブページ
• requests+pyquery • requests+feedparser
例 • Naverまとめからひたすら富士山の画像を集める
import re import requests c = requests.get('h3p://matome.naver.jp/odai/2134560784352051501').content print(''.join([x.group(0) for x in re.finditer(r'<img src=".+".*?class="MTMItemThumb".*?/>', c)]))
参考: h3p://d.hatena.ne.jp/heavenshell/20121214/1355499643
状態を持つサイト
statefulはstressful
mechanizeを使う • ログインしてごにょごにょする必要があるようなタスク
• queryがPOSTでsearch.doとかresult.doみたいなサイト
例 • amazonのアフィリエイトにアクセスして売上を(メールで確認したい)
コード(一部) from mechanize import Browser from pyquery import PyQuery as pq
br = Browser() br.set_handle_robots(False) br.addheaders = [('User-‐agent', 'Mozilla/5.0 (X11; U; Linux i686; en-‐US; \ rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-‐1.fc9 Firefox/3.0.1')]
br.open(amazon_url) br.select_form(name="sign_in") br["email"] = email br["password"] = password
response = br.submit() d = pq(response.get_data()) data.text for data in d('div').filter('.data’)
mechanizeで扱えないサイト • JavascriptでDOMを組み立てるようなタイプのサイト
– googleとか
• 最近増えている… – Javascript MVCとかさ
Browserを使えばいい • Browserをスクリプトから操作する – perlだとWWW::Mechanize::Firefox – pythonだとSelenium • chrome, firefox, ie, opera
• ヘッドレスでやりたい – CasperJS – SeleniumのPhantomJSドライバを使う
Selenium+PhatomJS
seleniumを使う
from selenium import webdriver import ime driver = webdriver.PhantomJS() driver.get("h3ps://www.google.co.jp/webhp?hl=ja&tab \ =ww&authuser=0#authuser=0&hl=ja&q=python") print driver.current_url ime.sleep(2) driver.save_screenshot("screen_shot130918.png") driver.quit()
デモ
google patent searchにオプションを指定しながら検索する
エレメントを探す • めんどくさい • 最近はChrome使っている – 虫眼鏡で探して – Xpathに変換して – find_element_by_xpathメソッドに渡して
– 処理する
エレメントを探す • chromeの虫眼鏡
Xpathとしてコピー
スクリプトで使う • find_element_by_xpathメソッドに渡して
• send_keysとかclickメソッドを呼び出す
デバッグ • デバッグの基本はもちろんプリントデバッグ
• save_screenshot(”check.png“)で出力して
• スクリーンショットを目視する – なかなかつらい作業
デバッグ時の注意点 • 要素が見つからない等の理由でエラー終了すると、バックグラウンドで動いているghostdriverが死なずに生き残っている
• ふと気づくと大量に発生しているのでたまにプロセスをキルしましょう
まとめ • むかしむかし「正確無比なドラマーは結局打ち込みと変わらないんじゃないかなー」と思ったことがあります
• 今は、多少ゆらぎをもたせたロボットは、よく訓練された人力クローラと変わらないんじゃないかなーと思っています