記事一覧:2009年03月06日

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でごそごそやったほうが直感的ではある。

Permalink | コメントを読む | hylomの日記