Python中requests库与json库的使用详解
一.请求网络,访问网址的所有内容模板:
import requests
#1.访问网络,请求网址的所有内容都在这个response对象中<Response [200]>
response=requests.get('https://www.baidu.com')
#response.text返回的内容是文本的形式,文本和网页可以使用response.text来获取
#print(response.text)
#response.content返回的内容是二进制的形式(所有计算机上的东西,本质都是二进制)
#以后只要遇到图像,和视频这样的内容全部使用response.content来获取
print(response.content)
print(response.status_code)#显示请求的结果,状态码为200则表明成功
11111111111111111111111111111111111111111111111111111111111111111111111111111111
注意:.text返回的内容是文本的形式,文本和网页可以使用response.text来获取,而
.content返回的内容是二进制的形式(所有计算机上的东西,本质都是二进制)
#以后只要遇到图像,和视频这样的内容全部使用response.content来获取
二读取内容的两种格式:
格式一:
#读取文件内容'demo.txt':是相对路径,也可以写绝对路径
#1.读取文件内容'r':read的缩写,表示我要读取文件
#'rb’:表示读取文件内容,并把文件内容以二进制的形式读取出来
#读取文档,直接'r'即可;读取音视频,则用'rb'
file=open('爬虫代码尝试\demo.txt','r',encoding='utf-8')
content=file.read()
#print(content)
#释放掉刚才打开文件的操作,相当于保存并关闭了文件,不屑相当于文件一直处于打开状态
file.close()
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
'demo.txt'是在同一文件夹的文件:我爱中国
格式二:
# 读取文本内容方法2:with open() as file:
#临时创建一个文件,并读取内容,节省代码,在with外面,file是无效的
# with open('爬虫代码尝试\demo.txt','r',encoding='utf-8') as file:
# content=file.read()
# print(content)
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
#读取图片
with open('爬虫代码尝试\demo.jpg','rb') as file:
content=file.read()
print(content)
解释:
这里的'r'和'rb'表示读取的文件类型
文本文件:
r
: 读取文本文件。w
: 写入文本文件,清空原有内容。a
: 追加内容到文本文件末尾。r+
: 读取和写入文本文件。w+
: 写入和读取文本文件,清空原有内容。a+
: 追加内容到文本文件末尾,并可以读取文件内容。二进制文件:
rb
: 读取二进制文件。wb
: 写入二进制文件,清空原有内容。ab
: 追加内容到二进制文件末尾。rb+
: 读取和写入二进制文件。wb+
: 写入和读取二进制文件,清空原有内容。ab+
: 追加内容到二进制文件末尾,并可以读取文件内容。三写入文件的两种格式:
格式一:
import requests
file=open('test17.txt','w',encoding='utf-8')
file.write('古希腊掌管文件的神!!!')
file.close()
效果图:
#创建了一个新文件,并在新文件里有所写的内容
注意:encoding='utf-8'是改变编码的方式,使中文可以显示
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
格式二:
# r或者w是最基础的使用方式,其实还有其他的比如a可以文件中追加内容
# with open('test.txt','a',encoding='utf-8') as file:
# file.write('古希腊掌管文件的神!!!')
效果图:
三.结合一和二的内容,实现在图片网址中爬取一张图片并保存在自己创建的一个文件:
# 2.获取文件并下载
# response=requests.get(url="https://img1.baidu.com/it/u=2172818577,3783888802&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1422")
# with open('1234.jpg','wb') as file:
# file.write(response.content)
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
效果:
文本文件:
r
: 读取文本文件。w
: 写入文本文件,清空原有内容。a
: 追加内容到文本文件末尾。r+
: 读取和写入文本文件。w+
: 写入和读取文本文件,清空原有内容。a+
: 追加内容到文本文件末尾,并可以读取文件内容。二进制文件:
rb
: 读取二进制文件。wb
: 写入二进制文件,清空原有内容。ab
: 追加内容到二进制文件末尾。rb+
: 读取和写入二进制文件。wb+
: 写入和读取二进制文件,清空原有内容。ab+
: 追加内容到二进制文件末尾,并可以读取文件内容。四。get()和post() 模拟浏览器
import requests
# post请求
#get请求不安全,因为get请求是把所有内容全放在连接中发送
#如果是get请求,那么在浏览器中输入http://127.0.0.1:5000/get_user?username=admin&password=123456
#post请求会把用户名和密码等单独到一个包发送
# user={'username':'zhangsan','password':'123456'}
# response=requests.post('https://httpbin.org/post',data=user)
# print(response.text)
#2模拟浏览器,访问网站
headers={'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
user={'username':'zhangsan','password':'123456'}
#模拟谷歌浏览器来访问网站
response=requests.post('https://httpbin.org/post',data=user,headers=headers)
print(response.text)
效果:
{
"args": {},
"data": "",
"files": {},
"form": {
"password": "123456",
"username": "zhangsan"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "33",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-67d42baf-5dc1408b21208bbd5c0dec32"
},
"json": null,
"origin": "117.32.216.92",
"url": "https://httpbin.org/post"
}
总结:
GET 请求 vs POST 请求
GET 请求
用途:
get请求不安全,因为get请求是把所有内容全放在连接中发送
用于从服务器获取数据。
特点:
POST 请求
用途:
#post请求会把用户名和密码等单独到一个包发送
用于向服务器提交数据。
特点:
五 json库
import json
import requests
response=requests.get(url='http://t.weather.itboy.net/api/weather/city/101010100')
# print(response.text)
#虽然看上去跟字典一模一样,但是,不能获取,因为这里的内容是json
#明确,现在是把json转化为Python,用的是loads或者load;因为是response.text是字符串,所以用loads;
#如果response.content是二进制,那么用load;
#print(response.json())
result=json.loads(response.text)
#print('这是Python数据',result)
#https://t.weather.itboy.net/api/weather/city/101010100
#data=result['time']
# 存放的是一个列表,列表中是多个字典,包含某一天具体信息
data=result['data']['forecast']
# 保存日期,保存最高温度,保存最低温度
# 使用字典格式保存(‘日期’:‘)
info={}
all_data=[]
#先获取所有信息,保存在一个字典中(一天的内容)
#再把当天的信息保存到一个列表中
for message in data:
info['日期']=message['date']
info['最高温度']=message['high']
info['最低温度']=message['low']
print(info)
print('\n')
all_data.append(info)
print(all_data)
# 现在有个这样一个列表,如何转为json
# python转json:dump(),dumps() 保存成一个json文件,所以用dump
# 爬虫,传输或者传递数据,用的很多都是json
with open('temperature.json','w')as file:
json.dump(all_data,file)
with open('temerature1.json','w',encoding='utf-8')as file:
# json.dump(all_data,file,ensure_ascii=False)
json_str=json.dumps(all_data,ensure_ascii=False)
file.write(json_str)
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
效果:
temperature.json:[{"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}, {"\u65e5\u671f": "28", "\u6700\u9ad8\u6e29\u5ea6": "\u9ad8\u6e29 15\u2103", "\u6700\u4f4e\u6e29\u5ea6": "\u4f4e\u6e29 7\u2103"}]
temerature1.json:[{"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}, {"日期": "28", "最高温度": "高温 15℃", "最低温度": "低温 7℃"}]
补充:JSON文件是文本文件的一种特殊形式,其核心价值在于结构化数据的存储与交换。而普通文本文件更侧重于通用文本信息的记录。两者在扩展名、解析方式及数据组织上差异显著,需根据实际需求选择。
特性 JSON文件 普通文本文件(.txt)
数据结构 必须符合JSON格式规范(键值对、数组等),具有严格的语法规则。 无固定结构,可包含任意文本内容(如纯文本、代码、HTML等)。
解析方式 需通过编程语言的JSON库(如Python的`json`模块)解析为对象或数组。 直接以字符串形式读取,无需特殊解析。
存储内容 专用于存储结构化数据(如配置信息、API响应、数据库记录)。 适用于任意文本信息(如日志、网页内容)。
扩展名 `.json` `.txt`或其他任意扩展名(通常为`.txt`)
操作流程:`json.loads()` 解析 → VSCode 操作 Python 对象 → `json.dump()` 写入新文件
中文显示:需同时设置 `ensure_ascii=False` 和 `encoding='utf-8'`。
验证方法:用文本编辑器(如 VSCode 自带编辑器)直接打开生成的 `.json` 文件,检查中文是否正常显示。
`json.loads()` 的作用与 VSCode 操作:
功能:`json.loads()` 将 JSON 字符串解析为 Python 对象(如字典、列表),使其可在 Python 程序中直接操作。
VSCode 操作:
解析后的 Python 对象(如字典)可直接通过键值访问、增删元素等操作。例如:
python
import json
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f) 解析为字典
data'new_key' = '新值' 直接操作字典
支持所有 Python 字典操作方法(如 `.update()`、`.pop()` 等)
注意:音视频和图片一般都是二进制文件,文本内容(字符串等)一般都为文本文件
作者:目标为成为电子高手