在scrapy爬取数据时,遇到重定向301/302
,特别是爬取一个下载链接时,他会直接重定向并开始下载,在下载之后才会返回爬取的链接,这时候就需要中止重定
以下302都可以换成301,是一样的
yield Request(url,
meta={
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback=self.parse)
如果爬取是在parse
中以yield Request
爬取,那么需要添加过滤 dont_filter=True
,详情可见下述情景二
重定向后的链接会放在response里header中的Location
,这里说明一下如何取到其中的值
location = response.headers.get("Location")
如果爬取网址是在start_urls
中顺序爬取执行,直接在start_requests
方法中添加就行
def start_requests(self):
yield Request(url,
meta={
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback=self.parse)
import scrapy
class xxSpider(scrapy.Spider):
name = 'xx'
allowed_domains = ['www.xxx.com']
start_urls = ['http://www.xxx.com/download']
def start_requests(self):
# 在此直接中止302重定向即可
yield Request(start_urls[0],
meta={
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback=self.parse)
def parse(self, response):
# 取得返回的重定向值
location = response.headers.get("Location")
如果爬取是在parse
中以yield Request
爬取,那么需要添加过滤dont_filter=True
yield Request(url,
meta={
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback=self.parse,dont_filter=True)
import scrapy
class xxSpider(scrapy.Spider):
name = 'xx'
allowed_domains = ['www.xxx.com']
start_urls = ['http://www.xxx.com/download']
def parse(self, response):
url = "xxxxxxxxxx"
# 在此需要添加过滤
yield Request(url,
meta={
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback=self.parse,dont_filter=True)