python爬虫学习18

python爬虫学习18

高级用法其三

1.超时设置
# requests库中的请求方法下也提供了 timeout 参数我们可以设置该参数,防止过长时间服务器不能响应
# 超时设置
import requests

url = 'https://www.httpbin.org/get'
timeout = 0.5
resp = requests.get(url, timeout=timeout)
# 此处 timeout 设置为 0.5 意为超过0.5秒未响应时就自动抛出异常
print(resp.status_code)

运行结果:

在这里插入图片描述

实际上请求分为两个阶段:

  • 连接(connect)
  • 读取(read)

我们设置的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,这样程序就永远不会抛出异常,如果接收不到响应它会一直等待:

扫描二维码关注公众号,回复: 13792620 查看本文章
resp = requests.get('https://www.httpbin.org/get', timeout=None)
2.身份认证

在访问某些网站时,首先就会弹出一个认证窗口:

在这里插入图片描述

那么如何通过requests库实现身份验证的操作呢?

# 身份验证
# 通过设置 auth 参数

import requests
from requests.auth import HTTPBasicAuth

url = 'https://ssr3.scrape.center/'
# 这个网站的用户名和密码都是admin
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库的代理和之前的原理都是一样的。

# 代理设置
# 通过设置 proxies 参数
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:[email protected]: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方法同样的效果

在这里插入图片描述

今日结束,未完待续…

猜你喜欢

转载自blog.csdn.net/szshiquan/article/details/123619315