【问题标题】:Scrapy - remove duplicates and output data as a single list?Scrapy - 删除重复项并将数据作为单个列表输出?
【发布时间】:2017-07-11 23:41:08
【问题描述】:

我正在使用下面的代码来爬取页面上的多个链接,并从每个相应的链接中获取数据列表:

import scrapy

class testSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ['http://www.website.com']

    def parse(self, response):
        urls = response.css('div.subject_wrapper > a::attr(href)').extract()
        for url in urls:
            url = response.urljoin(url)
            yield scrapy.Request(url=url, callback=self.getData)

    def getData(self, response):
        data = {'data': response.css('strong.data::text').extract()}
        yield data

它工作正常,但由于它为每个链接返回一个数据列表,当我输出到 CSV 时,它看起来如下所示:

"dalegribel,Chad,Ninoovcov,dalegribel,Gotenks,sillydog22"

"kaylachic,jmargerum,kaylachic"

"Kempodancer,doctordbrew,Gotenks,dalegribel"

"Gotenks,dalegribel,jmargerum"

...

是否有任何简单/有效的方法将数据输出为单个行列表而没有任何重复(相同的数据可以出现在多个页面上),类似于以下?

dalegribel
Chad
Ninoovcov
Gotenks
...

我尝试使用数组然后循环遍历每个元素以获取输出,但收到错误消息,提示 yield 仅支持“Request、BaseItem、dict 或 None”。此外,由于我将在大约 10k 个条目上运行它,我不确定将数据存储在数组中是否会大大减慢抓取速度。谢谢。

【问题讨论】:

    标签: python scrapy scrapy-spider


    【解决方案1】:

    不确定是否可以使用 Scrapy 内置方法以某种方式完成,但 python 方法是创建一组唯一元素,检查重复项,并仅生成唯一元素:

    class testSpider(scrapy.Spider):
        name = "quotes"
        start_urls = ['http://www.website.com']
        unique_data = set()
    
        def parse(self, response):
            urls = response.css('div.subject_wrapper > a::attr(href)').extract()
            for url in urls:
                url = response.urljoin(url)
                yield scrapy.Request(url=url, callback=self.getData)
    
        def getData(self, response):
            data_list = response.css('strong.data::text').extract()
            for elem in data_list:
                if elem and (elem not in self.unique_data):
                    self.unique_data.add(elem)
                    yield {'data': elem}
    

    【讨论】:

    • 谢谢,我收到一条错误消息,指出列表属性不支持split - 所以删除此功能后它似乎工作正常,因为循环似乎负责拆分。然而,似乎仍在发生的一件事是导出到 CSV 时每行之间的间隙(与上面第二个代码块中所示的相同)。有没有办法解决这个问题,所以没有空行?谢谢。
    • @ExamOrph 数据如何输出到 CSV?按功能还是什么?
    • 命令行函数:scrapy crawl quotes -o test.csv -t csv
    • @ExamOrph 似乎正在向文件中添加空元素。也许我们需要检查elem 是否为空。是的,我刚刚检查了 Scrapy 文档。 .extract() 为我们做.split()。试试我更新的代码。
    • @ExamOrph 集合旨在存储唯一值,实际上,10k 并不多。如果 python 不使用这个内存,那么 Exel 会。如果您不在木制 PC 上运行脚本,我认为您不会遇到任何问题。也看看stackoverflow.com/questions/14577790/…
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2010-11-22
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多