Python 首先是Scrapy解析重定向

Python 首先是Scrapy解析重定向,python,parsing,redirect,scrapy,Python,Parsing,Redirect,Scrapy,我这里有一些代码,用于在抓取时检测重定向,然后返回对重定向到的页面的请求,以便分析重定向的页面。然而,我让scraper运行了很长一段时间,在解析重定向页面时,没有出现任何问题。请记住,我的开始URL列表是动态生成的,有时可能非常长。我想做的是让刮刀 检测重定向 停止抓取开始URL或队列中的任何内容 解析重定向 刮除重定向自的原始页面,并继续刮除开始URL 抓取原始页面不应该太复杂,我已经在else语句中处理了这段代码。我的主要问题是前3项任务。我想将重定向解析移到scrapers优先级列表的顶

我这里有一些代码,用于在抓取时检测重定向,然后返回对重定向到的页面的请求,以便分析重定向的页面。然而,我让scraper运行了很长一段时间,在解析重定向页面时,没有出现任何问题。请记住,我的开始URL列表是动态生成的,有时可能非常长。我想做的是让刮刀

  • 检测重定向
  • 停止抓取开始URL或队列中的任何内容
  • 解析重定向
  • 刮除重定向自的原始页面,并继续刮除开始URL
  • 抓取原始页面不应该太复杂,我已经在else语句中处理了这段代码。我的主要问题是前3项任务。我想将重定向解析移到scrapers优先级列表的顶部。我该怎么做

    def parse(self, response):
        self.logger.info("got response %d for %r" % (response.status, response.url))
    
        # handle redirection
        # this is copied/adapted from RedirectMiddleware
        if response.status == 302:
    
            self.logger.info("Response is 302")
    
            location = to_native_str(response.headers['location'].decode('latin1'))
    
            self.logger.info("Location: %s" % location)
    
            # get the original request
            request = response.request
            # and the URL we got redirected to
            redirected_url = urljoin(request.url, location)
    
            self.logger.info("Redirected_url: %s" % redirected_url)
    
            self.logger.info("Yielding redirect instead")
            return scrapy.Request(redirected_url, callback=self.parse, meta={'dont_redirect':True})
        else:
            #parse the redirected page
    

    这取决于重定向是如何启动的。如果是HTTP 3xx重定向或元刷新重定向,则内置重定向中间件应该已经为您处理了它(如果您想自己处理它,您可以禁用/绕过内置重定向功能)。但是JS发起的重定向不是Scrapy可以处理的。在尝试在scraper中解决这个问题之前,您需要首先确定实际网站上的具体情况。它被重定向到网站内置的google验证码页面。我不知道它是否是JS启动的,我还没有看到特定的事件模式,但它确实似乎与cookie相关,因为一旦验证码被解决,它就不会再次出现。据我所知,重定向中间件确实从我的启动请求函数中启用:
    yield scrapy.Request(x,callback=self.parse,meta={'dont_redirect':False})
    据我所知。。。但是在上面的代码中显然是禁用的。我想我想手动处理它,但我又没有受过如何处理它的教育。