Python 使用scrapy刮取雅虎群时出现问题

Python 使用scrapy刮取雅虎群时出现问题,python,screen-scraping,yahoo,scrapy,Python,Screen Scraping,Yahoo,Scrapy,我对网页抓取还不熟悉,刚刚开始尝试一个用Python编写的抓取框架。我的目标是清理一个旧的Yahoo组,因为他们不提供API或任何其他方法来检索消息存档。Yahoo组设置为您必须先登录才能查看归档文件 我认为我需要完成的步骤是: 登录雅虎 访问第一条消息的URL并将其删除 对下一条消息重复步骤2,以此类推 我开始制作一只粗糙的蜘蛛来完成上面的工作,这是我到目前为止所做的。我想观察的是,登录工作正常,我能够检索到第一条消息。一旦我完成了这么多工作,我会完成剩下的工作: class Sg101Spi

我对网页抓取还不熟悉,刚刚开始尝试一个用Python编写的抓取框架。我的目标是清理一个旧的Yahoo组,因为他们不提供API或任何其他方法来检索消息存档。Yahoo组设置为您必须先登录才能查看归档文件

我认为我需要完成的步骤是:

  • 登录雅虎
  • 访问第一条消息的URL并将其删除
  • 对下一条消息重复步骤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")
    
    但当我运行spider时,我看到它登录并发出第一条消息的请求。然而,我在scrapy的调试输出中看到的只是3个重定向,最终到达了我最初要求的URL。但是scrapy没有调用my
    parse_msg()
    callback,爬行停止。下面是scrapy输出的一个片段:

    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)
    
    2011-02-03 19:50:10-0600[sg101]信息:蜘蛛网已打开
    2011-02-03 19:50:10-0600[sg101]调试:重定向(302)到
    2011-02-03 19:50:10-0600[sg101]调试:重定向(元刷新)到
    2011-02-03 19:50:12-0600[sg101]调试:爬网(200)(参考:无)
    2011-02-03 19:50:12-0600[sg101]调试:已成功登录。现在请求第一条消息。
    2011-02-03 19:50:12-0600[sg101]调试:重定向(302)到
    2011-02-03 19:50:12-0600[sg101]调试:重定向(302)到
    2011-02-03 19:50:13-0600[sg101]调试:重定向(302)到
    2011-02-03 19:50:13-0600[sg101]信息:关闭卡盘(已完成)
    2011-02-03 19:50:13-0600[sg101]信息:十字轴关闭(已完成)
    
    我无法理解这一点。看起来雅虎正在重定向蜘蛛(可能是为了验证?),但它似乎回到了我最初想要访问的URL。但是scrapy没有给我回电话,我也没有机会抓取数据或继续爬行


    有人对正在发生的事情和/或如何进一步调试有什么想法吗?谢谢

    我认为雅虎正在重定向以进行授权检查,它最终将我重定向回我真正想要的页面。然而,Scrapy已经看到了这个请求,并且停止了,因为它不想进入循环。在我的例子中,解决方案是向请求构造函数添加
    dont\u 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)