scrapy - 自定义项目管道中多个文件的 CsvItemExporter 不导出所有项目
问题描述
我创建了一个项目管道作为这个问题的答案。
它应该根据page_no
项目中设置的值为每个页面创建一个新文件。这工作得很好。
问题在于管道/项目导出器生成的最后一个 csv 文件,page-10.csv
.
最后 10 个值未导出,因此文件保持为空。这种行为的原因可能是什么?
管道.py
from scrapy.exporters import CsvItemExporter
class PerFilenameExportPipeline:
"""Distribute items across multiple CSV files according to their 'page_no' field"""
def open_spider(self, spider):
self.filename_to_exporter = {}
def spider_closed(self, spider):
for exporter in self.filename_to_exporter.values():
exporter.finish_exporting()
def _exporter_for_item(self, item):
filename = 'page-' + str(item['page_no'])
del item['page_no']
if filename not in self.filename_to_exporter:
f = open(f'{filename}.csv', 'wb')
exporter = CsvItemExporter(f, export_empty_fields=True)
exporter.start_exporting()
self.filename_to_exporter[filename] = exporter
return self.filename_to_exporter[filename]
def process_item(self, item, spider):
exporter = self._exporter_for_item(item)
exporter.export_item(item)
return item
蜘蛛
import scrapy
from ..pipelines import PerFilenameExportPipeline
class spidey(scrapy.Spider):
name = "idk"
custom_settings = {
'ITEM_PIPELINES': {
PerFilenameExportPipeline: 100
}
}
def start_requests(self):
yield scrapy.Request("http://quotes.toscrape.com/", cb_kwargs={'page_no': 1})
def parse(self, response, page_no):
for qts in response.xpath("//*[@class=\"quote\"]"):
yield {
'page_no': page_no,
'author' : qts.xpath("./span[2]/small/text()").get(),
'quote' : qts.xpath("./*[@class=\"text\"]/text()").get()
}
next_pg = response.xpath('//li[@class="next"]/a/@href').get()
if next_pg is not None:
yield response.follow(next_pg, cb_kwargs={'page_no': page_no + 1})
解决方案
推荐阅读
- javascript - .cshtml 上的表中的值在使用 ajax 发布后未更新
- .net - DotNet 似乎允许两个进程打开同一个端口?
- c++ - boost-python 纯虚拟检测缺失的实现
- php - 如何修复 Curl 中的连接拒绝错误
- javascript - 如何在 JavaScript 中克隆 Select 元素的选项集合
- php - 如何从 Laravel 中的两个相关表中获取所有数据 [一对多]
- angular - 在 Ionic 3 中创建组件时出现问题
- r - data.table 等效于 tidyr::complete 与 group_by 与 on 和 by 语法
- javascript - 如何通过数组合并映射每个结果都相同[lodash]
- amazon-web-services - 当我使用自定义 AMI 时,AWS EMR 预置失败