gpt4 book ai didi

python - 如何以正确的格式将抓取的数据导出到 csv 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:09 25 4
gpt4 key购买 nike

我根据 this 改进了我的代码来自@paultrmbrth 的建议。我需要的是从类似于 this 的页面中抓取数据和 this一个,我希望 csv 输出如下图所示。 enter image description here

但是我的代码的 csv 输出有点乱,像这样: enter image description here

我有两个问题,csv 输出是否可以像第一张图片一样?我的第二个问题是,我也想删除电影标题,请给我提示或提供一个代码,我可以用它来删除电影标题和内容。

更新
Tarun Lalwani 完美解决了这个问题。但是现在,csv 文件的标题只包含第一个抓取的 url 类别。例如,当我尝试抓取 this webpage 时其中有 References、Referenced in、Features、Featured in 和 Spoofed in 类别和 this webpage其中有 Follows, Followed by, Edited from, Edited into, Spin-off, References, Referenced in, Features, Featured in, Spoofs and Spoofed in 类别然后 csv 输出文件头将只包含第一个网页的类别,即 References、Referenced in、Features、Featured in 和 Spoofed in,因此第二个网页中的一些类别,如 Follows、Followed by、Edited from、Edited into 和 Spoofs 将不在输出的 csv 文件头上,它的内容也是如此。
这是我使用的代码:

import scrapy


class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["imdb.com"]
start_urls = (
'http://www.imdb.com/title/tt0093777/trivia?tab=mc&ref_=tt_trv_cnn',
'http://www.imdb.com/title/tt0096874/trivia?tab=mc&ref_=tt_trv_cnn',
)

def parse(self, response):
item = {}
for cnt, h4 in enumerate(response.css('div.list > h4.li_group'), start=1):
item['Title'] = response.css("h3[itemprop='name'] a::text").extract_first()
key = h4.xpath('normalize-space()').get().strip()
if key in ['Follows', 'Followed by', 'Edited into', 'Spun-off from', 'Spin-off', 'Referenced in',
'Featured in', 'Spoofed in', 'References', 'Spoofs', 'Version of', 'Remade as', 'Edited from',
'Features']:
values = h4.xpath('following-sibling::div[count(preceding-sibling::h4)=$cnt]', cnt=cnt).xpath(
'string(.//a)').getall(),
item[key] = values
yield item

这里是 exporters.py 文件:

try:
from itertools import zip_longest as zip_longest
except:
from itertools import izip_longest as zip_longest
from scrapy.exporters import CsvItemExporter
from scrapy.conf import settings


class NewLineRowCsvItemExporter(CsvItemExporter):

def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs):
super(NewLineRowCsvItemExporter, self).__init__(file, include_headers_line, join_multivalued, **kwargs)

def export_item(self, item):
if self._headers_not_written:
self._headers_not_written = False
self._write_headers_and_set_fields_to_export(item)

fields = self._get_serialized_fields(item, default_value='',
include_empty=True)
values = list(self._build_row(x for _, x in fields))

values = [
(val[0] if len(val) == 1 and type(val[0]) in (list, tuple) else val)
if type(val) in (list, tuple)
else (val, )
for val in values]

multi_row = zip_longest(*values, fillvalue='')

for row in multi_row:
self.csv_writer.writerow([unicode(s).encode("utf-8") for s in row])

我想要实现的是我希望所有这些类别都在 csv 输出标题上。

'Follows', 'Followed by', 'Edited into', 'Spun-off from', 'Spin-off', 'Referenced in',
'Featured in', 'Spoofed in', 'References', 'Spoofs', 'Version of', 'Remade as', 'Edited from', 'Features'

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用下面的方法提取标题

item = {}
item['Title'] = response.css("h3[itemprop='name'] a::text").extract_first()

对于 CSV 部分,您需要创建一个 FeedExports,它可以将每一行拆分为多行

from itertools import zip_longest
from scrapy.contrib.exporter import CsvItemExporter


class NewLineRowCsvItemExporter(CsvItemExporter):

def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs):
super(NewLineRowCsvItemExporter, self).__init__(file, include_headers_line, join_multivalued, **kwargs)

def export_item(self, item):
if self._headers_not_written:
self._headers_not_written = False
self._write_headers_and_set_fields_to_export(item)

fields = self._get_serialized_fields(item, default_value='',
include_empty=True)
values = list(self._build_row(x for _, x in fields))

values = [
(val[0] if len(val) == 1 and type(val[0]) in (list, tuple) else val)
if type(val) in (list, tuple)
else (val, )
for val in values]

multi_row = zip_longest(*values, fillvalue='')

for row in multi_row:
self.csv_writer.writerow(row)

然后您需要在您的设置中分配 feed exporter

FEED_EXPORTERS = {
'csv': '<yourproject>.exporters.NewLineRowCsvItemExporter',
}

假设您将代码放在 exporters.py 文件中。输出将如您所愿

Exported Data

编辑-1

要设置字段及其顺序,您需要在 settings.py 中定义 FEED_EXPORT_FIELDS

FEED_EXPORT_FIELDS = ['Title', 'Follows', 'Followed by', 'Edited into', 'Spun-off from', 'Spin-off', 'Referenced in',
'Featured in', 'Spoofed in', 'References', 'Spoofs', 'Version of', 'Remade as', 'Edited from',
'Features']

https://doc.scrapy.org/en/latest/topics/feed-exports.html#std:setting-FEED_EXPORT_FIELDS

关于python - 如何以正确的格式将抓取的数据导出到 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com