python3网络爬虫学习——使用requests(2)
这一节主要了解一下requests库的高级用法
1 . 文件上传,运用post函数
{ "args": {}, "data": "", "files": { "file": "data:application/octet-stream;base64,AAAB...=
}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "6665", "Content-Type": "multipart/form-data; boundary=983f88d896da4a29b5b793769a338d8e", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "218.64.33.30", "url": "http://httpbin.org/post" }
网站返回响应,里面包含files这个字段,而form字段为空,说明上传部分单独有一个files字段来标识
2.Cookies
我们可以通过requests来获取Coookies
import requests r = requests.get('https://www.baidu.com') print(r.cookies) for key,value in r.Cookies.items() print(key+'='+value)
这是一个RequestCookieJar类型的对象,所以可以用遍历字典的方法来查找
当然我们还可以用Cookie来维持登录状态,以登录知乎为例,有两种方法:
(1).首先登陆知乎,在开发者工具查找headers,在get函数处直接直接加上headers,headers里包括Cookie信息
(2).自己建立一个RequestCookieJar对象,再将split方法分割下载下来的Cookie信息,用set方法设置好key和value,在调用requests的get方法传递cookies即可
3.会话维持
利用post和get函数来模拟网页的请求,由于用了两次,每次的会话完全不一样,相当于打开了两个网页。所以如果第一次登陆了,第二次想要获取个人信息Cookie,是无法获取的。
如果每次都设置一遍cookie到也行,但这样太过于麻烦,因此我们可以Session对象
import requests
r = requests.get('http://httpbin.org/cookies/set/number/123456789')
print(r.text)
s = requests.get('http://httpbin.org/cookies')
print(s.text)
{
"cookies": {
"number": "123456789"
}
}
{
"cookies": {}
}
这里我们设置了一个测试网站,可以设置一个cookie,内容为123456789,随后又请求了http://httpbin.org/cookies(该网站可以获取cookies),但我们却未能获取到设置的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)
得到了我们设置的cookies
因此常用Session模拟登录成功后进行下一步操作
4.SSL证书验证
当HTTP发送请求时,他会检查SSL证书,我们可以使用verify参数控制是否检查此证书,一般不加的话其默认为True,会自动验证
import requests response = requests.get('https://www.12306.cn') print(response.status_code)
这个会产生SSLError,显示证书错误,前面我们说过铁路12306没有得到CA的认证证书,如何避免这个错误,可以在get函数里设置verify=False
response = requests.get('https://www.12306.cn',verify=False)
就会显示出状态码200了,但我们会看到一条警告:InsecureRequestWarning,我们可以设置忽略该警告
import requests from requests.packages import urllib3 #如果使用捕获警告到日志的方式,那么则需要
#import logging
#logging.captureWarnings(True)
urllib3.disable_warnings() response = requests.get('https://www.12306.cn',verify=False) print(response.status_code)
当然我们还可以指定一个本地证书用作客户端证书,这个可以是单个文件(包含证书和秘钥)或包含两个文件路径的元组
5.代理设置
我们需要用到proxies参数
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies)
若你的代理需要使用HTTP Basic Auth,可以使用 http://user:password@host/ 语法:
proxies = { "http": "http://user:pass@10.10.1.10:3128/", }
除了基本的 HTTP 代理,Request 还支持 SOCKS 协议的代理。这是一个可选功能,若要使用, 你需要安装第三方库。
本节来源博客:https://blog.csdn.net/qq_18863573/article/details/52775130
6.超时设置
为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。这个时间是计算机发出请求到服务器返回相应的时间
连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是`connect()`_),Request 会等待的秒数。一个很好的实践方法是把连接超时设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口 (TCP packet retransmission window) 的默认大小是 3。
r = requests.get('https://github.com', timeout=5)
也可以用元组表示,实际上请求分为两个阶段,即连接和读取
r = requests.get('https://github.com', timeout=(3.05, 27))
如果想永久等待,可以设置为None或者不设置,系统会默认其永久
7.身份认证
需要身份验证的时候,可以使用requests自带的身份认证功能:
import requests from requests.auth import HTTPBasicAuth r = requests.get('http://localhost:5000',auth = HTTPBasicAuth('username','password')) #也可为auth = HTTPBasicAuth('username','password')
print(r.status_code)
认证成功时候返回200状态码,如果认证失败则返回401,requests还提供了一个更简便的方法,就是直接传入一个元组,默认为HTTPBasicAuth类
此外还提供了其他认证方式,比如OAuth认证,不过需要安装oauth包,这里不多讲
8.Prepared Request
在介绍urllib时,可以将请求表示为数据结构,其中各参数都可以通过一个Request对象来表示,在requests里同样可以做到,这个数据结构叫Prepared Request
from requests import Request,Session url = 'http://httpbin.org/post' data = { 'name':'germy' } headers = { 'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4) AppleWebkit/537.36(KHTML,like Gecko)Chrome/53.0.2785.116 Safari/537.36' } s = Session() req = Request('POST',url,data=data,headers=headers) prepped = s.prepare_request(req) r = s.send(prepped) print(r.text)
这里引用Request,再用url,data,和headers参数构建了一个Request对象,这时需要在调用Session的prepared_request()方法将其转化为一个Prepared Request对象,在调用send发送即可,结果如下:
{
"args": {},
"data": "",
"files": {},
"form": {
"name": "germy"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "10",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4) AppleWebkit/537.36(KHTML,like Gecko)Chrome/53.0.2785.116 Safari/537.36"
},
"json": null,
"origin": "218.64.33.30",
"url": "http://httpbin.org/post"
}
同样达到了POST请求,有了Request这儿对象,就可以将请求当做独立对象来看待

浙公网安备 33010602011771号