一、前言
1、requests简介
requests是一个很实用的 Python HTTP客户端库 ,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门==用于发送HTTP请求==,使用起来比urllib更简洁也更强大。
2. requests 安装
这里我直接在windows系统的系统命令行中安装,(python的版本是python3),
pip3 install requests
二、常用方法
序号 |
方法 |
描述 |
1 |
requests.request(url) |
构造一个请求,支持以下各种方法 |
2 |
requests.get() |
发送一个get请求 |
3 |
requests.post() |
发送一个post请求 |
4 |
requests.header() |
获取该HTML的头部信息 |
5 |
requests.put() |
发送put请求 |
6 |
requests.patch() |
提交局部修改的请求 |
7 |
requests.delete() |
提交删除请求 |
三、常用属性或方法
序号 |
属性或方法 |
描述 |
1 |
response.status_code |
响应状态码 |
2 |
response.content |
把response对象转换为二进制数据 |
3 |
response.text |
把response对象转换为字符串数据 |
4 |
response.encoding |
定义response对象的编码 |
5 |
response.cookie |
获取请求后的cookie |
6 |
response.url |
获取请求网址 |
7 |
response.json() |
内置的 JSON 解码器 |
8 |
Response.headers |
以字典对象存储服务器响应头,字典键不区分大小写 |
四、发送请求
1.发送get请求
1.不带参数的请求
1 2 3 4 5 6 7 8 9 10 11
| import requests
#定义百度URL,获取百度页面HTML url="http://www.baidu.com"
#使用get发送请求 res=response.get(url)
#将返回对象的二进制数据进行解码并输出 print(res.content.decode("UTF-8"))
|
2.带参数的请求
1 2 3 4 5 6
| import requests #将参数name和age放在get请求中 res=requests.get("http://httpbin.org/get?name=gemey&age=22")
#输出返回对象的文本结果 print(res.text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import requests #将参数name和age定义到字典params里 params{ "name":"tony", "age":18 } url="http://www.baidu.com"
#发送请求 res=request.get(url=url,params=params)
#输出返回对象的文本结果 print(res.text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import requests #将参数写入字典内 params={ "name"="tony", "age"=20 } #定义HTTP头信息 hearders={ "Urser-agent":"Mozilla/5.0 (Linux; Android 8.1.0; SM-P585Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "referer":"https://www.abidu.com", "Cookie":"12345678" } #发送请求参数 url="https://www.abidu.com" #发送请求参数 res=requests.get(url=url,params=params,headers=headers) #输出返回对象的文本结果 print(res.text)
|
2.发送post请求
post请求用于提交参数,所以直接进行带有参数的post请求参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import requests #将参数写入字典内 params={ "name"="tony", "age"=20 } #定义HTTP头信息 hearders={ "Urser-agent":"Mozilla/5.0 (Linux; Android 8.1.0; SM-P585Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "referer":"https://www.abidu.com", "Cookie":"12345678" } #发送请求参数 url="https://www.abidu.com" #发送请求参数 res=requests.post(url=url,params=params,headers=headers) #输出返回对象的文本结果 print(res.text)
|
五、读取内容
大部分情况下,我们可以直接使用text输出返回内容,但是当有中文的情况下,使用text会出现乱码的情况。
上面提到了,content和text的区别在于content存储的是字节码,而text存储的是Beautifulsoup模块根据猜测的编码方式将content内容解码后的结果。
所以要解决text乱码的问题,就需要==使用content对象手动解码==后才能显示
1.以content方式读取
1 2 3 4 5 6 7
| import requests url="http://www.baidu.com" res=requests.get(url) #不进行解码,直接输出 print(res.content) #进行解码 print(res.content.decode("UTF-8"))
|
2.以text方式读取
1 2 3 4
| import requests url="http://www.baidu.com" res=requests.get(url) print(res.text)
|
输出结果:中文部分出现乱码
3.读取json数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import requests #将参数写入字典内 params={ "name"="tony", "age"=20 } #定义HTTP头信息 hearders={ "Urser-agent":"Mozilla/5.0 (Linux; Android 8.1.0; SM-P585Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "referer":"https://www.abidu.com", "Cookie":"12345678" } #发送请求参数 url="https://www.abidu.com" #发送请求参数 res=requests.get(url=url,params=params,headers=headers) #输出返回对象的文本结果 print(res.text)
|
json是一种文本格式, 使用键值对的形式组织数据,数据之间使用逗号 ,
分隔
4.读取cookies
1 2 3 4 5
| import requests url="http://www.baidu.com" res=requests.get(url) #这里直接使用cookies返回的是RequestcookiesJar对象,所以需用再用extract_cookies对象对该对象进行解析 print(res.cookies.extract_cookies)
|
六、其他方法
1.设置超时报错
可以通过==timeout属性==设置超时时间,一旦超出这个时间还没得到响应内容,就会提示报错
1 2 3 4 5
| import requests url="http://www.baidu.com" #设置超时上线时间为1s res=requests.get(url=url,timeout=1) print(res.content.decode(UTF-8))
|
2.处理异常
当超过设定时间会出现报错,这时我们可以使用try语句处理异常
1 2 3 4 5 6 7 8 9 10 11 12 13
| import requests url="http://www.baidu.com"
#使用try语句处理异常 try:
res=requests.get(url=url,timeout=1) print(res.content.decide("UTF-8"))
except exceptions.timeout as e: print(e) except exceptions.HTTPError as e: print(e)
|
到这里,你可能对expect expections as e 有些疑惑,请点击这里
3.设置代理
代理格式:proxies={‘协议’:’协议://IP:端口号’}
提示:当我们抓取的地址为http时,则设置http代理,反之则设置https
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import requests url="http://www.baidu.com"
#使用字典定义代理 proxies={ 'http':'http://123.45.67.76:8888', 'http':'http://123.45.67.76:4433' } #使用try语句处理异常 try:
res=requests.get(url=url,timeout=1,proxies=proxies) print(res.content.decide("UTF-8"))
except exceptions.timeout as e: print(e) except exceptions.HTTPError as e: print(e)
|
4.使用session进行会话控制
直接 requests.get() 或者 requests.post() 发送GET请求或POST请求;当然也是可以带上 cookies 和 headers 的,但这都是一次性请求,你这次带着cookies信息,后面的请求还得带。
如果使用sessionl来发起请求,session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie,从而实现回话保持。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import requests
#使用session,需要先实例化一个对象 session=requests.session()
headers{ 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36", 'Referer': "https://creator.douyin.com/"
}
url='https://sso.******.com/get_qrcode/?next=https:%2F%2Fcreator.douyin.com%2Fcreator-micro%2Fhome&aid=2906&service=https:%2F%2Fcreator.douyin.com&is_vcd=1&fp=ktv0uumo_gD7FPCuy_MfX7_44zL_9T1C_6i8sUgr4bDT6'
data1={ "name":"test" "passwd":"passwd" } data2={ "name":"test", "age":20 }
#使用session对象发起请求,进行登录 try: res=session.get(url=url,timeout=1,headers=headers,data=data1) print(res.json()) #使用的登录后的session对需要登录的操作再次发起请求。 res2=session.post(url,data=data2) except exceptions.timeout as e: print(e) except exceptions.HTTPError as e: print(e)
|