一、requests库相关概念
1.requests和urllib的区别
1)requests的底层实现就是urllib
2)requests在python2和python3比较通用,类、方法等基本一样。
3)requests更简单易用
4)requests能够自动帮我们解压响应数据
2.requests文档
官方中文文档:https://requests.readthedocs.io/zh_CN/latest/
二、response响应
1.获取响应内容文本(str)
import requests
response = requests.get("https://www.baidu.com") response.encoding = "utf-8" print(response.text) # response.text的类型是str
使用response.encoding="utf-8"是为其设置一个解码类型,避免解码错误,形成乱码。
这里需要注意,我们使用什么样的解码类型,要和响应数据使用编码类型一致,有些相应使用的是gbk编码,我们也需要用gbk来解码。这里要根据实际的情况来调整。
2.获取响应内容二进制数据
import requests
response = requests.get("https://www.baidu.com") response.encoding = "utf-8" print(response.content) # 获取二进制数据 print(response.content.decode("utf-8")) # 将二进制解码为"utf-8",类型是str,和response.text一样
三、requests小技巧
1.转换cookies为字典类型
import requests response = requests.get("http://www.baidu.com") # RequestsCookieJar 对象 print(response.cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> # 将RequestsCookieJar对象转换为字典 cookie_dict = requests.utils.dict_from_cookiejar(response.cookies) print(cookie_dict) # {'BDORZ': '27315'}
使用requests.utils.dict_from_cookiejar方法可以将response.cookies转换为字典,方便使用。
注意:我们在浏览器中看到的cookie可能有很多,但这些cookies不一定是服务器一次性设置的,而是在不同的请求中分别设置的,所以我们通过response.cookies获取的cookie只是其中的一部分。
2.url地址编解码
import requests url = "http://www.baidu.com/s?wd=魔兽世界" # url编码 url_encoded = requests.utils.quote(url) print(url_encoded) # http%3A//www.baidu.com/s%3Fwd%3D%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C # url解码 url_decoded = requests.utils.unquote(url_encoded) print(url_decoded) # http://www.baidu.com/s?wd=魔兽世界
3.忽略SSL证书验证
当我们访问的HTTPS网站的证书不是花钱购买的证书(不被我们的机器认可,认为是不安全的,即浏览器上的小锁不是加锁状态),那么在发送请求的时候会提示证书验证失败。
此时我们可以使用以下方法,不进行证书验证:
import requests res = requests.get("https://www.12306.cn/mormhweb/", verify=False) # 这里会出现一个强烈建议添加证书认证的警告 print(res.content)
4.设置requests请求超时时间
import requests res = requests.get("https://www.12306.cn/mormhweb/", timeout=10) # 10秒没响应就报异常,我们通过try except来捕获
5.判断响应是否正常
即判断响应状态码是否为200:
import requests def _parse_url(url): response = requests.get(url, timeout=10) assert response.status_code == 200 return response.content def parse_url(url): try: html_content = _parse_url(url) except Exception as err: print(err) html_content = None return html_content if __name__ == '__main__': cap_url = 'http://www.baidu.com/' print(parse_url(cap_url).decode('utf-8'))
通过断言来研判响应状态码是否为200,如果不是200则抛出异常。
6.使用retrying模块来重试请求
import requests from retrying import retry # 使用前要使用pip install retrying安装这个第三方模块 @retry(stop_max_attempt_number=3) # 使用retry装饰器,可以实现该函数最多尝试3次,如果还报错,则抛出异常 def _parse_url(url): print("retry...") response = requests.get(url, timeout=10) assert response.status_code == 200 return response.content def parse_url(url): try: html_content = _parse_url(url) except Exception as err: print(err) html_content = None return html_content if __name__ == '__main__': # cap_url = 'http://www.baidu.com/' cap_url = 'www.baidu.com/' # 我们将url改成错误的,然后进行尝试retry的效果 content = parse_url(cap_url) if content: print(content.decode('utf-8'))
输出结果:
retry... retry... retry... Invalid URL 'www.baidu.com/': No schema supplied. Perhaps you meant http://www.baidu.com/?
可以看到,get请求被尝试了三次,三次都出错,才抛出异常,并被我们捕获。
===