《探索Python Requests中的代理应用与实践》
requests加代理
高匿API代理
此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理
存活期1到2分钟
import time
import requests
from lxml import etree
response = requests.get('https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=&wt=json&method=https&city=&province=').json()
for ip in response['data']:
proxy = f'http://{ip["ip"]}:{ip["port"]}'
print(proxy)
proxies = {
'http': proxy,
'https': proxy
}
# 加代理
# requests是proxies: {
# 'http': proxy,
# 'https': proxy
# }
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers).content.decode('utf-8')
# source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
print(f"IP: {IP}")
注意:
proxies = {
'http': proxy,
'https': proxy
}
这个指的是代理服务商提供的代理服务器支持什么请求,两个都加比较保险。
如果代理服务器支持http,但你发送https请求,代理服务器不会对你的请求进行转发,但是会消耗你的代理IP
隧道代理(短效版)
此处用的小象代理,1元1小时,便宜,可以尝试加下代理
介绍:
隧道代理,一分钟自动更换IP,不需要人为搭建代理IP池去加代理IP。
隧道代理有并发请求限制,默认每秒允许 5 个请求。
也可以手动切换代理IP(但切换间隔最低10秒):可以爬取网站报错时尝试手动切换IP。
但一般一分钟自动切换已经很快了
弊端:
- 有的网站跳转使它的代理IP加不上,但代理服务商提供的接口文档提供了解决方案
from lxml import etree
import requests
target_url = "https://tool.lu/ip/"
proxy_host = 'http-short.xiaoxiangdaili.com'
proxy_port = 10010
proxy_username = '1128907524343746560'
proxy_pwd = 'wZ3WMRtm'
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxy_host,
"port": proxy_port,
"user": proxy_username,
"pass": proxy_pwd,
}
proxies = {
'http': proxyMeta,
'https': proxyMeta,
}
try:
# 设置手动切换IP
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'Proxy-Switch-Ip': 'true'
}
source = requests.get(url=target_url, proxies=proxies, headers=headers).content.decode('utf-8')
IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
print(f"IP: {IP}")
# IP: ['你的外网IP地址是:110.88.30.181']
# IP: ['你的外网IP地址是:49.74.88.38']
except Exception as e:
print(e)
隧道代理(动态转发版)
隧道代理(动态转发)无须自己提取代理IP,在用户隧道内每一个请求通过一个随机 IP 进行转发,也就是ip存活时间不长。
弊端:
- IP存活时间不长
适用:
- 如果网站只是单纯的封ip,而不以IP生成cookie,并用cookie进行登录抓取数据,可以用动态转发版。
高匿API代理和隧道代理(短效版)
高匿API代理:可以取出来IP并看到,按量或按时购买
隧道代理:无法取出来IP并看到,隧道帮你切,只能按时购买
部署一个属于自己的可以获取代理IP的服务器
- 用户
- 调用普通服务器的IP加端口号,获取代理IP
- 普通服务器
- 开设一个端口:用来接受拨号服务器发来的IP
- 再开设一个端口:用来展示接受到的IP
- vps动态拨号服务器
- 拨号上网,关闭网络,之后服务器更换一次IP。
- 用miniproxy软件占用一个端口进行请求转发。
- 服务器有一套程序获取自身IP地址,利用socket协议与普通服务器进行通信,向普通服务器发送我们的IP,每更换一次IP就发送一次。
野生代理
市面上有野生代理,安全性低、稳定性差,不能用
来源:
- 黑客攻击别人电脑,在别人电脑开设端口:设置转发请求服务
- 如果别人电脑是个小服务器,可能IP可用时间还长点
- 如果别人电脑是个私人电脑,关机你就没法用了
- 代理服务器未知,可能会获取你的请求携带的隐私
刷票
刷票程序一般根据IP进行票数计算,可以根据代理IP进行刷票
简易代理IP池
此处用到redis数据库作为IP池
这个只是简易代理IP池,理解其思想即可,后续我会发布一个复杂代理IP池,是一个项目,可以用于实战的。
思想:
add_IP:如果IP池少于5,则补充,补充的IP初始分数为0
get_IP:取出一个代理IP,进行访问,访问失败,则分数加1,若分数小于3则插回IP池,若分数大于等于3则舍弃
代理IP池的补充
import time
import requests
import redis # 建立redis连接
r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True)
# decode_responses=True: redis中存储二进制数据, True表示取出数据自动进行解码
while True:
if r.llen("my_proxy") < 5:
response = requests.get(
'https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=5&wt=json&method=https&city=&province=').json()
for ip in response['data']:
proxy = f'{ip["ip"]}:{ip["port"]}|0'
r.lpush('my_proxy', proxy)
else:
print("代理IP池已经满了")
time.sleep(5)
代理IP池的弹出使用
import time
import requests
from lxml import etree
import redis # 建立redis连接
r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True)
while True:
try:
# 取出代理IP
rr = r.rpop('my_proxy').split('|')
ip = rr[0]
score = int(rr[1])
# 添加代理IP
proxy = f'http://{ip}'
proxies = {
'http': proxy,
'https': proxy
}
print(f"代理IP: {proxy}")
# 加代理
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers)
# source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8') except Exception as e:
print(e)
if score < 3:
score += 1
print(f'请求{ip}出错,分数为:{score}')
r.lpush('my_proxy', f'{ip}|{score}')
else:
print(f'舍弃{ip}')
continue IP = etree.HTML(source.content.decode('utf-8')).xpath("//form[@id='main_form']/p[1]/text()")
print(f"IP: {IP}")
print(f"状态码:{source.status_code}")
if source.status_code in (200, 302):
r.lpush('my_proxy', f'{ip}|0')
else:
if score < 3:
score += 1
print(f'请求{ip}出错,分数为:{score}')
r.lpush('my_proxy', f'{ip}|{score}')
else:
print(f'舍弃{ip}')
更多精致内容

《探索Python Requests中的代理应用与实践》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- pageoffice6 实现在线模板套红
在Web项目中处理Word文档,经常会用到Word模板,只不过这里的"模板"概念,都是指在Web项目中预先放置的doc.docx等扩展名的.真正的Word文档,对于Excel和PP ...
- 基于webapi的websocket聊天室(一)
上一次我已经讲了在webapi主机上面加入websocket中间件. 这次就更进一步,搭建一个websocket局域网聊天室. 传送门-->webapi添加添加websocket中间件 下一篇 ...
- go高并发之路——启航
工作7年有余了,B端和C端业务都做过不少,打算整理分享一些自己在实际工作中所遇到的高并发的场景和解决方案,也是对自己本人职业生涯中的一些经验的总结和感悟.与其他博文略有不同的是,这些基本上都是自己实际 ...
- IIS 部署 Python 环境
1.安装IIS 勾选特殊CGI程序2.Python 环境 (环境变量配置)3.如果没有pip命令 先下载安装pip python setup.py install4.pip install wfast ...
- 使用docker 5分钟搭建一个博客(mysql+WordPress)
目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...
- 我对IdentityServer4的初步了解
官网:https://identityserver4.readthedocs.io/en/latest/quickstarts/2_interactive_aspnetcore.html 官网例子:h ...
- 平衡二叉树(AVL)插入结点后的再平衡思路
理解平衡二叉树 在解决平衡二叉树动平衡问题,我们先来明确什么是平衡二叉树: 平衡二叉树是二叉搜索树的一种特殊情况,所以在二叉搜索树的基础上加上了如下定义: 平衡因子:我们将二叉树中各个结点的左右子树的 ...
- Android 13 - Media框架(16)- OpenMax(四)
关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节继续了解 openmax 目录下的内容. 1.OMX_Core.h 1.1.OMX_BUFFERHEADERTYPE 这是一个比较关键的结构体 ...
- 最全SpringBoot日志配置-按照日期和日志级别进行归档
指定日志文件路径 在 spring的配置文件中配置: logging: config: classpath:logback.xm 日志配置 <?xml version="1.0&quo ...
- 华为云大咖说:开发者应用AI大模型的“道、法、术”
本文分享自华为云社区<华为大咖说 | 企业应用AI大模型的"道.法.术" --道:认知篇>,作者:华为云PaaS服务小智. 本期核心观点 上车:AGI是未来5-10年内 ...