パスワードを忘れた? アカウント作成
68655 journal

hylomの日記: Botで/.Jにログインさせようとすると…… 3

日記 by hylom

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

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 日本人には馴染みの薄いネタですねえ。

    --
    署名スパムがウザい?アカウント作って非表示に設定すればスッキリさ。
  • by elderwand (34630) on 2009年03月06日 21時19分 (#1526351) 日記

    Perl が先行らしいけど、Mechanize [sourceforge.net]がお薦めですよ。

  • by Anonymous Coward on 2009年03月06日 21時39分 (#1526364)

    このモジュールでは HTTP および HTTPS プロトコルのクライアント側を実装しているクラスを定義しています。通常、このモジュールは直接使いません -- urllib モジュールが HTTP や HTTPS を使った URL を扱う上でこのモジュールを使います。 注意: HTTPS のサポートは、SSL をサポートするように socket モジュールをコンパイルした場合にのみ利用できます。

    「決まりは破り時が重要」がPython流なので、「せっかくだから俺はこのhttplibを選ぶぜ!」という判断もアリですが、
    悩んだら推奨に乗るのが吉かと。

typodupeerror

開いた括弧は必ず閉じる -- あるプログラマー

読み込み中...