クローラに使う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
なんか分かれば後日追記しますが.