SlideShare a Scribd company logo
エンジョイ☆スクレイピング
@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が死なずに生き残ってい
る
•  ふと気づくと大量に発生しているのでたま
にプロセスをキルしましょう
まとめ
•  むかしむかし「正確無比なドラマーは結
局打ち込みと変わらないんじゃないか
なー」と思ったことがあります
•  今は、多少ゆらぎをもたせたロボットは、
よく訓練された人力クローラと変わらな
いんじゃないかなーと思っています

More Related Content

エンジョイ☆スクレイピング