当前位置: 首页 > 知识库问答 >
问题:

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

洪哲彦
2023-03-14

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

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
...

我尝试使用一个数组,然后循环在每个元素上获得一个输出,但得到一个错误,说产量只支持“请求、基础项目、判决或无”。此外,由于我将在大约10k条目上运行此项,我不确定将数据存储在数组中是否会减慢刮擦速度。谢谢。

共有1个答案

黄淇
2023-03-14

不确定是否可以使用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}
 类似资料:
  • 问题内容: 我有两个列表需要合并,第二个列表忽略了第一个列表的重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。 您会注意到结果具有第一个列表, 包括 其两个“ 2”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。 通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实

  • 问题内容: 嗨,我正在尝试合并两个数组,并且还想从最终数组中删除重复的值。 这是我的数组1: 这是我的数组2: 我用于将两个数组合并为一个数组。它正在给出这样的输出 我要删除这些重复的条目,或者在合并之前删除它们…请帮助。.谢谢!!! 问题答案: http://se2.php.net/manual/zh/function.array- unique.php

  • 问题内容: 我有这张桌子,我想用SELECT来排除标记的行。一般规则是: 如果有两行或更多行,控件名与品牌名与组类型列相等 然后保留组名不是“ Keine Zuordnung”的行。 请给我一点帮助吗?谢谢! 问题答案: 这是一种方法: 它使用窗口函数来获取计数,然后使用a进行逻辑计算。

  • 问题内容: 我在Python中有一个列表列表: 我想从中删除重复的元素。如果这是正常列表,而不是我可以使用的列表set。但不幸的是,该列表不可散列,因此无法建立一组列表。只有元组。因此,我可以将所有列表转换为元组,然后使用set并返回列表。但这不是很快。 如何以最有效的方式做到这一点? 上面的结果应为: 我不在乎保留订单。 注意:这个问题很相似,但不是我所需要的。搜索了SO,但没有找到确切的重复项

  • 我的代码: 产生同样的结果。谁能找出我做错了什么或任何其他方法来实现这一点..谢谢

  • 我想在Backbone.js模型中对表单进行一些服务器前验证。要做到这一点,我需要将用户输入从表单转换为可用的数据。我找到了三种方法来做到这一点: 不幸的是,没有一个提供我所需要的好的可扩展和可开发的JSON对象。我已经查看了几个关于Stack ;溢出的问题,但我只发现了一些额外的库。 underscore.js、当前的jQuery或backbone.js是否提供了一个helper方法? 产出 b