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

Exa*_*rph 1 python scrapy

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

"kaylachic,jmargerum,kaylachic"

"Kempodancer,doctordbrew,Gotenks,dalegribel"

"Gotenks,dalegribel,jmargerum"

...
Run Code Online (Sandbox Code Playgroud)

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

dalegribel
Chad
Ninoovcov
Gotenks
...
Run Code Online (Sandbox Code Playgroud)

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

pyt*_*had 5

不确定是否可以使用 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}
Run Code Online (Sandbox Code Playgroud)