Python中如何在Scrapy的parse函数中获取另一个Request的返回结果

现在需求是这样的,我有一个 parse 去解析页面,我要算一个商品的总价格,但是,商品的某一个属性的价格呢,我不能确定,需要依靠另一个 Request 去跑一个页面。关键就是在我跑另一个 request,怎么把数据告诉 parse 方法。别说什么 callback,这个我当然知道!肯定不能用 callback 去解决吧!下面上代码:

    def parse(self, response):
       #计算商品价格......

       ......
       
       yield scrapy.Request(url, callback=self.parseNext)

def parseNext(self, response):

       #扒页面的相关数据

       .......拿到具体价格

       这儿怎么把数据返回到 parse 方法中去,我好计算价格,总不能用 return 吧!


Python中如何在Scrapy的parse函数中获取另一个Request的返回结果

13 回复

加入 meta
yield scrapy.Request(url, callback=self.parseNext, meta={‘price’: ‘99’})

parseNext 中
price = response.price[‘index’] #99


在Scrapy里,要在parse函数里拿到另一个Request的返回结果,你得用yield发起请求,并通过callback参数指定处理响应的函数。这个处理函数会接收到Response对象,里面就有你要的数据。

下面是个具体例子。假设我们想先爬取一个列表页,再从每个列表项里抓取详情页的数据:

import scrapy

class MySpider(scrapy.Spider):
    name = 'example_spider'
    start_urls = ['http://example.com/list']

    def parse(self, response):
        # 假设列表页中每个条目有一个链接
        item_links = response.css('div.item a::attr(href)').getall()
        for link in item_links:
            # 构建绝对URL
            absolute_url = response.urljoin(link)
            # 发起新的Request,并指定callback为处理详情页的函数
            yield scrapy.Request(absolute_url, callback=self.parse_item_details)

    def parse_item_details(self, response):
        # 这个函数处理详情页的Response
        # 在这里提取你需要的数据
        item_name = response.css('h1.title::text').get()
        item_price = response.css('span.price::text').get()

        # 返回或处理数据
        yield {
            'name': item_name,
            'price': item_price,
            'url': response.url
        }

关键点:

  1. yield scrapy.Request(...): 在parse里用yield来发起新请求,Scrapy的调度器会接管它。
  2. callback=self.parse_item_details: 这个参数告诉Scrapy,等这个请求完成后,用parse_item_details这个方法来处理响应。parse_item_details方法会接收到一个全新的Response对象,对应那个详情页。
  3. 数据传递: 如果你想从parse传一些数据给parse_item_details,可以用Requestmeta参数:
    yield scrapy.Request(absolute_url,
                         callback=self.parse_item_details,
                         meta={'page_number': page_num})
    
    然后在parse_item_details里用response.meta['page_number']就能取到。

简单说,就是yield一个带callbackRequest,数据在回调函数里拿。

你这个是 parse 往 parseNext 中传值,我需要的是 parseNext 往 parse 中传值

抓取和业务逻辑为啥要耦合这么紧呢,都抓完存下来想怎么算都行啊

原来有 meta 这东西, 可以不用闭包了.

额 您这也是一条思路

。。。。。。

def parse
xxx
xxxx
run parse next
calculate price
return price

def parsenext
xxx
xxxx
.return xxxxx

这样不行吗?

顺序执行,在 parse next 里计算价格啊,

很朴实的逻辑

兄弟 你可知道 scrapy 的执行流程,能这样 我早就写完了

meta 把数据带着

我不知道流程是啥! 我就想说,处理数据放在 Item,单定义一个 item, 得到某个属性的字段,到 Pipeline 再去算总价。如果不合心意,就先记录下来,一一对应, 最后另作处理。

你可以把 parse 的 response 通过 meta 传递到 parseNext 中进行处理。

回到顶部