python - 使用 scrapy 抓取雅虎组的问题

标签 python screen-scraping yahoo scrapy

我是网络抓取的新手,刚开始尝试 Scrapy ,一个用 Python 编写的抓取框架。我的目标是抓取旧的 Yahoo Group,因为它们不提供 API 或任何其他方式来检索消息存档。 Yahoo Group 设置为您必须先登录才能查看文件。

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

  1. 登录雅虎
  2. 访问第一条消息的 URL 并抓取它
  3. 对下一条消息等重复步骤 2

我开始粗略地制作一个 scrapy 蜘蛛来完成上述任务,这是我目前所拥有的。我想观察的是登录有效并且我能够检索第一条消息。一旦我完成了这么多工作,我就会完成剩下的工作:

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() 回调,并且爬行停止了。这是 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)

我无法理解这一点。看起来 Yahoo 正在重定向蜘蛛程序(可能是为了进行身份验证?),但它似乎回到了我最初想要访问的 URL。但是 scrapy 没有调用我的回调,我没有机会抓取数据或继续抓取。

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

最佳答案

我认为 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)

关于python - 使用 scrapy 抓取雅虎组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893897/

相关文章:

api - 简单的雅虎天气 Api 不工作

python - 类型错误 : 'numpy.float64' object is not callable

python - 没有为第二个单元测试定义全局名称

python - 在 Python 中读取目录的安全方法

html - 使用 Ruby 中的 Nokogiri 抓取特定标题

java - Java 中的 Yahoo OAuth 库?

java - oauth_problem=consumer_key_rejected 使用 Scribe 库

python - 在 pandas DataFrame 中创建具有特定值的列

python - 从python中的大量数据中提取任何看起来像链接的东西

parsing - 大规模抓取/解析的技术是什么?