为什么在 Scrapy 中使用中间件时会出现无限循环?

问题描述 投票:0回答:1

我正在实施一个在网站上抓取工作机会的计划。但是,我有一个问题:在同一个站点上,链接有时是用相对 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的帖子,但也没有帮助。

python scrapy middleware
1个回答
0
投票

发生的情况是,由于 docs 中的以下子句,您的中间件被一次又一次调用:

如果返回Request对象,Scrapy将停止调用process_request()方法并重新调度返回的请求。一旦执行新返回的请求,将在下载的响应上调用适当的中间件链。

代码中的此检查永远不会再出现错误,从而导致无限循环:

if self.indeed_domain_url not in request.url:
                new_url = self.indeed_domain_url + request.url
© www.soinside.com 2019 - 2024. All rights reserved.