request和requests库的区别
request:在之前学习web时,需要获取客户端传来的一些数据时,可以通过request对象进行获取,例如method,form等,这些数据都封装在request对象中。
requests:用于在客户端浏览器对服务器进行访问时使用的库,服务器的回应可以通过requests进拿到。
request的优势
- requests在python2 和python3中通用,方法完全一样,urllib2在python2和python3中的名称不同
- 工作中爬虫基本都使用requests
- 虽然Python的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 "HTTP for Humans",说明使用更简洁方便。requests 继承了urllib的所有特性,requests的底层实现就是urllib2。
- requests能够自动帮助我们解压(gzip压缩的等)网页内容,简单易用
- Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
功能特性
Requests 完全满足今日 web 的需求:
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc
- Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行。
request的使用
在使用之前请安装Anaconda,并创建python项目,选择Anaconda中的python解释器。
1.requests
pip install requests
2.使用requests
响应 = requests.方法(请求地址)
response = requests.method(url)
3.requests.get(url) = response的返回值
response.text #获取服务器响应的str类型的响应
response.content #获取字节bytes类型的响应
response.status_code #获取响应的状态码
response.headers #获取响应头
response.request #获取响应对应的请求
request的GET方式
get请求方式:
- 访问baidu:
import requests
resp = requests.get('https://www.baidu.com')
print(resp) #<Response [200]>
- 以get方式带参数访问测试网站时:
1.直接在url后加上参数即可
import requests
resp1 = requests.get("http://httpbin.org/get?name=lizhao&age=20")
print(resp1.text)
2.单独传递参数,get方法的参数有url和params两个,将两部分分开写
params = {
'name':'lizhao',
'age':'20'
}
resp2 = requests.get("http://httpbin.org/get",params=params)
print(resp2.text)
两部分的响应一摸一样:
- 但是上边的响应其实是json格式的字符串,那么如果要取出里边的数据怎么办?
调用resp.json()直接将json字符串转为dict类型
#json()直接转为dict类型
print(resp1.json()) #{'args': {'age': '20', 'name': 'lizhao'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f0dc7a5-cf30d50fea502634727b91f1'}, 'origin': '111.18.58.96', 'url': 'http://httpbin.org/get?name=lizhao&age=20'}
print(type(resp1.json())) #<class 'dict'>
- 修改编码方式
- 修改baidu响应的编码方式
import requests
#访问baidu
resp = requests.get('https://www.baidu.com')
print(resp.text)
print(resp.encoding) #ISO-8859-1
#修改编码方式
resp.encoding = 'utf-8'
print(resp.text)
print(resp.encoding) #utf-8
响应结果:
- 获取字节格式的响应
print(resp.content) #获取字节的响应
print(resp.content.decode()) #直接转为utf-8
响应结果:
- 获取响应头
print(resp.headers)
获取GitHub的ico头像
import requests
resp = requests.get('https://github.com/favicon.ico')
print(resp.content)
#二进制方式写入文件
with open('github.ico','wb') as f:
f.write(resp.content)
print('完成')
运行结果:
requests的POST请求
在之前的例子中都是以get请求进行访问的,那么post是怎样请求的呢?
post请求函数:
传递的参数是dat还是json由服务器决定。
post请求:
import requests
#设置请求头
header={
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
#请求数据
data = {
'name' : 'lizhao',
'age' : 22
}
#发送请求
req = requests.post('https://httpbin.org/post',data=data,headers=header)
print(req.text)
print(req.status_code) #200
print(req.json())
在请求的headers中加入用户代理User-Agent。
结果:
案例访问金山词霸,获取翻译结果
需求 1、构造url 2、请求头 3、构造请求体 4、发送请求,输出数据 如下如是浏览
响应:
代码:
import requests
xurl = 'http://fy.iciba.com/ajax.php?a=fy'
xform = {
'f':'auto', #翻译前语言类型
't':'auto', #想要翻译的类型
'w':'你好' #翻译内容
}
xhead = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
#发送请求
resp = requests.post(url=xurl,data=xform,headers=xhead)
#接收数据dict类型
json_data = resp.json()
print(json_data)
print(json_data['content']['out']) #取出翻译结果
结果:
网友评论