Python 爬虫重定向问题

前言:

在使用 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
url = 'https://baike.baidu.com/item/%E4%B8%80%E5%88%80'
# 创建一个会话
s = requests.Session()
# 向跳转前的URL发送请求, allow_redirects=False的意义为拒绝默认的301/302重定向从而可以通过response.headers['location']拿到重定向后的URL。
fake_response = s.get(url, headers=headers, allow_redirects=False)
# 获取并拼接跳转后的URL
real_url = 'https://baike.baidu.com' + fake_response.headers['location']
# 向跳转后的URL发送请求
real_response = s.get(real_url, headers=headers)
# 以xpath解析数据,也可以用其他解析
tree = etree.HTML(real_response.content)
# 获取指定的需求数据
# title = tree.xpath('xxxxxx')
# ...


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 将会再次被传递,这样也就解决了重定向问题。