支持页面重定向
Scrapy 中的页面重定向是使用默认启用的重定向中间件来处理的。 可以使用以下参数进一步配置该过程:
-
REDIRECT_ENABLED:(True/False - 默认为 True)
-
REDIRECT_MAX_TIMES:(任何单个请求遵循的最大重定向数 - 默认为 20)
如何做
06/02_scrapy_redirects.py 中的脚本演示了如何配置 Scrapy 来处理重定向。 这为任何页面最多配置两个重定向。 运行该脚本会读取 NASA 站点地图并抓取该内容。 其中包含大量重定向,其中许多是从 HTTP 版本的 URL 重定向到 HTTPS 版本的 URL。 将会有很多输出,但这里有几行演示了输出:
Parsing: <200 https://www.nasa.gov/content/earth-expeditions-above/>
['http://www.nasa.gov/content/earth-expeditions-above',
'https://www.nasa.gov/content/earth-expeditions-above']
此特定 URL 在一次重定向(从 URL 的 HTTP 版本到 HTTPS 版本)之后进行处理。 该列表定义了重定向中涉及的所有 URL。
您还可以在输出页面中看到重定向超出指定级别 (2) 的位置。 下面是一个例子:
2017-10-22 17:55:00 [scrapy.downloadermiddlewares.redirect] DEBUG:
Discarding <GET http://www.nasa.gov/topics/journeytomars/news/index.html>:
max redirections reached
工作原理
spider 定义如下:
class Spider(scrapy.spiders.SitemapSpider):
name = 'spider'
sitemap_urls = ['https://www.nasa.gov/sitemap.xml']
def parse(self, response):
print("Parsing: ", response)
print (response.request.meta.get('redirect_urls'))
这与我们之前基于 NASA 站点地图的爬虫相同,只是添加了一行打印重定向 URL。 在任何解析调用中,此元数据将包含为到达此页面而发生的所有重定向。
爬取过程配置如下代码:
process = CrawlerProcess({
'LOG_LEVEL': 'DEBUG',
'DOWNLOADER_MIDDLEWARES':
{
"scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 500
},
'REDIRECT_ENABLED': True,
'REDIRECT_MAX_TIMES': 2
})
默认情况下启用重定向,但这会将最大重定向数设置为 2,而不是默认的 20。