【问题标题】:Scrapy CrawlSpider: how to access item across different levels of parsingScrapy CrawlSpider:如何跨不同级别的解析访问项目
【发布时间】:2012-06-23 02:57:27
【问题描述】:

我正在抓取一个网站(只有两个级别的深度),我想从两个级别的网站上抓取信息。我遇到的问题是我想用两个级别的信息填写一个项目的字段。我该怎么做?

我正在考虑将项目列表作为实例变量,所有线程都可以访问(因为它是蜘蛛的同一个实例),并且 parse_1 将填写一些字段,而 parse_2 将必须检查正确的填写相应值之前的key。这种方法看起来很繁琐,我仍然不知道如何使它起作用。

我在想一定有更好的方法,也许以某种方式将一个项目传递给回调。不过,我不知道如何使用 Request() 方法来做到这一点。想法?

【问题讨论】:

    标签: python web-scraping scrapy web-crawler multi-level


    【解决方案1】:

    来自scrapy文档:

    在某些情况下,您可能有兴趣将参数传递给这些回调函数,以便稍后在第二个回调中接收参数。您可以为此使用 Request.meta 属性。

    下面是一个示例,说明如何使用此机制传递项目,以填充来自不同页面的不同字段:

    def parse_page1(self, response):
        item = MyItem()
        item['main_url'] = response.url
        request = Request("http://www.example.com/some_page.html",
                          callback=self.parse_page2)
        request.meta['item'] = item
        return request
    
    def parse_page2(self, response):
        item = response.meta['item']
        item['other_url'] = response.url
        return item
    

    所以,基本上你可以抓取第一页并将所有信息存储在 item 中,然后发送整个 item 并请求第二级 url,并将所有信息放在一个 item 中。

    【讨论】:

    • 我曾经通过在 URL 中粘贴信息来做到这一点。这种方式似乎更好,特别是对于在 URL 中编码不好的项目。谢谢!
    • 如果我有两个页面 - 第 2 页和第 3 页 - 也有部分信息要填写,我如何在两个不同的 scrapy.Requests 中按顺序调用它们?我可以将“元”中的半填充项目传递给两者,但我想确保最终的“项目”具有来自第 1 页 + 第 2 页 + 第 3 页的数据 - 全部在一起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多