介绍
Requests库是基于urllib编写,功能上能够替代urllib,使用上比urllib方便,需要独立pip安装
基本用法
响应的基本内容
import requests
response = requests.get("http://www.baidu.com")
print(response.status_code) #状态码
print(response.url) #请求地址
print(response.headers) #头部信息
print(response.cookies) #cookie信息
print(response.text) #文本形式打印响应内容
print(response.content) #字节流形式打印相应内容
#### 各种请求方式
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete") #删除资源
requests.head("http://httpbin.org/head") #查看头部信息
requests.options("http://httpbin.org/options")
GET请求
发起GET请求有两种,一种是直接把参数的键值对写在url中调用,另一种是通过params字段来传递
# 第一种方式
response = requests.get("http://httpbin.org/get?key=value")
# 第二种方式
data = {
"key" : "value"
}
response = requests.get("http://httpbin.org/get", params=data)
POST请求
发起POST请求和GET请求的第二种方式很类似,只不过传参数的字段变成了data
data = {
"key" : "value"
}
response = requests.post("http://httpbin.org/post", data=data)
POST请求还可以上传文件,通过files字段上传
import requests
files= {"files":open("test.jpg","rb")}
response = requests.post("http://httpbin.org/post",files=files)
print(response.text)
JSON解析
响应提供了json方法,可以把响应的内容转换成json,和用json.loads进行转换的效果一致
import json
import requests
response = requests.get("http://httpbin.org/get")
print(response.text)
print(response.json())
print(json.loads(response.text))
结果如下:
二进制内容
response.content可以获取二进制形式内容,往往用于下载一些图片视频
import requests
header = {
"User-Agent" : "PostmanRuntime/7.26.5"
}
response = requests.get('https://img.ivsky.com/img/tupian/pre/201708/30/kekeersitao-002.jpg', headers=header) #不加header模拟浏览器则没有权限访问该网页
# print(response.content)
with open("./test.jpg", "wb") as f:
f.write(response.content)
注意: response.text有时候会乱码,所以,有时候需要用content解码来代替text
response =requests.get("http://www.baidu.com")
print(response.content.decode("utf-8))
插入头部信息
在上面下载图片测试中就出现了因缺少头部信息而不能访问的错误,插入头部信息只需要通过headers字段传入相应的头部信息字典即可
header = {
"User-Agent" : "PostmanRuntime/7.26.5" #用得最多就是User-Agent,用来模拟浏览器,不过我这用的postman的๑乛◡乛๑
}
response = requests.get('https://www.zhihu.com', headers=header)
获取Cookie
在响应的基本内容中有提及Cookie
import requests
response = requests.get("http://www.baidu.com")
print(response.cookies)
for key,value in response.cookies.items():
print(key+"="+value)
会话维持
通过创建一个session对象来保持会话
import requests
s = requests.Session()
#下面的两次请求都是通过同一个会话发起的
s.get("http://httpbin.org/cookies/set/number/123456")
response = s.get("http://httpbin.org/cookies")
print(response.text)
#下面的两次请求是毫无关联的独立请求
requests.get("http://httpbin.org/cookies/set/number/123456")
response = requests.get("http://httpbin.org/cookies")
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。【链接】
证书验证
以https方式访问的网页会涉及到证书的问题,有时会出现证书不合法的情况
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告提醒
response = requests.get("https://www.12306.cn",verify=False) #verify设置为False,不再校验证书
print(response.status_code)
代理设置
import requests
proxies= {
"http":"http://127.0.0.1:9999",
"https":"http://127.0.0.1:8888"
}
response = requests.get("https://www.baidu.com",proxies=proxies)
print(response.text)
#如果代理需要设置帐户名和密码
proxies = {
"http":"http://user:password@127.0.0.1:9999"
}
如果代理是通过socks方式,需要先pip install requests[socks]
proxies= {
"http":"socks5://127.0.0.1:9999",
"https":"sockes5://127.0.0.1:8888"
}
认证设置
这个认证设置不同于前面的证书验证,这个是类似于用户名密码的认证设置,需要在弹出框中输入用户名和密码才能进一步操作【链接】
import requests
response = requests.get("http://120.27.34.24:9001/",auth=("user","123"))
print(response.status_code)
异常处理
所有异常都在requests.exceptions中,其中:
RequestException继承IOError
HTTPError,ConnectionError,Timeout继承RequestionException
ProxyError,SSLError继承ConnectionError
r",“123”))
print(response.status_code)
#### 异常处理
所有异常都在requests.exceptions中,其中:
RequestException继承IOError
HTTPError,ConnectionError,Timeout继承RequestionException
ProxyError,SSLError继承ConnectionError
ReadTimeout继承Timeout异常