理解Scrapy中的回调

Par*_*rag 11 python callback scrapy

我是Python和Scrapy的新手.我之前没有使用过回调函数.但是,我现在为下面的代码做.将执行第一个请求,并将其响应发送到定义为第二个参数的回调函数:

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
Run Code Online (Sandbox Code Playgroud)

我无法理解以下事项:

  1. item人口如何?
  2. 是否request.meta行之前执行response.meta的线parse_page2
  3. 在哪里回来itemparse_page2打算?
  4. return request声明需要什么parse_page1?我认为提取的项目需要从这里返回.

war*_*iuc 16

阅读文档:

对于蜘蛛,刮擦周期经历如下:

  1. 首先生成初始请求以爬网第一个URL,并指定要使用从这些请求下载的响应调用的回调函数.

    第一个执行请求是通过调用 start_requests()(默认情况下)Request为方法中指定的URL start_urlsparse方法生成请求的回调函数的方法获得的.

  2. 在回调函数中,您解析响应(网页)并返回Item对象,Request对象或两者的可迭代.这些请求还将包含一个回调(可能相同),然后由Scrapy下载,然后由指定的回调处理它们的响应.

  3. 在回调函数中,您通常使用选择器解析页面内容(但您也可以使用BeautifulSoup,lxml或您喜欢的任何机制)并使用解析的数据生成项目.

  4. 最后,从蜘蛛返回的项目通常会持久保存到数据库(在某些项目管道中)或使用Feed导出写入文件.

回答:

该如何'item'填写是否request.meta行之前执行response.metaparse_page2

蜘蛛由Scrapy引擎管理.它首先从指定的URL发出请求start_urls,并将它们传递给下载程序.下载完成后,将调用请求中指定的回调.如果回调返回另一个请求,则重复相同的操作.如果回调返回a Item,则将项目传递给管道以保存已删除的数据.

返回的物品parse_page2去哪儿了?

return request陈述的必要性是parse_page1什么?我以为提取的物品需要从这里退回?

如文档中所述,每个回调(both parse_page1parse_page2)都可以返回a RequestItem(或者它们的可迭代).parse_page1返回a Request而不是Item,因为需要从其他URL中删除其他信息.第二个回调parse_page2返回一个项目,因为所有信息都被抓取并准备好传递给管道.