クローラに使うurllib, urllib2のメモ
pythonでクローラを作ってて,Googleの検索結果のページを使えるようにするためにちょっと工夫が必要だったのでメモ.
urllib, urllib2
pythonでwebページの情報を利用とするとなると,
- urllib
- urllib2
のどちらかを使うことになるかと思います.
基本的にはどちらでも良いのですが,それぞれちょっと違いがあります.
(日本語リファレンスには書いてない話:urllibとurllib2の違いってなんだ « DailyHckr)によると
urlopen()の引数として
- urllib は URL文字列のみ
- urllib2 は urllib2.Requestクラスも
受け取ることが出来る,という違いがあったり.
今回ここで必要だった違いは,urllibモジュールに用意されているquote()です.
google検索で日本語をクエリに投げると,クエリ文字列がエンコードされて
例えばurllib.urlopen()の引数にそのまま渡すことが出来なかったりする.
そこでquote()を使えば,
import urllib, urllib2 print urllib.quote("徳川家康")
とすると
%E5%BE%B3%E5%B7%9D%E5%AE%B6%E5%BA%B7
となり,どっかで見た事あるような記号列に変換してくれます.
ちなみに
_query = "%E5%BE%B3%E5%B7%9D%E5%AE%B6%E5%BA%B7" print urllib.unquote(_query)
とすると
徳川家康
と返してくれます.
このクエリに対する検索結果を上位100件欲しいなら,
google_url = "http://www.google.co.jp/search?jl=ja&num=100&q=" query = raw_input("query = ") query = urllib.quote(query) url = google_url + query
というURLを作り,クライアントを用意してURLを開く.
opener = urllib2.build_opener() html = opener.open(url).read() # html = urllib2.urlopen(url).read()と同じ??分かりません.
とすれば良い,らしい.
しかしこのままだとエラーが吐かれてURLを開けない(pythonのUser-Agentに問題がある)ということが起こるので,addheaders()というメソッドを用いてヘッダを付けて解決.
opener.addheaders = [\ ('Use-Agent', 'Mozilla/5.0 (compatible; googlebot/2.1; \ + http://www.google.com/bot.html)')] _opener.addheaders = [\ ('User-Agent', 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) \ AppleWebKit/417.9(KHTML, like Gecko) Safari/125.9')]
このあたりのUser-Agentは(User Agentリスト - Mozilla Firefox まとめサイト)のものを使いました.
手に入れたhtmlに対してBeautifulSoup使ってあーだこーだしましょう.
UAについてははっきり言ってよく分かってません.
だから上の2つとurllib2.urlopen()の3つを使ってどれかで開ければいいや,くらいにしてありますww
なんか分かれば後日追記しますが.