我正在爬网一个网站(只有两个级别),我想从两个级别的网站上抓取信息。我遇到的问题是,我想用两个级别的信息来填写一项的字段。我该怎么做?
我以为有一个项目列表作为实例变量可以被所有线程访问(因为它是Spider的相同实例),并且parse_1将填写一些字段,而parse_2将必须检查正确的密钥在填写相应的值之前。该方法似乎很麻烦,我仍然不确定如何使它起作用。
我在想的是,必须有更好的方法,也许以某种方式将项目传递给回调。我不知道如何使用Request()方法做到这一点。想法?
从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请求的整个项目,并将所有信息都包含在一个项目中。
如果涉及基础蜘蛛并且问题与爬网蜘蛛有关,为什么这个答案被接受?