Botで/.Jにログインさせようとすると……
Pythonでスクレイピングしてみようと、下記のようなコードを書く。
login_param = {
"op":"userlogin",
"unickname":"",
"returnto":"http://slashdot.jp",
"upasswd":"",
# "login_temp":0,
"userlogin":"ログイン",
}
login_param["unickname"] = loginname
login_param["upasswd"] = passwd
encoded_data = urllib.urlencode( login_param )
obj = urllib.urlopen(OTP_LOGIN_URL, encoded_data )
print obj.info()
で、これでログインさせようとすると、下記のようなヘッダが返ってくる。
Date: Fri, 06 Mar 2009 03:00:13 GMT
Server: Apache/1.3.34 (Debian) mod_gzip/1.3.26.1a mod_perl/1.29
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001233
X-Bender: Senseless death! The folk singer's best friend!
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8
「X-Bender:」の内容は毎回ランダムに変わる。Cookieが返って来ていないのでもちろんログイン失敗なのだが、どうもボットかどうかをこちらが送るヘッダで判断しているようだ。ということで、今度は下記のようなコードでやってみたら成功。
login_host = "slashdot.jp"
login_path = "/login.pl"
login_param = {
"op":"userlogin",
"unickname":"",
"returnto":"http://slashdot.jp",
"upasswd":"",
# "login_temp":0,
"userlogin":"ログイン",
}
login_param["unickname"] = loginname
login_param["upasswd"] = passwd
encoded_data = urllib.urlencode( login_param )
headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729) "
"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain",
}
obj = httplib.HTTPConnection( login_host )
obj.request( "POST", login_path, encoded_data, headers )
resp = obj.getresponse()
headers = resp.getheaders()
for item in headers:
print item
しかしやっぱり変なヘッダは返ってきていたり(笑)。
x-leela:I'm a millionaire! Suddenly I have an opinion about the capital gains tax.
Pythonは標準でWWWアクセスを行うモジュールが付属しているのはとても良いのだが、いまいちどれを使うべきかで混乱するな。urllib2を使えばヘッダを自由にいじれるようだけど、それならhttplibでごそごそやったほうが直感的ではある。