Reqeusts概述
问题:为什么要学习requests,而不是urllib?
- requests的底层实现就是urllib
- requests简单易用
- requests在python2 和python3中通用,方法完全一样
- requests能够自动帮助我们解压(gzip压缩的等)网页内容
requests的作用
- 作用:发送网络请求,返回响应数据
-
中文文档 API:
-
如何使用requests来发送网络请求?
requests的基本使用
- 安装requests模块:
pip install requests
-
使用步骤(三部曲):
- 导入模块:
import reqeusts
- 发送get请求,获取响应:
response = requests.get(url)
- 从响应中获取数据
- 导入模块:
-
核心代码: 发送get请求
response = requests.get(url)
- response的常用属性:
- response.text
- respones.content 二进制形式的响应数据
- response.status_code 响应状态吗
- response.headers 响应头
- response.request.headers 请求头
- response.text 和response.content的区别
- response.text
- 类型:str
- 解码类型: 根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码
- 如何修改编码方式:response.encoding=”gbk”
- response.content
- 类型:bytes
- 解码类型: 没有指定
- 如何修改编码方式:response.content.deocde(“utf8”)
- 更
推荐
使用response.content.deocde()
的方式获取响应的html页面
- response.text
- 需求:通过requests向百度首页发送请求,获取百度首页的数据
# 1. 导入这个模块; 如果没有就安装一下: pip install resquests
import requests
# 2. 发送请求(get)
response = requests.get("http://www.baidu.com/")
# 3. 读取数据
# response.encoding = "utf8"
# #print(response.encoding) #ISO-8859-1 拉丁文编码表; 希腊等一些欧洲国家
# text 属性: 返回 自动识别编码的字符穿, 如果要指定编码,可以使用encoding的属性来指定编码
# content = response.text
# print(content)
# content 属性: 获取的是二进制数据,使用decode进行解码
data = response.content.decode()
print(data)
# response.status_code 响应状态吗
print(response.status_code)
# response.request.headers 请求头
print(response.request.headers)
# response.headers 响应头
print(response.headers)
怎么才能做到100%的解决乱码问题
- 先使用decode()来尝试解码, 现在国内80%网站都是用utf-8进行编码的
- 如果上面面没有解决乱码问题,就指定GBK的编码方式, 个别网站使用的是GBK
- 如果指定GBK还不行,就request的自动推断功能了,通过text 属性获取
# 1. 现在国内80%网站都是用utf-8进行编码的
data = response.content.decode()
print(data)
# 2. 如果上面面没有解决乱码问题,就指定GBK的编码方式
# data = response.content.decode("GBK")
# 3. 如果指定GBK还不行,就request的自动推断功能了,通过text 属性获取
# data = response.text
练习: 使用requests下载一张图片保存到本地
- 思路:
- 导包
- 发送请求,获取响应
- 打开文件,把数据写入文件
- 代码:
# 1. 导入requests模块
import requests
# 2. 发送请求获取二进制数据(bytes)
respone = requests.get("http://imgsrc.baidu.com/image/c0%3Dpixel_huitu%2C0%2C0%2C294%2C40/sign=098c3f828cd6277ffd1f3a7841407a5c/3c6d55fbb2fb4316e3afd1432ba4462309f7d353.jpg")
# 获取二进制数据; 注意: 这里不要解码, 因为图片,视频等文件都是二进制的不是文本,不需要解码
# data = respone.content
# 3. 把数据写入文件
with open("壁纸.jpg", "wb") as f:
f.write(respone.content)