python爬虫学习18
高级用法其三
1.超时设置
import requests
url = 'https://www.httpbin.org/get'
timeout = 0.5
resp = requests.get(url, timeout=timeout)
print(resp.status_code)
运行结果:
实际上请求分为两个阶段:
我们设置的timeout的时间是上两者的总和。既然知道请求由两部分组成,在设置timeout参数时,也可以传入一个元祖,分别设置连接和读取的时间限制:
import requests
url = 'https://www.httpbin.org/get'
timeout = (0.2, 0.3)
resp = requests.get(url, timeout=timeout)
print(resp.status_code)
运行结果:可以看到是连接部分超过了我们设置的时限所以抛出了异常
import requests
url = 'https://www.httpbin.org/get'
timeout = (2, 0.1)
resp = requests.get(url, timeout=timeout)
print(resp.status_code)
运行结果:此时就是读取的时间超过了(read timeout)
当然,如果我们对某个网站非常信任,认为它终有一日会响应我们,那么我们可以设置timeout参数为None,这样程序就永远不会抛出异常,如果接收不到响应它会一直等待:
resp = requests.get('https://www.httpbin.org/get', timeout=None)
2.身份认证
在访问某些网站时,首先就会弹出一个认证窗口:
那么如何通过requests库实现身份验证的操作呢?
import requests
from requests.auth import HTTPBasicAuth
url = 'https://ssr3.scrape.center/'
auth = HTTPBasicAuth('admin', 'admin')
resp = requests.get(url, auth=auth)
print(resp.status_code)
运行结果:
如果嫌这个写法麻烦,好,上简单的。我们可以直接传入一个元组:
import requests
url = 'https://ssr3.scrape.center/'
resp = requests.get(url, auth=('admin', 'admin'))
print(resp.status_code)
运行结果:
此外,requests库还提供了其他认证方式,如OAuth,此时需要安装 oauth 包:
pip3 install requests_oauthlib
示例方法:
import requests
from requests_oauthlib import OAuth1
url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET', 'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url,auth=auth)
3.代理设置
之前urllib的时候我们就学习了如何设置代理,requests库的代理和之前的原理都是一样的。
import requests
url = 'https://www.httpbin.org/get'
proxy = {
'http': 'http://10.10.10.10:1080'
, 'https': 'https://10.10.10.10:1080'
}
requests.get(url, proxies=proxy)
因为贫穷,所以找不到能用的代理,所以运行并试验的任务就交给能者了…
如果在使用代理的同时又需要进行身份认证,可如下处理:
import requests
url = 'https://www.httpbin.org/get'
proxy = {'https': 'https://user:password@10.10.10.10:1080'}
requests.get(url, proxies=proxy)
4.Prepared Request
看到第四个小标题首字母大写,我们很容易想到他应该是一个 类 。
Request对象是requests库在发送请求时在内部构造的一个对象,requests库将我们设定的方法、url、data、等字段传给Prepared Request类,然后发送这个对象,请求成功后我们就会得到一个Response对象,解析这个对象我们得到了各种信息。
其实,这个Request对象的类型就是Prepared Request。
那么,我们可不可以直接使用这个对象呢?
from requests import Request, Session
url = 'https://www.httpbin.org/post'
data = {'name': 'germey'}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.2242 SLBChan/11'}
s = Session()
req = Request('POST', url=url, data=data, headers=headers)
prepped = s.prepare_request(req)
resp = s.send(prepped)
print(resp.text)
运行结果:可以看到我们通过直接调用Request对象实现了与POST方法同样的效果
今日结束,未完待续…
|