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

26
エンジョイ☆スクレイピング @fmkz___

Upload: kazufumi-ohkawa

Post on 10-May-2015

7.690 views

Category:

Technology


6 download

DESCRIPTION

Seleniumの

TRANSCRIPT

Page 1: エンジョイ☆スクレイピング

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

@fmkz___

Page 2: エンジョイ☆スクレイピング

もしもそれがヒトのようにアクセスし、ヒトのようにインターバルをとるのなら、それはヒトである

Page 3: エンジョイ☆スクレイピング

自己紹介 •  kzfm (@fmkz___)

–  blog.kzfmix.com –  Shizuoka.py

•  とある製薬企業の研究員 •  日本酒とdrum’n’bass好き

•  Python歴は6年くらい – (その前はPerl)

•  よく使うのはFlask, Pandas – 最近DjangoかRoRに移ろうかなと

Page 4: エンジョイ☆スクレイピング

あるサービスのRSSをクローラで定期的にチェックしてい

たのですが、

「ロボットアクセス禁止って書いてあるだろ」ってブロッ

クされました

Page 5: エンジョイ☆スクレイピング

文化の違いって難しいですね?

Page 6: エンジョイ☆スクレイピング

シンプルなサイト

簡単

Page 7: エンジョイ☆スクレイピング

requestsを使う •  URLを指定すると、HTMLやXMLが返ってくるような – RSSや普通のウェブページ

•  requests+pyquery •  requests+feedparser

Page 8: エンジョイ☆スクレイピング

例 •  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

Page 9: エンジョイ☆スクレイピング

状態を持つサイト

statefulはstressful

Page 10: エンジョイ☆スクレイピング

mechanizeを使う •  ログインしてごにょごにょする必要があるようなタスク

•  queryがPOSTでsearch.doとかresult.doみたいなサイト

Page 11: エンジョイ☆スクレイピング

例 •  amazonのアフィリエイトにアクセスして売上を(メールで確認したい)

Page 12: エンジョイ☆スクレイピング

コード(一部) 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’)  

Page 13: エンジョイ☆スクレイピング

mechanizeで扱えないサイト •  JavascriptでDOMを組み立てるようなタイプのサイト

– googleとか

•  最近増えている… – Javascript MVCとかさ

Page 14: エンジョイ☆スクレイピング
Page 15: エンジョイ☆スクレイピング

Browserを使えばいい •  Browserをスクリプトから操作する – perlだとWWW::Mechanize::Firefox – pythonだとSelenium •  chrome, firefox, ie, opera

•  ヘッドレスでやりたい – CasperJS – SeleniumのPhantomJSドライバを使う

Page 16: エンジョイ☆スクレイピング

Selenium+PhatomJS

Page 17: エンジョイ☆スクレイピング

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()

Page 18: エンジョイ☆スクレイピング
Page 19: エンジョイ☆スクレイピング

デモ

google patent searchにオプションを指定しながら検索する

Page 20: エンジョイ☆スクレイピング

エレメントを探す •  めんどくさい •  最近はChrome使っている – 虫眼鏡で探して – Xpathに変換して – find_element_by_xpathメソッドに渡して

– 処理する

Page 21: エンジョイ☆スクレイピング

エレメントを探す •  chromeの虫眼鏡

Page 22: エンジョイ☆スクレイピング

Xpathとしてコピー

Page 23: エンジョイ☆スクレイピング

スクリプトで使う •  find_element_by_xpathメソッドに渡して

•  send_keysとかclickメソッドを呼び出す

Page 24: エンジョイ☆スクレイピング

デバッグ •  デバッグの基本はもちろんプリントデバッグ

•  save_screenshot(”check.png“)で出力して

•  スクリーンショットを目視する – なかなかつらい作業

Page 25: エンジョイ☆スクレイピング

デバッグ時の注意点 •  要素が見つからない等の理由でエラー終了すると、バックグラウンドで動いているghostdriverが死なずに生き残っている

•  ふと気づくと大量に発生しているのでたまにプロセスをキルしましょう

Page 26: エンジョイ☆スクレイピング

まとめ •  むかしむかし「正確無比なドラマーは結局打ち込みと変わらないんじゃないかなー」と思ったことがあります

•  今は、多少ゆらぎをもたせたロボットは、よく訓練された人力クローラと変わらないんじゃないかなーと思っています