requests.Request(url) 构造一个请求,支持以下各种方式
requests.get() 发送get请求
requests.post() 发送post请求
requests.head() 获取HTML的头部信息
requests.put() 发送put请求
requests.patch() 提交局部修改的请求
requests.delete() 提交删除请求
语法构造
requests.get(url,params=None)
参数说明
url:需要爬取的网站和网址
params:请求参数
该方法的结果为Response对象,包含服务器的响应信息
response对象的常用属性
response.staue_code 响应状态码
response.content 把response对象转换为二进制
response.text 把response对象转换为字符串数据
response.encoding 定义response对象的编码
response.cookies 获取请求后的cookie
response.url 获取请求网址
response.json() 内置的json解码器
Response.headers 以字典对象存储服务器响应头,字典键不区分大小
import requests
url = 'https://www.baidu.com/'
resp = requests.get(url)
#设置响应的经编码格式
resp.encoding='utf-8'
cookie = resp.cookies #获取请求后的cookie信息
headers = resp.headers #以字典对象存储服务器响应头,字典键不区分大小
print('响应状态码:',resp.status_code)
print('请求后的cookie:',cookie)
print('获取请求的网址:',resp.url)
print('响应头:',headers)
print('响应内容:',resp.text)
URL只支持ASCII(美国标准码),在实际的传输过程中,中文及一些特殊字符需要经过urlencode(URL编码)。如上例中的接口地址会被编码成:
https://xxx.com/get?name=%E4%B8%B4%&age=xxx
import requests
url = "https://xxx.com/api"
params = {"key":"xxx","info":"xxx"} # 字典格式,单独提出来,方便参数的添加修改等操作
res = requests.get(url=url, params=params)
print(res.text)
.get()方法中,参数params后面跟着是一个字典,requests会自动帮我们把这个参数拼接在接口请求地址中
import requests
url = 'https://www.xxx.com/xxx'
# 请求头
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"}
resp = requests.get(url,headers=headers)
resp.encoding = 'utf-8'
print(resp.text)
import requests
url = "https://xxx.com"
data = {"name": "xxx", "age": xxx} # Post请求发送的数据,字典格式
res = requests.post(url=url, data=data) # 这里使用post方法,参数和get方法一样
print(res.text)
import requests
url = "https://xxx.com"
data = '''{
"name": "xxx",
"age": xxx
}''' # 多行文本, 字符串格式,也可以单行(注意外层有引号,为字符串) data = '{"name": "xxx", "age": xxx}'
res = requests.post(url=url, data=data) # data支持字典或字符串
print(res.text)
data参数支持字典格式也支持字符串格式,如果是字典格式,
requests方法会将其按照默认表单urlencoded格式转换为字符串,如果是字符串则不转化
如果data以字符串格式传输需要遵循以下几点:
必须是严格的JSON格式字符串,里面必须用双引号,k-v之间必须有逗号,布尔值必须是小写的true/false等等不能有中文,直接传字符串不会自动编码
一般来说,建议将data声明为字典格式(方便数据添加修改),然后再用json.dumps()方法把data转换为合法的JSON字符串格式
import requests
import json # 使用到JSON中的方法,需要提前导入
url = "https://xxx.com"
data = {
"name": "xxx",
"age": xxx
} # 字典格式,方便添加
headers = {"Content-Type":"application/json"} # 严格来说,我们需要在请求头里声明我们发送的格式
res = requests.post(url=url, data=json.dumps(data), headers=headers) # 将字典格式的data变量转换为合法的JSON字符串传给post的data参数
print(res.text)
或直接将字典格式的data数据赋给post方法的JSON参数(会自动将字典格式转为合法的JSON文本并添加headers)
import requests
url = "https://xxx.com/api/v2"
data = {
"reqType":xxx,
"perception": {
"inputText": {
"text": "xxx"
},
"inputImage": {
"url": "xxx"
},
"selfInfo": {
"location": {
"city": "xxx",
"province": "xxx",
"street": "xxx"
}
}
},
"userInfo": {
"apiKey": "xxx",
"userId": "xxx"
}
}
res = requests.post(url=url, json=data) # JSON格式的请求,将数据赋给json参数
print(res.text)
XML和JSON都属于Raw格式的数据,XML和JSON在Python中实际都是不同格式的文本字符串。我们将字符串传递给请求方法的data参数即可原样发送,即data参数有以下3重作用:
1)data = {} 或 [(,), (,)]:接受一个字典或嵌套列表格式的数据,会按表单Url编码格式
2)data = ‘’:接受一个字符串或bytes二进制字符串,会原样发送(需要手动添加请求头,如果存在中文需要手动编码)
3)data = open(’…’, ‘rb’):接受一个文件对象,按binary格式流式上传。
发送XML格式的数据只要将XML格式的多行字符串传递给请求方法的data参数即可,示例如下。
import requests
url = 'https://xxx.com/post'
xml_data = '''
xxx
xxx
'''
headers = {'Content-Type': 'application/xml'}
res = requests.post(url, data=xml_data.encode('utf-8'), headers=headers)
print(res.text)
由于xml_data数据中存在非ASCII码,需要将数据按utf-8格式编码为bytes二进制字符串发送。由于使用Raw格式发送数据时不会自动添加请求头,因此一般要手动在请求头中添加内容类型声明,并将构造的字典类型的请求头变量,传递给请求方法的关键字参数headers。
网页上的表单有两种,一种是不包含文件上传,所有用户输入或选择的数据都可以使用字符串格式表示,这种称为普通表单或纯文本表单,对应MIME类型为application/x-www-form-urlencoded。
另一种即包括普通输入框等,也包含一个或多个文件上传框。普通输入框中的变量值可以已字符串格式编码,而上传的文件(如图片文件)则不一定能直接转为字符串,要使用二进制格式。因此要使用多部分的混合格式,笔者称之为混合表单,对应MIME类型为multipart/form-data。在表单中,每个需要上传的文件和普通输入框一样对应一个指定的变量。因此同样可以使用字典格式组装混合表单的请求数据传递给请求方法的files参数即可,示例如下。
import requests
url = 'https://xxx.com/post'
multi_form_data = {
'name': 'xxx',
'age': 'xxx', # 不能使用int类型
'avatar': open('/Users/apple/Pictures/robot.png', 'rb'),
'avatar2': open('/Users/apple/Pictures/robot.jpg', 'rb'),
}
res = requests.post(url, files=multi_form_data)
print(res.text)
表单数据中的数字要使用字符串格式的数字,文件要以rb二进制格式打开传输,支持多个变量以及多个文件。
文件类型的数据avatar可以只穿一个打开的文件对象open(’/Users/apple/Pictures/robot.png’, ‘rb’),也可以传递三个参数:要保存的文件名,打开的文件及文件MIME类型,即
‘avatar’: (‘robot.png’, open(’/Users/apple/Pictures/robot.png’, ‘rb’), ‘image/png’),
比如有些接口上传Excel文件时必须声明文件名和MIME类型,如:
res = request.post(url, files={'upload_file':
('data.xlsx',
open('data.xlsx', 'rb'),
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
})
import requests
url = 'https://xxx.github.com/post'
res = requests.post(url, data=open('/Users/apple/Pictures/xxx.jpg', 'rb'))
print(res.text)