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这儿对象,就可以将请求当做独立对象来看待

posted @ 2018-08-21 17:45  gausstu  阅读(287)  评论(0)    收藏  举报