Python Scrapy-删除重复项并将数据作为单个列表输出?

Python Scrapy-删除重复项并将数据作为单个列表输出?,python,scrapy,scrapy-spider,Python,Scrapy,Scrapy Spider,我正在使用以下代码在页面上的多个链接中爬行,并从每个对应链接中获取数据列表: 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)

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

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个条目上运行此操作,我不确定将数据存储在阵列中是否会使刮取速度过慢。谢谢。

不确定是否可以通过使用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}

谢谢,我收到了一个错误消息,说list属性不支持
split
——因此在删除此函数后,它似乎工作正常,因为循环似乎负责分割。然而,有一件事似乎仍在发生,那就是导出到CSV时每行之间的间隙(与上面第二段代码中所示的相同)。有没有办法解决这个问题,这样就没有空行了?谢谢。@ExamOrph数据是如何输出到CSV的?按函数还是按什么?命令行函数:
scrapy crawl quotes-o test.csv-t csv
@ExamOrph似乎正在向文件中添加空元素。也许我们需要检查
elem
是否为空。是的,我刚查了一些垃圾文件
.extract()
为我们提供了
.split()
。试试我的更新代码。@ExamOrph集合是用来存储唯一值的,实际上,10k并没有那么多。如果python不使用这个内存,那么Exel将使用它。如果你不在木制PC上运行脚本,我想你不会有任何问题。也来看看