【问题标题】:scrapy: understanding how do items and requests work between callbacksscrapy:了解项目和请求如何在回调之间工作
【发布时间】:2016-02-08 22:03:21
【问题描述】:

我在 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
    request = scrapy.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

我正在逐步了解那里的操作流程:

[parse_page1]

  1. item = MyItem()
  2. item['main_url'] = response.url
  3. request = scrapy.Request("http://www.example.com/some_page.html", callback=self.parse_page2)

[parse_page2]

  1. item = response.meta['item']
  2. item['other_url'] = response.url
  3. return item

[parse_page1]

  1. request.meta['item'] = item
  2. return request

我浏览了有关 scrapy 和 request/response/meta 的所有文档,但我仍然不明白第 4 点和第 7 点发生了什么。

【问题讨论】:

标签: python scrapy


【解决方案1】:

@eLRuLL 的回答很棒。我想添加项目转换的部分。首先,我们要清楚,回调函数只在这个请求的响应被加载之前才起作用。

在scrapy.doc给出的代码中,它没有声明page1的url和请求。让我们将page1的url设置为“http://www.example.com.html”。

[parse_page1] 是

的回调
scrapy.Request("http://www.example.com.html",callback=parse_page1)`

[parse_page2] 是

的回调
scrapy.Request("http://www.example.com/some_page.html",callback=parse_page2)

page1的response被下载后,调用parse_page1生成page2的请求:

item['main_url'] = response.url # send "http://www.example.com.html" to item
request = scrapy.Request("http://www.example.com/some_page.html",
                         callback=self.parse_page2)
request.meta['item'] = item  # store item in request.meta

page2的response下载完成后,调用parse_page2返回一个item:

item = response.meta['item'] #response.meta is equal to request.meta,so here item['main_url'] ="http://www.example.com.html".

item['other_url'] = response.url # response.url ="http://www.example.com/some_page.html"

return item #finally,we get the item recordind  urls of page1 and page2.

【讨论】:

    【解决方案2】:
    line 4: request = scrapy.Request("http://www.example.com/some_page.html",
                             callback=self.parse_page2)
    line 5: request.meta['item'] = item
    line 6: return request
    

    你对前面的代码一头雾水,我解释一下(这里我列举解释一下):

      1234563 p>
    1. 您正在向第 5 行的 scrapy.Request 对象添加参数,因此例如您还可以声明 scrapy.Request 对象,如下所示:

      request = scrapy.Request("http://www.example.com/some_page.html", 
              callback=self.parse_page2, meta={'item': item})`
      

      你可以避开第 5 行。

    2. 当你调用scrapy.Request对象时在第6行,当scrapy使它工作时,比如调用指定的url,转到下面的回调,并传递meta,你可以有如果您像这样调用请求,也可以避免第 6 行(和第 5 行):

      return scrapy.Request("http://www.example.com/some_page.html", 
              callback=self.parse_page2, meta={'item': item})`
      

    所以这里的想法是你的回调方法应该return(最好是yield)一个Request或者和Item,scrapy会输出Item并继续爬取Request

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2014-05-04
      • 1970-01-01
      • 2012-12-04
      • 2015-02-25
      相关资源
      最近更新 更多