python 通过Scrapy以csv格式存储

au9on6nz  于 2022-12-10  发布在  Python
关注(0)|答案(3)|浏览(162)

我正在通过Scrapy学习网页抓取。我一直卡在如下问题上:
为什么CSV文件在一行中打开整个数据?确实它应该有8行和4列。它是可以与列,但我不明白为什么它只在一行中打开数据。

import scrapy

class MyredditSpider(scrapy.Spider):
    name = 'myreddit'
    allowed_domains = ['reddit.com']
    start_urls = ['http://www.reddit.com/']
    #custom_settings = {
   #"FEEDS":{"result.csv":{"format":"csv",}}
  #}

    def parse(self, response):
        all_var=response.xpath("//div[@class='rpBJOHq2PR60pnwJlUyP0']")
        
        for variable in all_var:
            post= variable.xpath("//h3[@class='_eYtD2XCVieq6emjKBH3m']/text()").extract()
            vote= variable.xpath("//div[@class='_1rZYMD_4xY3gRcSS3p8ODO _3a2ZHWaih05DgAOtvu6cIo ']/text()").extract()
            time=variable.xpath("//span[@class='_2VF2J19pUIMSLJFky-7PEI']/text()").extract()
            links= variable.xpath("//a[@data-click-id='body']/@href").extract()
        
       
        

            yield{"Posts": post, "Votes": vote, "Time": time, "Links":links}

我用scrapy crawmyreddit-o items.csv将数据保存在csv中。我想得到CSV,每行中的每个值都是相应的。几乎像在图像中一样

kmynzznz

kmynzznz1#

您的代码看起来不错,并且完全按照预期工作。yield是一个单行术语。每当您在代码中使用yield作为输出时,它都将被视为单行。下面的示例将输出两行。

yield{"Posts": post}
yield {"Votes": vote, "Time": time, "Links":links}
1tuwyuhd

1tuwyuhd2#

这是因为这是你提取信息的方式...
每个extract()调用都是一次提取页面上的所有元素,如果你想让它们一行一行地列出,你也会想一行一行地迭代html元素。
例如,它应该更接近于这样的情况,即它遍历每一行,从每一行中提取信息并产生信息,然后移动到下一行。

import scrapy

class MyredditSpider(scrapy.Spider):
    name = 'myreddit'
    allowed_domains = ['reddit.com']
    start_urls = ['http://www.reddit.com/']

    def parse(self, response):
        for row in response.xpath('//div[@class="rpBJOHq2PR60pnwJlUyP0"]/div'):
            post = row.xpath(".//h3[@class='_eYtD2XCVieq6emjKBH3m']/text()").get()
            vote = row.xpath(".//div[@class='_1rZYMD_4xY3gRcSS3p8ODO _3a2ZHWaih05DgAOtvu6cIo ']/text()").get()
            time = row.xpath(".//span[@class='_2VF2J19pUIMSLJFky-7PEI']/text()").get()
            links = row.xpath(".//a[@data-click-id='body']/@href").get()
            yield {"Posts": post, "Votes": vote, "Time": time, "Links":links}
e0bqpujr

e0bqpujr3#

可能是因为分隔符参数不正确而将整个数据表打开为一个数据表。delimiterdefault参数设置为",",并用逗号分隔数据。
请记住,如果擦除的数据包含逗号,滑动过程将导致出现不需要的列。
在这种情况下,您可以使用"|""\t"之类的字符作为分隔符。
另一方面,问题可能出在lineterminator参数上,该参数指示每行数据应该如何终止。此参数的默认值为"\r\n"
如果您的数据不使用这些字符lineterminators,您可以使用其他字符,如"\n",以确保数据被分隔到不同的行中。
请参见以下示例:

from scrapy.exporters import CSVItemExporter

# Use the "|" as the delimiter and "\n" as the lineterminator
exporter = CSVItemExporter(delimiter="|", lineterminator="\n")

exporter.export_item(item)

相关问题