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 | -- git下载源代码 |
1 | -- 下载下来之后,进入目录,执行如下命令即可安装: |
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 | import requests |
params参数
用于url添加参数
通常参数都是以字典形式存储的
1 | import requests |
headers参数
里面有的字段可以是User-Agent, Cookies, Host等
1 | headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_ll_4) AppleWebKit/537.36 (KHTML, like Gecko) |
响应
json()
返回类型实际上是*str类型,但是它很特殊,是 **JSON格式的,调 用 jso n()方法,就可以将返回结果是JSON格式的字符串转化为字典*
如果返回结果不是JSON格式,便会出现解析错误,抛出json.decoder.JSONDecodeErrar
异常
1 | r = requests.get("http://httpbin.org/get") |
r.text
r.status_code
r.encoding和r.apparent_encoding
1 | -- encoding 从header中猜测的编码方式 |
r.url
r.content
r.history
r.cookies
抓取网页
通常是直接返回html文本或json格式数据
抓取二进制数据
图片、音 频 、视频这些文件本质上都是由二进制码组成的,想要抓取它们,就要拿到它们的二进制码
1 | r = requests.get(url) # 假设这里是图片链接 |
内置状态码查询对象
1 | exit() if not r.status_code == requests.codes.ok else print('requests Successfully') |
POST请求
1 | data = {'name':'germey', 'age': '22'} |
提交内容在form字段中
响应
方法和get响应结果差不多
高级用法
文件上传
1 | files = {'file': open('favicon.ico', 'rb')} |
Cookies
通过headers参数添加cookies
1 | r = requests.get(url) |
1 | # 也可以直接用Cookie来维持登录状态 |
通过cookies模块
1 | cookies = 'x=xxxx;x=xxxxx;x=xxxx' |
会话维持
在 requests中,如果直接利用g et()或 post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面
请求时设置相同的Cookies
这种方法比较麻烦
1 | #例 |
使用session
1 | s = requests.Session() |
SSL证书验证
requests还提供证书验证。当请求有些url时,会检查ssl证书,如12306
1 | r = requests.get('https://www.12306.cn') |
请求一个HTTPS站点,但是证书验证错误,就会报错。可以通过设置*verify参数的值为False***
1 | r = requests.get('https://www.12306.cn', verify=False) |
不过我们发现报了一个警告,它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽这个警告
1 | # 设置屏蔽 |
1 | # 捕获警告到日志 |
1 | # 指定一个本地证书到客户端证书 |
当然,我们也可以指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或
一个包含两个文件路径的元组。当然,上面的代码是演示实例,我 们 需 要 有crt和 key文件,并且指定它们的路径。注意,本地私有证书的key必须是解密状态,加密状态的key是不支持的
代理设置
由于频繁访问,可能会被限制IP或封IP
网站可能会弹出验证码,或者跳转到登录认证页面,更甚者可能会宜接封禁客户端
的 I P , 导致一定时间段内无法访问
HTTP代理
1 | proxies = {'http': 'xxxx', 'https': 'xxxx'} |
若代理需要使用HTTP Basic A u th ,可以使用类似http://user:password@host:port这样的语法来设置代理
1 | proxies = {'http': 'http://user:password@10.10.1.10:3128'} |
SOCKS协议代理
除了基本的HTTP代理外, requests还 支 持 SOCKS协议的代理
首先,需要 安 装 socks这个库
1 | pip3 install 'requests[socks]' |
1 | proxies={'http':'socks5://user:password@host:port', 'https': 'socks5://user:password@host:port'} |
超时设置
为了防止服务器不能及时响应,应该设置一个超时时间,即超过了这个时间还没有得到响应,那就报错。这需要用到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
有些路需要一个人走,有些事需要一个人扛,星光不问赶路人,时光不负有心人。