5

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

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

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

4

1 回答 1

9

从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

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

于 2012-06-21T10:36:53.340 回答