python - Scrapy 将动态项目导出到 csv
问题描述
我有蜘蛛可以像这样抓取一些动态字段:
class exhibitors_spider(scrapy.Spider):
name = "exhibitors"
url = "some url"
def _create_item_class(self, class_name, field_list):
field_dict = {}
for field_name in field_list:
field_dict[field_name] = Field()
return type(str(class_name), (DictItem,), {'fields': field_dict})
def start_requests(self):
yield Request(url=self.url, callback=self.parse_page, dont_filter=True)
def parse_page(self, response):
Contact_Persons = {}
Contact_Persons_blocks = response.selector.xpath("//h2[contains(text(),'Contact person')]/..//..//div/.//li")
if Contact_Persons_blocks:
for i in xrange(1, len(Contact_Persons_blocks) + 1):
cp_name = Contact_Persons_blocks[i - 1].xpath(".//a[@itemprop='name']/bdi/text()").extract_first()
if cp_name:
cp_name = capwords(cp_name.encode('utf-8'))
else:
cp_name = 0
Contact_Persons.update({"Contact_Person_Name_{}".format(i): cp_name})
cp_title = Contact_Persons_blocks[i - 1].xpath(".//div[@itemprop='jobTitle']/text()").extract_first()
if cp_title:
cp_title = capwords(cp_title.encode('utf-8'))
else:
cp_title = 0
Contact_Persons.update({"Contact_Person_Title_{}".format(i): cp_title})
cp_link = Contact_Persons_blocks[i - 1].xpath(".//a[@class='ngn-mail-link']/@href").extract_first()
if cp_link:
cp_link = self.domain + cp_link
else:
cp_link = 0
Contact_Persons.update({"Contact_Person_Link{}".format(i): cp_link})
ExhibitorsItem = self._create_item_class('ExhibitorsItem', Contact_Persons.keys())
for cp_key in Contact_Persons.keys():
item[cp_key] = Contact_Persons[cp_key]
yield item
但是我事先不知道我会有多少项目,而且每一页都有不同数量的项目。当我导出到 CSV 时,看起来 Scrapy 创建了一个包含第一项密钥的文件。我的意思是,它写入所有值,但是如果例如第一个项目有 1 个键,那么我们在 CSV 中将只有一个键,如果剩余的项目有更多键,它们将按错误的顺序排列。如何让 Scrapy 从键数最多的项目创建 CSV 文件?
解决方案
推荐阅读
- amazon-web-services - 具有无服务器框架 EC2 部署的 AWS
- java - 从 apache 网络服务器接收数据
- python - 当我们不指定validation_split 或验证集时,keras 计算准确性和损失是什么?
- javascript - 如何获取 document.getElementById 的结果
- wordpress - 参数必须是数组或对象 metaboxes-framework/init.php
- android - Recyclerview notifyDataSetChanged 两次停止分页
- c# - 标准化负值的正确方法是什么?
- reactjs - 如何在调用 redux 操作后立即更新组件中的 props?
- go - MapScan 无法解组为非指针 int64
- javascript - 使用 Angular 在 Chrome 67 中 HTML5 视频不会自动播放(即使静音时)