我必须抓一些信息在一个页面上的内容,然后在该页面上有一个包含更多信息的链接,然后是第三条信息可用的另一个URL。
如何设置我的回调以便将所有这些信息放在一起?在这种情况下我是否必须使用数据库,还是可以将其导出为CSV?
答案 0 :(得分:1)
首先要说的是你有正确的想法 - 回调是解决方案。我已经看到使用urllib或者类似于fetch依赖页面,但是完全利用Scrapy下载机制比使用来自另一个库的一些同步调用更为可取。
请参阅Scrapy文档中有关此问题的示例: http://doc.scrapy.org/en/latest/topics/request-response.html#passing-additional-data-to-callback-functions
def parse_page1(self, response):
item = MyItem()
item['main_url'] = response.url
# parse response and populate item as required
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']
# parse response and populate item as required
item['other_url'] = response.url
return item
您的第三页数据是从第一页还是第二页链接的页面?
如果从第二页开始,您可以只扩展上面的机制并让parse_page2返回一个带有回调到新parse_page3的请求。
如果从第一页开始,您可以让parse_page1填充request.meta ['link3_url']属性,parse_page2可以从该属性构建后续请求网址。
注意 - 这些“二级”和“三级”网址不应该从正常的抓取过程(start_urls和规则)中发现,而应该从parse_page1 / parse_page2中的响应(使用XPath等)构建。
抓取,回调结构,管道和项目构建都与数据导出无关,因此CSV将适用。