Redirect 刮柄302响应代码

Redirect 刮柄302响应代码,redirect,scrapy,web-crawler,scrapy-spider,Redirect,Scrapy,Web Crawler,Scrapy Spider,我正在使用一个简单的CrawlSpider实现来抓取网站。默认情况下,Scrapy跟随302重定向到目标位置,并忽略最初请求的链接。在一个特定的站点上,我遇到了一个302重定向到另一个页面的页面。我的目标是记录原始链接(响应302)和目标位置(在HTTP响应头中指定),并在CrawlSpider的parse\u item方法中处理它们。请引导我,我如何才能做到这一点 我遇到了提到使用don_redirect=True或redirect\u ENABLE=False的解决方案,但实际上我并不想忽略

我正在使用一个简单的
CrawlSpider
实现来抓取网站。默认情况下,
Scrapy
跟随302重定向到目标位置,并忽略最初请求的链接。在一个特定的站点上,我遇到了一个302重定向到另一个页面的页面。我的目标是记录原始链接(响应302)和目标位置(在HTTP响应头中指定),并在
CrawlSpider
parse\u item
方法中处理它们。请引导我,我如何才能做到这一点

我遇到了提到使用
don_redirect=True
redirect\u ENABLE=False
的解决方案,但实际上我并不想忽略重定向,事实上我也想考虑(即不忽略)重定向页面

例如:我访问
http://www.example.com/page1
发送302重定向HTTP响应并重定向到
http://www.example.com/page2
。默认情况下,scrapy ignore
page1
,跟随到
page2
,并对其进行处理。我想在
parse_item
中处理
page1
page2

编辑
我已经在spider的类定义中使用
handle\u httpstatus\u list=[500404]
来处理
500
404
解析项目中的响应代码,但是如果我在
handle\u httpstatus\u list
中指定它,重定向中间件将“捕获”在响应到达httperror中间件并使用重定向url启动新请求之前,它将返回响应。同时,原始响应不会返回,也就是说,您甚至没有“看到”302代码,因为它们没有到达httperror。因此,在handle_httpstatus_列表中使用302没有效果

在scrapy.downloadermiddleware.redirect.RedirectMiddleware中查看其源代码:在process_response()中,您可以看到发生了什么。它启动一个新请求,并用重定向的URL替换原始URL。没有“返回响应”->原始响应被丢弃

基本上,除了发送另一个带有重定向的_url的请求外,还需要通过添加一行“return response”来覆盖process_response()函数

在parse_项中,您可能需要设置一些条件语句,这取决于它是否是重定向?我想它看起来会不完全一样,所以也许你的物品看起来也会很不一样。另一种选择也可以是对任一响应使用不同的解析器(取决于原始url或重定向url是否为“特殊页面”),然后您只需要在spider中使用不同的解析函数,例如parse_redirected_url(),并通过重定向请求中的回调调用该解析函数(我写这些行时的最新官方消息)在内置重定向中间件中不使用
handle\u httpstatus\u列表
——请参阅。 来自Scrapy 1.1.0()

即使禁用重定向,您仍然可以在回调中模拟其行为,检查
位置
标题并将
请求
返回到重定向

蜘蛛网示例:

$ cat redirecttest.py
import scrapy


class RedirectTest(scrapy.Spider):

    name = "redirecttest"
    start_urls = [
        'http://httpbin.org/get',
        'https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip'
    ]
    handle_httpstatus_list = [302]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, dont_filter=True, callback=self.parse_page)

    def parse_page(self, response):
        self.logger.debug("(parse_page) response: status=%d, URL=%s" % (response.status, response.url))
        if response.status in (302,) and 'Location' in response.headers:
            self.logger.debug("(parse_page) Location header: %r" % response.headers['Location'])
            yield scrapy.Request(
                response.urljoin(response.headers['Location']),
                callback=self.parse_page)
控制台日志:

$ scrapy runspider redirecttest.py -s REDIRECT_ENABLED=0
[scrapy] INFO: Scrapy 1.0.5 started (bot: scrapybot)
[scrapy] INFO: Optional features available: ssl, http11
[scrapy] INFO: Overridden settings: {'REDIRECT_ENABLED': '0'}
[scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState
[scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
[scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
[scrapy] INFO: Enabled item pipelines: 
[scrapy] INFO: Spider opened
[scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
[scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
[scrapy] DEBUG: Crawled (200) <GET http://httpbin.org/get> (referer: None)
[redirecttest] DEBUG: (parse_page) response: status=200, URL=http://httpbin.org/get
[scrapy] DEBUG: Crawled (302) <GET https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip> (referer: None)
[redirecttest] DEBUG: (parse_page) response: status=302, URL=https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip
[redirecttest] DEBUG: (parse_page) Location header: 'http://httpbin.org/ip'
[scrapy] DEBUG: Crawled (200) <GET http://httpbin.org/ip> (referer: https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip)
[redirecttest] DEBUG: (parse_page) response: status=200, URL=http://httpbin.org/ip
[scrapy] INFO: Closing spider (finished)

你能提供一个给你302HTTP状态的url吗?
[scrapy] DEBUG: Crawled (302) <GET https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip> (referer: None)
[scrapy] DEBUG: Ignoring response <302 https://httpbin.org/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fip>: HTTP status code is not handled or not allowed