我正在使用 scrapy 和 CrawlSpider 为网站编写一个爬虫。
Scrapy 提供了一个内置的重复请求过滤器,可以根据 url 过滤重复请求。另外,我可以使用过滤请求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 是一个不会影响我得到的响应的参数,所以我不关心该参数的值是否发生变化。
现在,如果我有一组累积所有ids我可以在回调函数中忽略它解析项(这是我的回调函数)来实现这个功能。
但这意味着当我不需要时,我至少仍在获取该页面。
那么我可以通过什么方式告诉 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'
之后应该可以工作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)