爬取二进制数据
使用requests模块中的get()函数不仅可以获取网页中的源码信息,还可以获取二进制文件。但是在获取二进制文件时,需要使用Response.content属性获取bytes类型的数据,然后将数据保存在本地文件中。例如,下载百度首页中的Logo图片即可使用如下代码:
import requests # 导入网络请求模块requests
# 发送网络请求
response = requests.get('https://www.baidu.com/img/bd_logo1.png?where=super')
# 打印二进制数据
print(response.content)
# 通过open()函数将二进制数据写入本地文件
with open('百度logo.png', 'wb') as f:
f.write(response.content)
程序运行前打印的二进制数据和程序运行后,当前目录下将自动生成的图片,如下:
GET(带参)请求
1、实现请求地址带参
如果需要为GE T请求指定参数时,可以直接将参数添加在请求地址URL的后面,然后用问号(?)进行分隔,如果一个URL地址中有多个参数,参数之间用“&”进行连接。GET(参数)请求代码如下:
# 导入网络请求模块requests
import requests
# 发送网络请求
resp = requests.get('http://httpbin.org/get?name=Jack&age=30')
# 打印响应结果
print(resp.text)
运行结果如下:
{
"args": {
"age": "30",
"name": "Jack"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.27.1",
"X-Amzn-Trace-Id": "Root=1-61f386b5-59f46c3e70d941250f0d181f"
},
"origin": "222.163.139.128",
"url": "http://httpbin.org/get?name=Jack&age=30"
}
备 注:网站http://httpbin.org/get可以作为练习网络请求的一个站点使用,可以模拟各种请求操作。
2、配置params参数
requests模块提供了传递参数的方法,允许使用params关键字参数以一个字符串字典来提供这些参数。例如,想传递ke1=value1 和key2=value2到httpbin.org/get,可以使用如下代码:
# 导入网络请求模块requests
import requests
# 定义请求参数
data = {
'name':'Michael', 'age':'36'}
# 发送网络请求
resp = requests.get('http://httpbin.org/get', params=data)
print(resp.text)
运行结果如下:
{
# 参数
"args": {
"age": "36",
"name": "Michael"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.27.1",
"X-Amzn-Trace-Id": "Root=1-61f38985-67ce8a783401e4a80cbd03c9"
},
"origin": "222.163.139.128",
"url": "http://httpbin.org/get?name=Michael&age=36"
}
POST请求
1、设置请求参数data实现POST请求
POST请求方式也叫提交表单,表单中的数据内容就是对应的请求参数。使用requests模块实现POST请求时需要设置请求参数data。POST请求的代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :1/28/22 2:26 PM
# 文件 :设置请求参数data实现POST请求.py
# IDE :PyCharm
# 导入网络请求模块
import requests
# 导入json模块
import json
# 字典类型到表单参数
data = {
'1':'能力有限的,而努力是无限的。',
'2':'星光不问赶路人,时光不负有心人。'}
# 发送网络请求
resp = requests.post('http://httpbin.org/post', data = data)
# 将响应的数据转成字典类型
resp_dict = json.loads(resp.text)
# 打印转换后的响应数据
print(resp_dict)
运行结果如下:
{
'args': {
}, 'data': '', 'files': {
}, 'form': {
'1': '能力有限的,而努力是无限的。', '2': '星光不问赶路人,时光不负有心人。'}, 'headers': {
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Content-Length': '275', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.26.0', 'X-Amzn-Trace-Id': 'Root=1-61f390c9-4f257890038aef92188e537b'}, 'json': None, 'origin': '222.163.139.128', 'url': 'http://httpbin.org/post'}
说 明:POST请求中data参数的数据格式也可以是列表、元组或者是JSON。参数代码如下:
# 元组类型的表单数据
data = (('1', '能力有限的,而努力是无限的。'),
('2', ç))
# 列表类型的表单数据
data = [('1', '能力有限的,而努力是无限的。'),
('2', '能力有限的,而努力是无限的。')]
# 字典类型的表单参数
data = {
'1': '能力有限的,而努力是无限的。',
'2':'能力有限的,而努力是无限的。'}
# 将字典类型转换为JSON类型的表单数据
data = json.dumps(data)
注意:
requests模块中GET与POST请求的参数分别是params和data, 所以不要将两种参数填写错误。