python的HTTP的请求库-Request


Request库

常用的url请求库,是python的第三方库

官方文档

中文文档

安装Request

pip安装

1
pip install request

wheel安装

wheel是 Python的一种安装包,其后缀为.whl,在网速较差的情况下可以选择下载wheel文件再安装,然后直接用p ip3命令加文件名安装即可。不过在这之前需要先安装wheel库

1
pip3 install wheel

然后在PyPI上下载对应的wheel文件。进入cmd中进入下载路径:

1
pip3 install xxxx.whl

源码安装

如果你不想用pip来安装,或者想获取某一特定版本,可以选择下载源码安装。此种方式需要先找到此库的源码地址,然后下载下来再用命令安装

requests 项 目的地址是: https://github.com/kennethreitz/requests

1
2
3
4
5
-- git下载源代码
git clone git://github.com/kennethieitz/requests.git

-- 或者使用curl下载
curl -OL https://github.com/kennethreitz/:requests/tmrba]l/nimster
1
2
3
4
-- 下载下来之后,进入目录,执行如下命令即可安装:
cd requests
python3 setup.py install
-- 命令执行结束后即可完成requests的安装

Request库使用

http://httpbin.org/get, 请求为get请求时作出响应,返回请求头信息

*http://httpbin.org/post, 请求为get请求时作出响应,返回请求头信息

七个主要方法

request(), get(), head(), put(), post(), patch(), delete()

GET请求

请求的链接为http://httpbin.org/get, 该网站会判断如果客户端发起的是GET请求的话,它返回相应的请求信息

1
2
3
4
import requests

url = 'http://httpbin.org/get'
r = requests.get(url)

params参数

用于url添加参数

通常参数都是以字典形式存储的

1
2
3
4
5
import requests

url = 'http://httpbin.org/get'
data = {'name': 'germey', 'age': 22}
r = requests.get(url, params=data)

headers参数

里面有的字段可以是User-Agent, Cookies, Host等

1
2
3
4
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_ll_4) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/52・0.2743・116 Safari/537・36'
}
r = requests.get(url, headers=headers)

响应

json()

返回类型实际上是*str类型,但是它很特殊,是 **JSON格式的,调 用 jso n()方法,就可以将返回结果是JSON格式的字符串转化为字典*

如果返回结果不是JSON格式,便会出现解析错误,抛出json.decoder.JSONDecodeErrar
异常

1
2
3
4
r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(type(r.json())
r.text
r.status_code
r.encoding和r.apparent_encoding
1
2
3
-- encoding 从header中猜测的编码方式
-- apparent_encoding 从内容分析的编码格式
r.encodeing = r.apparent_encoding
r.url
r.content
r.history
r.cookies

抓取网页

通常是直接返回html文本或json格式数据

抓取二进制数据

图片、音 频 、视频这些文件本质上都是由二进制码组成的,想要抓取它们,就要拿到它们的二进制码

1
2
3
4
5
r = requests.get(url) # 假设这里是图片链接
print(r.text) # 乱码
print(r.content) # 二进制数据
with open('favicon.ico', 'wb') as f:
f.write(r.content)

内置状态码查询对象

1
exit() if not r.status_code == requests.codes.ok else print('requests Successfully')

POST请求

1
2
data = {'name':'germey', 'age': '22'}
r = requests.post('http://httpbin.org/post', data=data)

提交内容在form字段中

响应

方法和get响应结果差不多

高级用法

文件上传

1
2
3
files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text) # 在请求头的files字段

Cookies

通过headers参数添加cookies
1
2
3
4
5
r = requests.get(url)
cookies = r.cookies # 可以发现它是RequestCookieJar类型。
然 后 用 items。 方法将其转化为元组组成的列表
for key, value in r.cookies.items():
print(key + '=' + value)
1
2
3
# 也可以直接用Cookie来维持登录状态
headers = {'Cookie': '.....', 'Host': '...', 'User-Agent': '....'}
r = requests.get(url, headers=headers)
通过cookies模块
1
2
3
4
5
6
7
cookies = 'x=xxxx;x=xxxxx;x=xxxx'
jar = requests.cookies.RquestsCookieJar()
headers = {'Host': 'xxx', 'User-Agent': 'xxx'}
for cookie in cookies.split(';'):
key, value = cooke.split('=', 1)
jar.set(key, value)
r = requests.get(url, cookies=jar, headers=headers)

会话维持

在 requests中,如果直接利用g et()或 post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面

请求时设置相同的Cookies

这种方法比较麻烦

1
2
3
#例
r1 = requests.post(xxx, headers={...,'Cookies'='xxx',....})
r2 = requests.get(xxx, headers={...,'Cookies'='xxx',....})
使用session
1
2
3
4
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text) # {"cookies": {"number": "123456789"}}

SSL证书验证

requests还提供证书验证。当请求有些url时,会检查ssl证书,如12306

1
2
3
4
r = requests.get('https://www.12306.cn')
print(r.status_code)
/*requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', *tls_process_server_certificate',
'certificate verify failed')],)",)*/

请求一个HTTPS站点,但是证书验证错误,就会报错。可以通过设置*verify参数的值为False***

1
2
3
4
5
6
7
8
r = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
>>>
/*/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py:852: InsecureRequestWarning: Unverified
HTTPS request is being made. Adding certificate verification is strongly advised. See:
https://urllib3•readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200*/

不过我们发现报了一个警告,它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽这个警告

1
2
3
4
5
6
7
# 设置屏蔽
import requests
from requets.packages import urllib3

urllib3.disable_warnings()
r = requests.get(url, verify=False)
print(r.status_code) # 200
1
2
3
4
5
6
# 捕获警告到日志
import logging
import requests
logging.captureWarning(True)
r = requests.get(url, verify=False)
print(response.status_code)
1
2
# 指定一个本地证书到客户端证书
r = requests.get(url, cert=('/path/server.crt', '/path/key'))

当然,我们也可以指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或
一个包含两个文件路径的元组。当然,上面的代码是演示实例,我 们 需 要 有crt和 key文件,并且指定它们的路径。注意,本地私有证书的key必须是解密状态,加密状态的key是不支持的

代理设置

由于频繁访问,可能会被限制IP或封IP

网站可能会弹出验证码,或者跳转到登录认证页面,更甚者可能会宜接封禁客户端
的 I P , 导致一定时间段内无法访问

HTTP代理
1
2
proxies = {'http': 'xxxx', 'https': 'xxxx'}
requets.get(url, proxies=proxies)

若代理需要使用HTTP Basic A u th ,可以使用类似http://user:password@host:port这样的语法来设置代理

1
2
3
proxies = {'http': 'http://user:password@10.10.1.10:3128'}  

requests.get(url, proxies=proxies)
SOCKS协议代理

除了基本的HTTP代理外, requests还 支 持 SOCKS协议的代理

首先,需要 安 装 socks这个库

1
pip3 install 'requests[socks]'
1
2
proxies={'http':'socks5://user:password@host:port', 'https': 'socks5://user:password@host:port'}
r = requests.get(url, proxies=proxies)

超时设置

为了防止服务器不能及时响应,应该设置一个超时时间,即超过了这个时间还没有得到响应,那就报错。这需要用到timeout参数

1
r = requests.get(url, timeout=1)

实际上,请求分为两个阶段,即 连 接 (co n n e ct)和 读 取 ( read )
上面设置的tim eout将用作连接和读取这二者的tim eout总和

如果要分别指定,就可以传入一个元组:

1
r = requests.get(url, timeout=(5, 11, 30))

如果想永久等待,可以直接将tim eout设置为 N on e,或者不设置直接留空,因为默认是None


有些路需要一个人走,有些事需要一个人扛,星光不问赶路人,时光不负有心人。

本文标题:python的HTTP的请求库-Request

文章作者:TTYONG

发布时间:2020年04月05日 - 15:04

最后更新:2022年03月06日 - 18:03

原始链接:http://tianyong.fun/%E5%B4%94%E5%BA%86%E6%89%8Dpython3%E7%88%AC%E8%99%AB-HTTP%E7%9A%84%E8%AF%B7%E6%B1%82%E5%BA%93-Request.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%