2011-02-04 13 views
4

私はウェブスクレイピングには新しく、ちょうどScrapy、Pythonで書かれたスクレイピングフレームワークを試し始めました。私の目標は、メッセージアーカイブを取得するためのAPIやその他の手段を提供していないため、古いYahooグループを掻き集めることです。 Yahooグループは、アーカイブを表示する前にログインする必要があるように設定されています。ヤフーグループを掻き集めるための治療を使用している問題

私は、私が思うに、達成するために必要な手順は次のとおりです。ヤフーへ

  1. ログイン
  2. ログインURLの最初のメッセージのために、それ
  3. を繰り返し、次のメッセージのためのステップ2、などこすり

私は上記を達成するためにスパイシースパイダーを荒削りし始めました。これまで私がこれまで行ってきたことはここにあります。私が観察したいのは、ログインが機能し、最初のメッセージを取得できることだけです。私もクモを実行すると

class Sg101Spider(BaseSpider): 
    name = "sg101" 
    msg_id = 1    # current message to retrieve 
    max_msg_id = 21399  # last message to retrieve 

    def start_requests(self): 
     return [FormRequest(LOGIN_URL, 
      formdata={'login': LOGIN, 'passwd': PASSWORD}, 
      callback=self.logged_in)] 

    def logged_in(self, response): 
     if response.url == 'http://my.yahoo.com': 
      self.log("Successfully logged in. Now requesting 1st message.") 
      return Request(MSG_URL % self.msg_id, callback=self.parse_msg, 
        errback=self.error) 
     else: 
      self.log("Login failed.") 

    def parse_msg(self, response): 
     self.log("Got message!") 
     print response.body 

    def error(self, failure): 
     self.log("I haz an error") 

が、私はそれがログインして、最初のメッセージのための要求を発行参照:私はこれだけの作業を得れば、私は残りの部分を終了します。しかし、私がscrapyのデバッグ出力に表示するのは、3つのリダイレクトであり、最終的に私が最初に要求したURLに到着します。しかし、治療は私のparse_msg()コールバックを呼び出さず、クロールは停止します。ここには、治療出力のスニペットがあります:

2011-02-03 19:50:10-0600 [sg101] INFO: Spider opened 
2011-02-03 19:50:10-0600 [sg101] DEBUG: Redirecting (302) to <GET https://login.yahoo.com/config/verify?.done=http%3a//my.yahoo.com> from <POST https://login.yahoo.com/config/login> 
2011-02-03 19:50:10-0600 [sg101] DEBUG: Redirecting (meta refresh) to <GET http://my.yahoo.com> from <GET https://login.yahoo.com/config/verify?.done=http%3a//my.yahoo.com> 
2011-02-03 19:50:12-0600 [sg101] DEBUG: Crawled (200) <GET http://my.yahoo.com> (referer: None) 
2011-02-03 19:50:12-0600 [sg101] DEBUG: Successfully logged in. Now requesting 1st message. 
2011-02-03 19:50:12-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?done=http%3A%2F%2Flaunch.groups.yahoo.com%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/message/1> 
2011-02-03 19:50:12-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?check=G&done=http%3A%2F%2Flaunch%2Egroups%2Eyahoo%2Ecom%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?done=http%3A%2F%2Flaunch.groups.yahoo.com%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> 
2011-02-03 19:50:13-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/message/1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?check=G&done=http%3A%2F%2Flaunch%2Egroups%2Eyahoo%2Ecom%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> 
2011-02-03 19:50:13-0600 [sg101] INFO: Closing spider (finished) 
2011-02-03 19:50:13-0600 [sg101] INFO: Spider closed (finished) 

私はこれを理解できません。 Yahooがスパイダーをリダイレクトしているようです(認証チェックのためかもしれません)が、私が最初に訪れたかったURLに戻ってきているようです。しかし、治療は私のコールバックを呼び出さないし、私はデータを掻き集める機会やクロールを続ける機会を得ることはありません。

何が起こっているのか、さらにどのようにこれをデバッグするのかについてのアイデアはありますか?ありがとう!

答えて

5

私はYahooが承認確認のためにリダイレクトしていると思うし、最終的に私が実際に手に入れたいページにリダイレクトされます。しかし、Scrapyはすでにこの要求を見ており、ループに入りたくないので停止します。私の場合、解決策は、dont_filter=TrueをRequestコンストラクタに追加することです。これは、重複要求をフィルタリングしないようにScrapyに指示します。私がクロールしたいURLを事前に知っているので、これは私の場合は問題ありません。

def logged_in(self, response): 
    if response.url == 'http://my.yahoo.com': 
     self.log("Successfully logged in. Now requesting message page.", 
       level=log.INFO) 
     return Request(MSG_URL % self.msg_id, callback=self.parse_msg, 
       errback=self.error, dont_filter=True) 
    else: 
     self.log("Login failed.", level=log.CRITICAL) 
関連する問題