1、简介
Requests是⼀个优雅⽽简单的Python HTTP库,专为⼈类⽽构建。
Requests是有史以来下载次数最多的Python软件包之⼀,每天下载量超过400,000次。
之前的urllib做为Python的标准库,因为历史原因,使⽤的⽅式可以说是⾮常的麻烦⽽复杂的,⽽且官⽅⽂档也⼗分的简陋,常常需要去查看源码。与之相反的是,Requests的使⽤⽅式⾮常的简单、直观、⼈性化,让程序员的精⼒完全从库的使⽤中解放出来。
2、安装
在命令行窗口输⼊命令:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
3、发送请求
使⽤ Requests 发送⽹络请求⾮常简单。导包之后添加⽅法进⾏。
Requests的请求不再像urllib⼀样需要去构造各种Request、opener和handler,使⽤Requests构造的⽅法,并在其中传⼊需要的参数即可。
每⼀个请求⽅法都有⼀个对应的API,⽐如GET请求就可以使⽤get()⽅法,⽽POST请求就可以使⽤post()⽅法,并且将需要提交的数据传递给data参数即可,⽽其他的请求类型,都有各⾃对应的⽅法:
import requests
resp = requests.get('https://www.baidu.com')
resp = requests.post('http://httpbin.org/post', data={'key':'value'})
resp = requests.put('http://httpbin.org/put', data={'key':'value'})
resp = requests.delete('http://httpbin.org/delete')
resp = requests.head('http://httpbin.org/get')
resp = requests.options('http://httpbin.org/get')
print(resp)
发起请求的⽅法变得简单,我们只需要着重关注⼀下发起请求的参数 :
request源码
def request(url,params=None, headers=None, cookies=None,timeout=None,allow_redirects=True,proxies=None,verify=None, data=None,json=None): pass
httpbin.org
这个网站是程序员用来做测试的,用来验证请求
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39",
"X-Amzn-Trace-Id": "Root=1-643813dc-7be19f3e27c8a4696424b8cc"
},
"origin": "58.212.74.124",
"url": "http://httpbin.org/get"
}
(1)url
添加请求路径
import requests
url='https://www.baidu.com/'
response = requests.get(url=url)
print(response)
运行结果:
httpbin.org
(2)params
添加请求参数
传递URL参数也不⽤再像urllib中那样需要去拼接URL,⽽是简单的,构造⼀个字典,并在请求时将其传递给params参数,此时,查看请求的URL,则可以看到URL已经构造正确.
eg:
1.在url中直接添加参数
import requests
url = 'http://httpbin.org/get?key1=value1&key2=value2'
response = requests.get(url=url)
print(response.text)
2.构造字典
import requests
url = 'http://httpbin.org/get'
params = {
'key1':'value1','key2':'value2'
}
response = requests.get(url=url,params=params)
print(response.text)
运行结果:
(3)headers
添加请求头
如果想⾃定义请求的Headers,同样的将字典数据传递给headers参数。
通过添加请求头来伪造自己的身份
eg:
import requests
url = 'https://httpbin.org/get'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
print(response.text)
运行结果:
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
# 携带的内容:操作系统、浏览器等
(4)cookies
状态保持
储存用户身份
Requests中⾃定义Cookies也不⽤再去构造CookieJar对象,直接将字典递给cookies参数。
服务器是不记录用户信息的,为了让服务器能够识别用户,用户每次访问的时候就给它一个cookies,这个cookies保存在浏览器(本地电脑)。
eg:
1.在请求头中构造
import requests
url = 'https://httpbin.org/get'
headers={
"User-Agent": "",
'cookie': 'crawler',
'referer': 'crawler' # 防盗链
}
response = requests.get(url=url,headers=headers)
print(response.text)
2.单独构造
import requests
url = 'https://httpbin.org/get'
headers={
"User-Agent": "crawler1"
}
cookies = {'name':'crawler1' }
response = requests.get(url=url,headers=headers,cookies=cookies)
print(response.text)
运行结果:
(5)timeout
设置超时时间
当访问超时,设置timeout参数即可。
import requests
url = 'http://www.baidu.com'
resp = requests.get(url, timeout=3)
print(resp.text)
由于是国外的网站,访问会超时,会一直等待响应,这时我们设置超时时间,超时时间已过之后就会超时报错
运行结果:
(6)proxies
设置代理
当我们需要使⽤代理时,同样构造代理字典,传递给proxies参数。
请求端ip地址
eg:
import requests
url = 'https://httpbin.org/get'
proxies = {
'http':'183.209.124.38:8088' # 代理ip
}
response = requests.get(url=url,proxies=proxies)
print(response.text)
运行结果:
快代理 - 企业级HTTP代理IP云服务我这里使用的代理ip不可用,可以购买使用:快代理 - 企业级HTTP代理IP云服务
(7)verify
证书忽略验证
有时候我们使⽤了抓包⼯具,这个时候由于抓包⼯具提供的证书并不是由受信任的数字证书颁发机构颁发的,证书默认是开启的,所以证书的验证会失败,所以我们就需要关闭证书验证。在请求的时候把verify参数设置为False就可以关闭证书验证了。
eg:
import requests
url = 'https://httpbin.org/get'
response = requests.get(url=url,verify=False) # 出现警告
print(response.content.decode())
运行结果:
PS:关闭验证后,会有⼀个⽐较烦⼈的warning,当不影响运行的结果,关闭即可。
import warnings
warnings.filterwarnings("ignore")
(8)data
携带数据
POST请求发送Form表单数据
eg:
import requests
url = 'http://httpbin.org/post'
data = {"name":"spider"}
resp = requests.post(url, data=data)
print(resp.text)
运行结果:
(9)json
携带数据
eg:
url = 'https://httpbin.org/post'
data = {
'name':'crawler'
}
response = requests.post(url=url,json=data)
print(response.text)
运行结果:
注意:
PS:json和data 不可以同时添加
4、response响应对象
# print(resp.text) # 转换成字符串 文本形式输出源代码
# print(resp.text[0])
# str类型
print(resp.content) # 转换成字节 原因: 1.网页源代码乱码 2.保存图片、视频、音频等二进制
# bytes类型
# print(resp.content.decode # 解码 ,默认utf-8
# print(resp.content.decode('utf-8'))
# <class 'builtin_function_or_method'> ——内置函数
print(resp.status_code) # 状态码
# int类型
# print(resp.headers) # 响应头
# print(resp.cookies) # 响应的cookie
# print(resp.url) # 请求的url
# print(resp.request.url) # 请求的url
# print(resp.request.headers) # 请求头
# 方法json
# print(resp.json()) # 转换成json类型
# print(resp.json()['headers']['X-Amzn-Trace-Id'])
# print(resp.text)
# print(resp.text[-11:-8])
# 也可以用python中内置的json包
import json
data_json = json.loads(resp.text) # 字符串转为 dict
print(data_json['headers']['X-Amzn-Trace-Id'])
# print(json.dumps(data_json)) # dict 转为 字符串类型