一、Requests简介
1. requests库简介
Urllib 和 Requests 模块是发起 http 请求最常见的模块。
虽然 Python 的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称“http for Humans”,说明使用更简洁方便。
Requests继承了urllib的所有特性。Requests支持http连接保持和连接池,支持使用cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数 据自动编码。
**requests 的底层实现其实就是 urllib3(urllib2 的升级版—python2 支持) **
Requests 的文档非常完备,中文文档也相当不错。Requests 能完全满足当前网络的需求, 支持 Python 2.6—3.6。
开源地址:http://github.com/kennethreitz/requests
中文文档 API:http://2.python-requests.org/zh_CN/latest/
2. 安装方式
利用 pip 安装或者利用 easy_install 都可以完成安装:
$ pip install requests
二、GET请求
- 导入requests
- 发送请求,返回响应
- 确定请求的URL
- 确定请求方式get
- 保存文件(html)
1. 全页面保存
例:将百度产品大全页面保存到本地
import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度产品大全.html','w',encoding='utf-8') as fp:
fp.write(response.text)
发现问题:
- 中文乱码
- 图片不显示
解决:
- 中文乱码:最根本原因是编码问题
content:获取页面二进制类型内容,使用content.decode(‘编码格式’),默认是utf-8大部分网页都是使用utf-8或者是gbk,解码时,尝试使用utf-8,如果乱码没有解决,换成gbk基本可以。如果还没有解决,使用response.encoding来解决
import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度产品大全.html','w',encoding='utf-8') as fp:
fp.write(response.content.decode())
- 图片不显示:图片是本地路径,我们本地没有,所以,不显示。
text和content的使用情况
- text获取页面文本类型数据,在大部分使用text获取数据时都不会出现乱码情况,如果乱码,使用content.decode()解决乱码。
- content()获取页面二进制类型的内容,在下载图片、视频、音频等媒体文件时,必须使用content()
2. params属性
当请求携带参数,参数少时可以直接写在url上,当参数过长则及其不方便,此时使用params属性加载参数。
params作用:自动的将参数按照地址栏的参数形式拼接
提取参数
在请求时传入参数params,接收字典类型数据,get请求的参数是放在Query String Parameters中,get请求时,传递的关键字参数是params
例:将新浪搜索python的页面保存至本地
import requests
params = {
# 定义参数字典
'q': 'python',
'c': 'news'
}
response = requests.get(url='http://search.sina.com.cn/', params=params)
with open('新浪搜索-python.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
3. headers属性
- 不管写什么爬虫,都加上请求头,至少加一个UA
- 如果加入UA之后还是访问不到数据,尝试加入cookie
- 如果加入cookie还是不好用,将全部的请求头都加入,以:开头的请求头不要加入
例:自定义百度搜索
import requests
# 自定义搜索内容
wd = input('请输入想要查询的内容:')
params = {
"wd": "python"
}
headers = {
# 定义请求头字典
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
response = requests.get(url='https://www.baidu.com/s', params=params, headers=headers)
print(response.headers)
with open(f'{wd}.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
三、POST请求
类似百度实时翻译的页面,输入一个单词实时出现翻译以及联想翻译,这种并不是get请求,而是post请求,
步骤与get相同:
- 导入requests
- 发送请求,返回响应
- 确定请求的URL
- 确定请求方式post
- 保存文件(html)
1. data属性
如果是post请求,需要携带参数,加入data的关键字参数,data接收字典格式数据
2. header属性
与get相同,都需要携带请求头属性,
如果获取异步请求的数据,最好将x-requested-with: XMLHttpRequest加入到请求头中
例:用户自定义输入单词,获取解释
import requests
# 自定义用户输入
kw = input('请输入想要查询的单词:')
# 定义参数字典
data = {
'kw':kw
}
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
'x-requested-with': 'XMLHttpRequest'
}
# 发起请求,接收响应
response = requests.post(url='https://fanyi.baidu.com/sug',data=data,headers=headers)
# 使用json()可以将json格式的字符串转换成字典
data_list = response.json()['data']
# 获取数据
for data in data_list:
# 获取单词
word = data['k']
# 获取解释
explain = data['v']
print(word,explain)
...
转载:https://blog.csdn.net/Zachary579/article/details/109823431