Scrapy爬虫遇见重定向301/302问题解决方法

Scrapy中止重定向

在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中Location值

重定向后的链接会放在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)   

你可能感兴趣的:(scrapy,scrapy,python,爬虫)