You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy parse_item函数未触发及批量保存数据问题求助

问题解答

问题1:调用parse_item无输出的解决办法

直接调用self.parse_item()仅创建了生成器对象,但Scrapy无法捕获其中yield的内容。必须通过yield from委托生成器,或遍历生成器逐个yield,才能让Scrapy接收数据。

修改代码关键点

  1. 替换parse_result中的循环逻辑:
for index, item in enumerate(items_list):
    # 用yield from传递parse_item生成器的所有结果
    yield from self.parse_item(item, index + 1, url)
  1. 修正下一页获取的语法错误(原代码少了括号,导致next_page为方法对象而非实际链接):
next_page = response.css('li.next a::attr(href)').get()

问题2:单个URL爬取数据存入列表后传递

通过请求的meta字段维护一个累加列表,每次爬取页面时将当前页数据存入列表,直到无下一页时,统一输出整个URL的完整数据列表。

修改后的完整代码

import scrapy
import json


class MySpider(scrapy.Spider):
    name = "myspider"

    def start_requests(self):
        urls = [
            'https://www.lin1.com',
            'https://www.link2.com'
        ]
        for url in urls:
            # 初始化meta,添加空列表存储当前URL的所有数据
            yield scrapy.Request(url=url, callback=self.parse_result, meta={'url': url, 'all_items': []})

    def parse_result(self, response):
        url = response.meta['url']
        all_items = response.meta['all_items']  # 获取累加列表
        tag = response.xpath('//xxxxxxx/text()').get()
        
        if tag is not None:
            jsonData = json.loads(tag)
            items_list = jsonData['x']['y']['z']
            for index, item in enumerate(items_list):
                # 调用parse_item获取格式化后的字典,存入列表
                item_dict = self.parse_item(item, index + 1, url)
                all_items.append(item_dict)

        # 请求下一页
        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            # 传递更新后的列表到下一页请求
            yield response.follow(next_page, callback=self.parse_result, meta={'url': url, 'all_items': all_items})
        else:
            # 无下一页时,输出当前URL的完整数据
            yield {
                'source_url': url,
                'total_count': len(all_items),
                'items': all_items
            }

    def parse_item(self, item_data, index, url):
        return {
            'url': url,
            'index': index,
            'title': item_data.get('name'),
            'link': item_data.get('itemUrl'),
            'item_id': item_data.get('itemId'),
            'rating': item_data['rating'].get('averageRating'),
            'price': item_data.get('price')
        }

逻辑说明

  1. 初始请求时在meta中注入空列表all_items,用于存储当前URL的所有爬取结果。
  2. 每次解析页面时,将当前页的item通过parse_item格式化后,追加到all_items。
  3. 请求下一页时,将更新后的all_items通过meta传递给下一个请求,实现数据累加。
  4. 当无下一页时,统一输出包含源URL、总条数和完整数据列表的结果。

内容的提问来源于stack exchange,提问作者Ktrel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:20:26