Scrapy parse_item函数未触发及批量保存数据问题求助
问题解答
问题1:调用parse_item无输出的解决办法
直接调用self.parse_item()仅创建了生成器对象,但Scrapy无法捕获其中yield的内容。必须通过yield from委托生成器,或遍历生成器逐个yield,才能让Scrapy接收数据。
修改代码关键点
- 替换
parse_result中的循环逻辑:
for index, item in enumerate(items_list): # 用yield from传递parse_item生成器的所有结果 yield from self.parse_item(item, index + 1, url)
- 修正下一页获取的语法错误(原代码少了括号,导致
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') }
逻辑说明
- 初始请求时在
meta中注入空列表all_items,用于存储当前URL的所有爬取结果。 - 每次解析页面时,将当前页的item通过
parse_item格式化后,追加到all_items。 - 请求下一页时,将更新后的
all_items通过meta传递给下一个请求,实现数据累加。 - 当无下一页时,统一输出包含源URL、总条数和完整数据列表的结果。
内容的提问来源于stack exchange,提问作者Ktrel
相关产品推荐
相关产品推荐

