前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >requests-代理设置,超时设置,登陆验证,Prepared Requests

requests-代理设置,超时设置,登陆验证,Prepared Requests

作者头像
py3study
发布2020-02-10 22:53:48
2.6K0
发布2020-02-10 22:53:48
举报
文章被收录于专栏:python3

对于某些网站,大规模频繁请求,网站可能会弹出验证码,或者跳转到登陆认证页面,甚至可能会被直接封客户端ip,导致短时间内无法访问,这个时候就需要用到代理ip。

requests是能解决这个问题的,需要用到proxies参数,示例如下:

代码语言:javascript
复制
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)

上面代理地址换成有效代理地址即可

验证代理配置

代码语言:javascript
复制
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]'

示例代码:

代码语言:javascript
复制
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秒内没有响应,就会抛出异常。

代码语言:javascript
复制
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总和,也可以分别指定,传入一个元组:

代码语言:javascript
复制
import requests
r = requests.get('https://www.alibaba.com', timeout=(1, 1))
print(r.status_code)

如果想永久等待,可以将timeout设置为None,或者不设置直接留空,默认为None,如果服务器响应很慢,就慢慢等待,不会返回超时错误,用法如下:

代码语言:javascript
复制
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自带的身份认证功能,示例:

代码语言:javascript
复制
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

示例代码:

代码语言:javascript
复制
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。

示例:

代码语言:javascript
复制
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)

返回信息:

image.png
image.png

引入了Request,用url,data,headers参数构造了一个Request对象,需要再调用Seesion的prepare_request()方法将其转换为一个Prepared Requests对象,然后用send()方法发送即可,可以看到同样达到了POST请求效果。

有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档