我正在实施一个在网站上抓取工作机会的计划。但是,我有一个问题:在同一个站点上,链接有时是用相对 href 编程的,有时是绝对的(例如:有时我有 https://fr.indeed.com => 正确,但其他时候:/cmd/jobs => 不正确)。因此在发送每个请求之前需要检查请求是否正确。为此,我在中间件中编写了一个函数,允许我检查它
class IndeedDomainVerificationMiddleware:
def __init__(self, indeed_domain_url):
self.indeed_domain_url = indeed_domain_url
@classmethod
def from_crawler(cls, crawler):
return cls(indeed_domain_url=crawler.settings.get('INDEED_DOMAIN_URL'))
def process_request(self, request, spider):
if spider.name == 'Indeed':
print(request.url)
if self.indeed_domain_url not in request.url:
new_url = self.indeed_domain_url + request.url
print("New URL: %s" % new_url)
return request.replace(url=new_url)
else:
pass
return None
在 middlewares.py 中
然后,在我的设置中激活中间件:
SCRAPEOPS_API_KEY = 'API KEY'
SCRAPEOPS_PROXY_ENABLED = True
SCRAPEOPS_PROXY_SETTINGS = {'country': 'fr'}
INDEED_DOMAIN_URL = "https://fr.indeed.com"
DOWNLOADER_MIDDLEWARES = {
"Cy_Scraper.middlewares.IndeedDomainVerificationMiddleware": 543,
"Cy_Scraper.middlewares.ScrapeOpsProxyMiddleware": 725,
}
我使用第二个中间件,它允许我使用代理以避免被检测到。
但是,当我启动蜘蛛时,我遇到了无限循环。
我尝试了各种方法,将中间件实现为蜘蛛中间件,如there所示,但它不起作用,我在返回请求时一直有无限循环,并且当我不返回时有重复的请求
看到了Rahul的帖子,但也没有帮助。
发生的情况是,由于 docs 中的以下子句,您的中间件被一次又一次调用:
如果返回Request对象,Scrapy将停止调用process_request()方法并重新调度返回的请求。一旦执行新返回的请求,将在下载的响应上调用适当的中间件链。
代码中的此检查永远不会再出现错误,从而导致无限循环:
if self.indeed_domain_url not in request.url:
new_url = self.indeed_domain_url + request.url