2011-02-04 1 views
4

Я новичок в веб-соскабливании и только что начал экспериментировать с , скребковой структурой, написанной на Python. Моя цель - очистить старую группу Yahoo, поскольку они не предоставляют API или другие средства для извлечения архивов сообщений. Группа Yahoo настроена так, что вам нужно войти в систему, прежде чем вы сможете просматривать архивы.Проблема с использованием scrapy для очистки группы yahoo

шаги мне нужно выполнить, я думаю, являются:

  1. Вход в Yahoo
  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, который я попросил в первую очередь. Но scrapy не вызывает мой обратный вызов 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-адресу, который я хотел посетить, в первую очередь. Но scrapy не вызывает мой обратный вызов, и у меня нет возможности очистить данные или продолжить сканирование.

Есть ли у кого-нибудь идеи о том, что происходит и/или как отлаживать это дальше? Благодаря!

ответ

5

Я думаю, что Yahoo перенаправляет проверку авторизации, и, наконец, перенаправляет меня обратно на страницу, которую я действительно хотел получить. Тем не менее Scrapy уже видел этот запрос и останавливается, потому что он не хочет попасть в цикл. Решение, в моем случае, должно добавить dont_filter=True в конструктор запроса. Это даст указание 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) 
Смежные вопросы