发布时间:2019-05-03 11:05:00编辑:Run阅读(5765)
对于某些网站,大规模频繁请求,网站可能会弹出验证码,或者跳转到登陆认证页面,甚至可能会被直接封客户端ip,导致短时间内无法访问,这个时候就需要用到代理ip。
requests是能解决这个问题的,需要用到proxies参数,示例如下:
import requests proxies = { "http": 'http://123.123.123.10:5566', "https": 'https://123.123.123.10:443', } requests.get("https://www.baidu.com", proxies=proxies)
上面代理地址换成有效代理地址即可
验证代理配置
import requests proxies = { "http": 'http://user:password@123.123.123.10:5566/', } requests.get("https://www.baidu.com", proxies=proxies)
requests还支持socks协议的代理
需要安装socks这个库
pip3 install 'requests[socks]'
示例代码:
import requests proxies = { "http": 'socks5://user:password@123.123.123.10:5566/', "https": 'socks5://user:password@123.123.123.10:5566/', } requests.get("https://www.baidu.com", proxies=proxies)
requests超时设置
在本机网络状况不好或服务器网络响应太慢甚至无法响应的时候,应该设置一个超时时间,需要用到timeout参数。
将超时时间设置为0.1秒,如果0.1秒内没有响应,就会抛出异常。
import requests r = requests.get('https://www.alibaba.com', timeout=0.1) print(r.status_code)
返回信息:
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.alibaba.com', port=443): Read timed out. (read timeout=0.1)
实际上,请求分为两个阶段,即连接(connect)和读取(read)。设置的timeout将作用于连接和读取这两个的timeout总和,也可以分别指定,传入一个元组:
import requests r = requests.get('https://www.alibaba.com', timeout=(1, 1)) print(r.status_code)
如果想永久等待,可以将timeout设置为None,或者不设置直接留空,默认为None,如果服务器响应很慢,就慢慢等待,不会返回超时错误,用法如下:
import requests r = requests.get('https://www.alibaba.com', timeout=None) print(r.status_code) r1 = requests.get('https://www.alibaba.com') print(r1.status_code)
requests登陆验证(身份认证)
在访问网站时,可能会遇到认证页面,此时可以使用requests自带的身份认证功能,示例:
import requests from requests.auth import HTTPBasicAuth r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password')) print(r.status_code) # 默认使用HTTPBasicAuth这个类来认证 r1 = requests.get('http://localhost:5000', auth=('username', 'password')) print(r1.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', 'your_oauth_token', 'user_oauth_token_secret') requests.get(url, auth=auth)
Prepared Requests
可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示,这个数据结构就叫Prepared Requests。
示例:
from requests import Request, Session url = 'http://httpbin.org/post' data = { 'name': 'zhangsan', 'age': '22', } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' } s = Session() req = Request('POST', url=url, data=data, headers=headers) prepped = s.prepare_request(req) r = s.send(prepped) print(r.text)
返回信息:
引入了Request,用url,data,headers参数构造了一个Request对象,需要再调用Seesion的prepare_request()方法将其转换为一个Prepared Requests对象,然后用send()方法发送即可,可以看到同样达到了POST请求效果。
有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。
上一篇: requests--证书验证
47744
46234
37109
34626
29228
25885
24744
19862
19415
17907
5715°
6314°
5834°
5887°
6983°
5829°
5845°
6360°
6315°
7672°