当前位置: 首页 > 面试题库 >

如何基于scrapy中的URL过滤重复的请求

蔡修远
2023-03-14
问题内容

我正在为CrawlSpider使用scrapy为网站编写爬虫。

Scrapy提供了一个内置的重复请求过滤器,该过滤器根据URL过滤重复请求。另外,我可以使用CrawlSpider的规则成员过滤请求。

我想要做的是过滤请求,例如:

http:://www.abc.com/p/xyz.html?id=1234&refer=5678

如果我已经去过

http:://www.abc.com/p/xyz.html?id=1234&refer=4567

注意: refer是一个不会影响我得到的响应的参数,所以我不在乎该参数的值是否发生变化。

现在,如果我有一个集合所有ID的集合,则可以在我的回调函数parse_item(这是我的回调函数)中忽略它来实现此功能。

但这意味着我不需要时至少仍要获取该页面。

那么,我可以告诉scrapy不应基于url发送特定请求的方式是什么?


问题答案:

你可以编写用于重复删除的自定义中间件并将其添加到设置中

import os

from scrapy.dupefilter import RFPDupeFilter

class CustomFilter(RFPDupeFilter):
"""A dupe filter that considers specific ids in the url"""

    def __getid(self, url):
        mm = url.split("&refer")[0] #or something like that
        return mm

    def request_seen(self, request):
        fp = self.__getid(request.url)
        if fp in self.fingerprints:
            return True
        self.fingerprints.add(fp)
        if self.file:
            self.file.write(fp + os.linesep)

然后,你需要在settings.py中设置正确的DUPFILTER_CLASS

DUPEFILTER_CLASS = 'scraper.duplicate_filter.CustomFilter'

在那之后它应该工作



 类似资料:
  • 我想选择仅在顶级国家/地区之后或仅在其他国家/地区之后的span元素 我已经尝试了 如果我分别尝试这两种XPATH,它们都可以工作,但如果结合使用,它们就不起作用。 我只想选择排名靠前的国家,并将其列入一个列表:,然后过滤掉其他国家。 如果我使用[text()=“Top Countries”]//以下同胞::span所有国家都被选中。例如,<代码>[“澳大利亚”、“几内亚比绍”、“西班牙”、“瑞士

  • 泽西应用编程接口中是否有任何注释可用于实现基于头值的请求过滤?同样的情况在Spring like中实现 @RequestMapping(value=“/test”,method=RequestMethod.POST,headers={“version=v1.1”})

  • 问题内容: 我们遇到一种情况,我们想对包含某些特定请求参数的URL使用过滤器,例如: 等等,都是在运行时牵强,我想配置过滤器,只有当。应该如何解决?可以使用正则表达式模式配置Filter吗? 问题答案: 据我所知,尚无解决方案可直接在中通过查询字符串将请求匹配到过滤器。因此,您可以在使用init- params的情况下注册过滤器,以使过滤器可配置,并在实现中设置模式。 您的web.xml中的配置如

  • 目前,我已经开发了一个来使用带有搜索功能的显示数据列表(如image_1所示)。 我想在工具栏上添加过滤选项,类似于Youtube应用程序上的过滤器(参见image2)。有谁能给我线索轻松实施吗?用于UI设计和业务逻辑。 知道如何实现过滤器对话框窗口吗(参见image_3)?我应该只使用还是有其他更好的选项?

  • 我有一个搜索栏,让用户过滤基于他们的条目使用角度。现在我希望能够在用户输入的搜索词与数组中的任何内容都不匹配时显示类似“Nothing match your search”的消息。 控制器 是否可以知道过滤数组的长度,以便我可以显示消息?

  • 问题内容: 我正在运行一个简单的JSON文件,并希望获取类别名称。大约有100个对象,每个对象都属于一个类别-但是只有大约6个类别。 我当前的代码是这样的: 输出是100个不同的选项,大部分重复。我该如何使用Angular来检查a是否已经存在,如果已经存在则不创建选项? 编辑:在我的javascript中,只是为了澄清 问题答案: 您可以使用AngularUI 的 唯一 过滤器(此处提供源代码:A