python3-Request库详解
通过urllib 的基本用法,但是其中确实有不方便的地方,比如处理网页验证和 Cookies 时,需要写 Opener 和 Handler
来处理。 为了更加方便地实现这些操作,就有了更为强大的库 requests
1.requests库简介
1.1 requests库的安装
在命令行界面中运行如下命令, 即可完成 requests 库的安装:
pip3 install requests
1.2 基本用法
urllib 库中的 urlopen()方法实际上是以 GET 方式请求网页,而 requests 中相应的方法就是 get() 方法
import requests
r = requests.get('https://www.csdn.net/')
print(type(r))
print(r.status_code)
print(type(r. text))
print(r.text)
print(r.cookies)
运行结果:
这里我们调用 get()方法实现与 urlopen()相同的操作,得到一个 Response 对象,然后分别输出 了 Response 的类型、状态码、响应体的类型、内容以及 Cookies。
1.3 Get请求
HTTP 中最常见的请求之一就是 GET请求
- 构建一个最简单的 GET请求,请求的链接为 http://httpbin.org/get
import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
运行结果
- 如果要附加额外的信息,比如现在想添加两个参数, 其中 name 是 germey, age 是 22。 要构造这个请求链接
r = requests.get(‘http://httpbin.org/get?name=germey&age=22’)
import requests
data={
'name':'germey',
'age':'22'
}
r = requests.get('http://httpbin.org/get',params=data)
print(r.text)
运行结果
- 抓取网页例如知乎
若代码是如下形式:
import requests
import re
r=requests.get("https://www.zhihu.com/",)
print(r.text)
运行结果
这里我们加入headers信息
mport requests
import re
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
r=requests.get("https://www.zhihu.com/", headers=headers)
print(r.text)
运行结果
- 抓取二进制数据,下面以 GitHub 的站点图标为例
-import requests
r=requests.get("https://github.com/favicon.ico")
print(r.text)
print(r.content)
这里打印了 Response 对象的两个属性,一个是 text,另一个是 content
接着,我们将刚才提取到的图片保存下来 :
import requests
r=requests.get("https://github.com/favicon.ico")
with open('favicon','wb') as f:
f.write(r.content)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200126195924321.png)
发现出现文件
我们刚刚保存的图片
1.4 Post请求
import requests
data={ 'age':'22'}
r=requests.post("http://httpbin.org/post",data=data)
print(r.text)
输出结果
1.5 响应
import requests
r=requests.get("https://www.csdn.net/")
print(r.status_code)
print(r.headers)
print(r.cookies)
运行结果
状态码常用来判断请求是否成功,而 requests 还提供了一个内置的状态码查询对象 requests.codes,
2.高级用法
2.1 文件上传
requests 可以模拟提交一些数据。 假如有的网站需要上传文件,我们也可以用它来实现
import requests
files = {'file ' : open (’favicon.ico’,'rb’)}
r = requests.post(”http://httpbin.org/post”, files=files) print(r.text)
在前一节中我们保存了一个文件 favicon.ico,这次用它来模拟文件上传的过程。 需要注意的是, favicon.ico 需要和当前脚本在同一 目录下。
2.2 Cookies
前面我们使用 urllib 处理过 Cookies,写法比较复杂,而有了 requests,获取和设置 Cookies 只需 一步即可完成。
import requests
r=requests.get("https://www.baidu.com")
print(r.cookies)
我们也可以直接用 Cookie 来维持登录状态
import requests
headers={
'Cookie':'_zap=2c12f14e-ef5d-4afc-ab3e-af33e0d7ed0b; d_c0="ANDsdiitNxCPTspQdwQQy2y1EwauWeT9H3M=|1571394286"; _xsrf=APdnMsYkSILBvUiKknwPxvtpK6EOacPA; r_cap_id="NmRmZDY1NmM0YzZjNGE3Njg5YmM1MzM5MjNhNzI3ZjE=|1579144278|231a7c1fec00014281cfb717ea77867c2e122535"; cap_id="Y2VlODAxNWYwYzIyNDQ3NTlkZThhZDkwNDhhZTNiMDc=|1579144277|bc245c6af50afe5749eab0f8d357161829810f6a"; l_cap_id="YjQwNzAzNmYzMTA0NDkwZjliOGI0OWYyMzVmNzYxYzM=|1579144278|f2e2c15cfd95c7af51ddf9997ca386d4a3711824"; auth_type=cXFjb25u|1579144288|87cf27a6b4af8d334fa5435775572d18aee1f21d; token="QzUzMjlDNTM0NDhCQTExQjk1NEY1MUY0QTU0RTRDOUY=|1579144288|96f52c6bcd169ef7b62b98719ce2f5dbce8e9313"; client_id="RDRENDRBRjc1OUI0RjIxMDQ2REExRkY2RENFQzdFRjc=|1579144288|cae4206c32d633d8cf04e059304df93b27557e9c"; capsion_ticket="2|1:0|10:1579144305|14:capsion_ticket|44:N2E3MjE1OTBkNzhiNGE0ZGE3YmFmNzU1ODU5NDU5NGE=|73d1cd2ba8a22e91ad5afa6d35967b23f0b493afe0442a2fa02a94361aec0afd"; z_c0="2|1:0|10:1579144348|4:z_c0|92:Mi4xMDlyZ0F3QUFBQUFBME94MktLMDNFQ2NBQUFDRUFsVk5tMkZIWGdCUnFHOEotN1I1QzdmQmNHc29FOC1xUXdmZDJn|2516938d91343daf8e7424f789c79c9908672429bdb7a45bedf499c3a4346846"; tst=r; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1579144204,1580039199; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1580040949; KLBRSID=ca494ee5d16b14b649673c122ff27291|1580040953|1580039197',
'Host':'https://www.zhihu.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
r=requests.get("https://zhihu.com",headers=headers)
print(r.text)
2.3 会话维持
解决这个问题的主要方法就是维持同一个会话, 也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。 但是我又不想每次设置 cookies ,那该怎么办呢?这时候就有了Session 对象。
import requests
s = requests. Session()
s.get(’http: //httpbin.org/cookies/set/number/123456789')
r = s.get(’http://httpbin.org/cookies ')
print(r.text)
利用 Session ,可以做到模拟同一个会话而不用担心 Cookies 的问题。 它通常用于模拟登录 成功之后再进行下一步的操作。
2.4 SSL证书验证
12306 的证书没有被官方 CA 机构信任,会阳现证书验证错误的结果。
import requests
response = requests.get(’https://WVM.12306.cn’)
print(response.status code)
这里提示一个错误 SSLError,表示证书验证错误
import requests
response = requests.get(’https: I /www .12306. en ’, verify=False)
print(response.status_code)
把 verify 参数设置为 False 即可避开错误
2.5 代理设置
对于某些网站,在测试的时候请求几次, 能正常获取内容。 但是一旦开始大规模爬取,对于大规 模且频繁的请求,网站可能会弹出验证码,或者跳转到登录认证页面, 更甚者可能会直接封禁客户端 的 IP,导致一定时间段内无法访问。
import requests
proxies = { "https":http: I 110 .10.1.10: 3128",
"https":vhttp: //10.10.1.10: 1080",
}
requests.get(https://www.taobao. com" , proxies=proxies)
请换成自己的有效代理试验
2.6 超时设置
需要用到 timeout 参数
import requests
r = requests.get('https://www.taobao.com'.timeout=1)
print(r.status_code)
如果想永久等待,可以直接将 timeout 设置为 None,或者不设置直接留空
2.7 身份认证
在访问网站时,我们可能会遇到这样的认证页面
此时可以使用 requests 自带的身份认证功能
import requests
r = requests .get(' http: I /localhost: sooo' , auth=(’ username ' ,’ password'))
print(r.status_ code)
requests 还提供了其他认证方式,如 OAuth 认证,更多详细的功能可以参考 requests_oauthlib 的官方文档
https://requests-oauthlib.readthedocs.org/