一、介绍
官方文档:Requests: HTTP for Humans™ — Requests 2.28.0 documentation
二、 response响应对象
1. 响应对象编码
当你发出一个请求时,requests模块会有根据的对响应内容的编码进行猜测并解码,可以使用response.text
获取响应正文即网页源码。如果出现乱码可以通过response.encoding =
的方式更改编码。
>>> print(response.encoding) ISO-8859-1 >>> response.encoding = 'utf-8' >>> print(response.encoding) utf-8
以字节形式访问响应正文response.content.decode('默认为utf-8')
-
response.text
类型:str
解码:按照requests的猜测进行解码
-
response.content
类型:bytes(字节)
解码:没有指定,可以自行更改解码类型
2. 其他常用属性和方法
-
response.url -响应的url
-
response.status_code -状态码
-
response.request.headers -响应对应的请求的请求头
-
response.headers -响应头
-
response.cookies -响应携带的cookies,返回cookiejar类型
三、发送请求
以百度(百度一下,你就知道)为例:
import requests url = 'http://www.baidu.com' response = requests.get(url) print(len(response.text)) # 打印结果其源代码长度大概是在2000左右
这个结果与我们在浏览器中使用访问百度网页的源码长度相差甚远。并且代码所展示的页面也有差异。如果我们加上请求标头就可以通过代码得到正常浏览器访问百度所得到的页面或者html源代码文件。
在浏览器中检查网页,点击网络再刷新进行抓包,查看标头,标头下面有请求头,请求头中有三项最为重要:user-agent、cookie和referer。对于百度,将其中的user-agent写到我们的headers中即可得到完全的源码文件。
有两种带参数url请求的发送方法:
-
直接在url的后面带上参数(无关参数可以删去)
-
将url参数写到一个字典中,再在发送请求时将url参数字典赋值给params
cookie参数字典的使用
在发送请求时,可以构建一个存放cookie的字典,并在get中赋值给cookies,以此来替代headers中的cookies
构建cookies字典两种方式
import requests url = '' headers = {'user-agent': '......'} temp = "buvid3=0F10E46C-44E0-45F1-9070-8AB1DCC95E63148800infoc; _uuid=98799F81-5EF4-D431-51E4-CAF5828BE21641934infoc; buvid4=8480F3F3-1267-F3ED-8FB1-D81E032B9FFB43101-022020420-+d37gNVrI6ls7BZ8Uxpd9w==; LIVE_BUVID=AUTO4316439791453727; buvid_fp_plain=undefined; i-wanna-go-back=-1; b_ut=5; rpdid=|(kJRlRuum~l0J'uYRJm)uYR|; DedeUserID=351383250; DedeUserID__ckMd5=4136b315923a5cfa; buvid_fp=75d89ba0acd1540d6d9475050cafb7f5; fingerprint3=557df58fe665b4a1198a52dd75c6b5d4; CURRENT_BLACKGAP=0; nostalgia_conf=-1; fingerprint=d453637bc7394257eba7d0f7efc6d034; hit-dyn-v2=1; CURRENT_QUALITY=80; blackside_state=0; go_old_video=1; SESSDATA=c10b62b5,1670840684,8454e*61; bili_jct=f2155d87c5f3f773f27a9ee40953b7c5; sid=inmptbgw; bp_video_offset_351383250=673063534848901100; PVID=1; CURRENT_FNVAL=4048; innersign=1; bsource=share_source_copy_link; b_timer={"ffp":{"333.1007.fp.risk_0F10E46C":"18179F8BB93","333.788.fp.risk_0F10E46C":"1817A41EDAC","333.999.fp.risk_0F10E46C":"1817A0F5E8A","444.41.fp.risk_0F10E46C":"1817A1C071B","333.934.fp.risk_0F10E46C":"1817A251FD0"}}; b_lsid=6C1065E74_1817A4BE4A6" # 首先对字符串进行分割 cookies_list = temp.split('; ') # 创建一个字典 cookies = {} for n in cookies_list: cookies[n.split('=')[0]] = cookies[n.split('=')[-1]] # 等效于cookies{cookie.split('=')[0]: cookie.split('=')[-1]for n in cookies_list} response = requests.get(url, headers=headers, cookies=cookies)
超时参数的设置
在发送请求时,如果超过了一定的时间没能得到响应,则会抛出异常。默认为180秒,我们可以使用timeout来设置时间。
import requests url = '' response = requests.get(url, timeout=3) # 发送请求后,3秒内返回响应,否则抛出异常
四、代理
1. 简介
代理ip是一个ip,指向的是一个代理服务器。代理服务器能够帮助我们向目标服务器发送请求。相当于我们浏览器与目标服务器之间的中介。
2. 正向代理与反向代理
从发送请求的一方,来区分正向与反向。
-
为浏览器即发送请求的一方转发请求的,叫正向代理
-
浏览器知道最终处理请求的服务器的真实IP地址,如VPN、翻墙软件。
-
-
不为浏览器转发请求,而为最终处理请求的服务器转发请求的,叫反向代理
-
浏览器不知道服务器的真实地址,如nginx。
-
3. 代理分类
根据匿名度分类
透明代理,可以隐藏你的IP地址,但对方仍能查到你是谁。目标服务器收到的请求头如下:
REMOTE_ADDR = Proxy IP HTTP_VIA = Proxy IP HTTP_X_FORWARD_FOR = Your IP
匿名代理,对方只知道你用了代理,但不知道你是谁。目标服务器收到的请求头如下:
REMOTE_ADDR = Proxy IP HTTP_VIA = Proxy IP HTTP_X_FORWARD_FOR = Proxy IP
高匿代理,对方无法确定你是否使用了代理。使用高匿代理效果最好,是最好的选择。目标服务器收到的请求头如下:
REMOTE_ADDR = Proxy IP HTTP_VIA = no determined HTTP_X_FORWARD_FOR = no determined
根据协议分类
根据网站使用的协议不同,需要使用相应协议的代理服务:http代理、https代理、socks代理。
4. 代理参数proxies的使用
为了让服务器认为不是在同一个客户端进行请求,避免因频繁向同一个域名发送请求而被封IP,所以我们写爬虫需要使用代理IP。
response = requests.get(url, proxies=proxies) # proxies是一个字典类型 # proxies字典有一个十分重要的格式要求 proxies = { "http": "http://IP地址:端口号", "https": "https://IP地址:端口号" } # 需要根据url地址的协议来选择相应的代理
网上有很多可以用的代理IP(也有很多无法使用的),可以自行百度。
代理使用失败,两个结果:程序就这样卡住;程序报错。(前提是代码没有其他问题)
五、使用verify参数忽略CA证书
CA证书:简单说,就是一个验证你所访问的网站是否真的是你所访问的网站,相当于一封介绍信上的公章。仅针对https协议,所有使用https协议的网站都会有这么一个验证机制。如果你访问的网站证书出现问题,那么浏览器会对你进行询问,你可以选择是否继续访问该网站。
关于CA证书更多详情信息:数字证书及CA详解_盐水煮毛豆的博客-CSDN博客_ca证书
如果我们使用requests访问的网站证书有问题,那么程序会报错。‘certificate verify failed’
response = requests.get(url, verify=Flase) # 此时程序将忽略CA证书的认证,会返回响应和一个警告
六、post请求
以下情况可能用到post请求:
-
登录注册
-
传输大文本内容时
使用post请求需要另外传入一个请求体字典,赋给data
response = requests.post(url, data=data) # 其余参数用法与get方法一样
data数据的获取
-
固定值
-
输入值
-
预设值——静态文件 -在静态html文件中获取
-
预设值——发送请求 -对指定地址发送请求获取
-
客户端(浏览器)生成的值 -分析js,模拟生成获取
七、requests.session的使用
1. 简介
session是requests模块里面的一个类,可以自动处理获取响应中产生的cookie,从而达到一个状态保持的目的。
作用:自动处理cookie,下一次请求会携带上一次的cookie。
2. session的使用方法
session = requessts.session() response = session.get(url, ...) response = session.post(url, data, ...)