前言:
在使用Python爬虫的过程中难免会遇到很多301,302的问题。他们出现时,很大程度的影响到我们的爬虫速度和信息的准确性。下面针对不同的模块给出不同的解决方案。
使用requests模块爬虫
使用requests模块遇到301和302问题时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import requests from lxml import etree
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' }
def main(): url = 'https://baike.baidu.com/item/%E4%B8%80%E5%88%80' s = requests.Session() fake_response = s.get(url, headers=headers, allow_redirects=False) real_url = 'https://baike.baidu.com' + fake_response.headers['location'] real_response = s.get(real_url, headers=headers) tree = etree.HTML(real_response.content)
if __name__ == '__main__': main()
|
allow_redirects=False
的意义为拒绝默认的 301/302
重定向从而可以通过response.headers['location']
拿到重定向后的URL。
使用scrapy框架爬虫
1 2 3 4 5 6
| yield scrapy.Request(url,meta={ 'title':tit, 'describe':describ, 'home_url':home_url, 'number':number },callback=self.parse_item, dont_filter=True)
|
这是在 yield
里面加上 dont_filter=True
,解决了这个问题,dont_filter
的意思是,如果已经爬取过得 url
,也就是没有出现问题的 url
,自然而然出现问题的 url
将会再次被传递,这样也就解决了重定向问题。