一、前言

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.带参数的请求

  • 将参数放在url中进行请求
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)

  • 自定义HTML头进行请求
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)