Python爬虫学习笔记
1.关于抛出异常重定位
raise TooManyRedirects(‘Exceeded {} redirects.’.format(self.max_redirects), response=resp)
requests.exceptions.TooManyRedirects: Exceeded 30 redirects.
原因:
urllib和requests发送的请求默认会根据响应的location进行重定向。
此时,Status Code是302,表示暂时请求的网页暂时跳转到其他页面;响应头中有location的参数
一般大多数的解决办法是,在请求地址时加上参数,禁止重定向,如:
html = requests.get(‘https://baike.baidu.com’, allow_redirects=False).text
实际多数时候并不返回结果。或者返回失败
根据网上查找的结果,参考以下文章
https://www.cnblogs.com/Jeffding/p/8391957.html
https://www.it1352.com/330504.html
简单来说就是没有与服务器建立会话,页面重定向成了环形的死循环。即你的原始URL重定向一个没有新的URL B,其重定向到C,它重定向到B,等等。
最终解决办法是在建立一个会话,提到加请求头来保持会话的持久性。如下:
s = requests.Session()
s.headers[‘User-Agent’] = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36’
r = s.get(url)
r
1.2 如果说是根据location来重新定位,将location的值设置为目标地址是不是能解决问题?
待验证。
2.form data和request payload的区别
用post发送请求时,开发工具下有时候看到是form data,有时候是request payload,原因是Content-Type类型不一样。
- 如果请求的Content-Type设置为application/x-www-form-urlencoded,那么这个Post请求会被认为是Http Post表单请求,那么请求主体将以一个标准的键值对和&的querystring形式出现。这种方式是HTML表单的默认设置,所以在过去这种方式更加常见
- 其他形式的POST请求,是放到 Request payload 中(现在是为了方便阅读,使用了Json这样的数据格式),请求的Content-Type设置为application/json;charset=UTF-8或者不指定。
对于request payload类型,data 是个字典,而payload接受json类型,因此需要将字符格式改成json格式。data = json.dumps(data)
具体可参考 https://blog.csdn.net/zwq912318834/article/details/79930423