gpt4 book ai didi

python - 如何在scrapy中根据url过滤重复请求

转载 作者:IT老高 更新时间:2023-10-28 21:37:52 25 4
gpt4 key购买 nike

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

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

我想要做的是过滤请求:

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

如果我已经去过

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

NOTE: refer is a parameter that doesn't affect the response I get, so I don't care if the value of that parameter changes.

现在,如果我有一个集合所有 ids 我可以在我的回调函数 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'

它应该在那之后工作

关于python - 如何在scrapy中根据url过滤重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com