解锁网络无限可能:揭秘微软工程师力作——付费代理IP池深度改造与实战部署指南
基于付费代理的代理IP池
项目来源
此项目为微软某个工程师构建的代理IP池,我对此进行了改造。可以用于生产环境中的爬虫项目
阅读前建议
阅读我之前发布的爬虫基础的文章,了解代理如何获取、使用等。
分为四大模块
- 代理生成
- 基于购买的付费代理接口获取代理IP,利用redis数据库的有序集合进行存储。初始序为10。
- 检测模块检测时,若检测成功,将序变为100,若检测失败,将序减一,直至减为0则抛弃此代理
- 代理检测利用redis数据库的zsan方法每次从数据库中取出20条数据和游标,每20条20条地进行检测。
- 首先检测代理IP的格式(检测是否含有冒号,若有则根据冒号进行分割获取IP和Port,分别检测IP(根据 '.' 进行分割,判断是否包含4部分且每部分是证书且在0到255之间则为有效)和Port(判断是否是整数)
- 之后检测代理IP是否可用,找一个检测IP网站。不加代理访问并记作IP1,加代理访问记作IP2,判断IP1和IP2是否不相等,再判断加的代理IP和IP2是否相等,来决定此代理是否有效
- 再用此代理IP去访问通用的网站(百度)或者你要爬取的网站,如果状态码在200到302之间,那么认为代理IP检测通过,将序改为100,若检测失败,则将序减一
- 检测模块采取了协程机制,增加检测速度
- 代理存储
- 封装了redis数据库的一些操作供其他三个模块调用
- 接口模块
- 将代理IP从redis数据库中读出,通过Flask开接口的方式展示到前台。
- 展示代理规则:优先随机展示序为100的,没有100的再随机展示序为10到100的
本地部署
前提:电脑已经装好了redis和redis可视化工具(如果不会装,可以私信我)
conda 建立一个虚拟环境
conda create -n new_env python=3.x # 替换 x 为你需要的 Python 版本
激活新建环境
conda activate new_env
安装依赖项
pip install -r requirments.txt
更改项目 settings.py 配置项
# redis host
REDIS_HOST = env.str('REDIS_HOST', '127.0.0.1')
# redis port
REDIS_PORT = env.int('REDIS_PORT', 6379)
# redis password, if no password, set it to None
REDIS_PASSWORD = env.str('REDIS_PASSWORD', None)
# redis db, if no choice, set it to 0
REDIS_DB = env.int('REDIS_DB', 0)
# redis connection string, like redis://[password]@host:port or rediss://[password]@host:port/0 # redis hash table key name
REDIS_KEY = env.str('REDIS_KEY', 'proxies:universal') # 前面是标识符,后面是redis数据库的表名 # definition of proxy scores
PROXY_SCORE_MAX = 100 # 如果检测成功,序设置为100
PROXY_SCORE_MIN = 0 # 接口模块取代理时会优先取序为100的,没有的话再取PROXY_SCORE_MIN和PROXY_SCORE_MAX之间的代理,这里可以自行设置
PROXY_SCORE_INIT = 10 # 代理IP初始序 # definition of proxy number
# PROXY_NUMBER_MAX = 50000
PROXY_NUMBER_MAX = 5 # 代理IP池容量
PROXY_NUMBER_MIN = 0 # definition of tester
# 检测代理IP是否有效的测试网址,但是需要改成http:避免ssl验证
TEST_URL = env.str('TEST_URL', 'http://www.baidu.com')
# TEST_URL = env.str('TEST_URL', 'https://antispider7.scrape.center/login')
TEST_TIMEOUT = env.int('TEST_TIMEOUT', 10)
TEST_BATCH = env.int('TEST_BATCH', 20) # 检测成功的状态码
TEST_VALID_STATUS = env.list('TEST_VALID_STATUS', [200, 206, 302]) # definition of api
# 端口模块相关配置
API_HOST = env.str('API_HOST', '127.0.0.1')
API_PORT = env.int('API_PORT', 5555)
API_THREADED = env.bool('API_THREADED', True) # flags of enable
# 是否开启对应模块
ENABLE_TESTER = env.bool('ENABLE_TESTER', True)
ENABLE_GETTER = env.bool('ENABLE_GETTER', True)
ENABLE_SERVER = env.bool('ENABLE_SERVER', True)修改代理IP提取链接urls(proxypool/crawlers/base.py)
@logger.catch
def crawl(self):
"""
crawl main method
"""
# for url in self.urls:
# logger.info(f'fetching {url}')
# html = self.fetch(url)
# time.sleep(.5)
# for proxy in self.parse(html):#在父类里调用自身方法,此处的proxy是一页链接的代理IP列表
# logger.info(f'fetched proxy {proxy.string()} from {url}')
# yield proxy#此处的proxy是返回的是所有页的代理IP列表
# 小象代理提取代理IP的链接
urls = "https://api.xiaoxiangdaili.com/ip/get?appKey=1130083050647343104&appSecret=5ch2dc4Q&cnt=5&wt=json&method=https&city=&province="
logger.info(f'fetching {urls}')
html = self.fetch(urls)
time.sleep(.5)
for proxy in self.parse(html): # 在父类里调用自身方法,此处的proxy是一页链接的代理IP列表
logger.info(f'fetched proxy {proxy.string()} from {urls}')
yield proxy # 此处的proxy是返回的是所有页的代理IP列表
运行redis服务
运行run.py文件
通过访问http://127.0.0.1:5555即可访问代理IP池的前台
- /all:全部代理IP
- /random:根据规则(上面模块讲解过)展示随机一个代理IP
- /count:代理IP数量
项目源码
有意私信我也可以(微信公众号)
更多精致内容
解锁网络无限可能:揭秘微软工程师力作——付费代理IP池深度改造与实战部署指南的更多相关文章
- Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》
https://blog.csdn.net/c406495762/article/details/60137956 运行平台:Windows Python版本:Python3.x IDE:Sublim ...
- 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
网络工程师课程---3.IP与路由器(ip地址的主要作用是什么) 一.总结 一句话总结: 用来标识一个节点的网络地址 划分网段 1.如何得到ip地址的网段号? ip和子网掩码 化成二进制后取 与运算 ...
- 前端工程师如何理解 TCP/IP 传输层协议?
网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP/IP网络模型 计算机与网络设备要相 ...
- 【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇
一.前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工作来说这些并不是重点,因此,我不可能从最基础的网络知识开始讲起.本节内容更多是从一个梳理和 ...
- [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)
[爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP) 原文链接:https://www.cnblogs.com/blog5277/p/9334560.html 原 ...
- Android设备网络、屏幕尺寸、SD卡、本地IP、存储空间等信息获取工具类
Android设备网络.屏幕尺寸.SD卡.本地IP.存储空间.服务.进程.应用包名等信息获取的整合工具类. package com.qiyu.ddb.util; import android.anno ...
- 网络爬虫一定要用代理IP吗
数据采集现在已经成为大数据时代不可以缺少的一部分,在数据采集过程中,很多人都会用到代理ip,那么网络爬虫一定要用代理IP吗?答案虽然不是肯定的,但出现以下情况一定是需要用到代理IP的.1.在爬虫的时候 ...
- 我给VSCode报了个bug,微软工程师竟然凌晨回复了...
柠檬哥整理了50本计算机相关的电子书,关注公众号「后端技术学堂」,回复「1024」即可获取,回复「进群」拉你进读者技术交流群. 本文首发个人微信公众号,欢迎围观点击阅读原文 最近遇到一个有意思的bug ...
- 从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案
内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性.增加用户停留时长的一把利器.短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以 ...
- 解锁网络编程之NIO的前世今生
个人博客网:https://wushaopei.github.io/ (你想要这里多有) NIO 内容概览: NIO 网络编程模型 NIO 网络编程详解 NIO 网络编程实战 NIO 网络编程缺 ...
随机推荐
- IDS4 傻瓜式实践指南
前言: 这是一篇实践指南,不会过多的解释原理(因为我也说不清楚,想了解的同学请移步老张的博客,里面有非常详细的介绍),本篇文章讲解如何简单的使用IDS4来实现单点登录,以及遇到的一些坑实现功能: 1. ...
- java 反射——任意类型数组扩容
//java object[]无法转换为原对象类型,可以使用反射来做. //这里的参数不是传object[] 而是传object. public Object GoodArrayGrow(Object ...
- js 禁用右键菜单和禁止复制
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...
- 搭建单机版伪分布式Hadoop+Scala+spark
搭建单机版伪分布式Hadoop+Scala+spark 修改ip [root@master ~]# nmcli connection add ifname ens32 con-name ens32 a ...
- [SWPUCTF 2021 新生赛]gift_F12
首先我们打开环境会发现花里胡哨的,而题目中有提示:F12,所以我们直接F12查看源码 然后ctrl+f信息检索flag.直接找到flag提交 但要注意提交格式为NSSCTF{}
- 2024-06-08:用go语言,给定三个正整数 n、x和y, 表示城市中的房屋数量以及编号为x和y的两个特殊房屋。 在这座城市中,房屋通过街道相连。对于每个编号i(1 <= i < n), 存在一条
2024-06-08:用go语言,给定三个正整数 n.x和y, 表示城市中的房屋数量以及编号为x和y的两个特殊房屋. 在这座城市中,房屋通过街道相连.对于每个编号i(1 <= i < n) ...
- DP Record
从 2024/5/4 往后开始记录捏. T1. 给你一棵树,定义一个集合的权值为 \(\dfrac{\sum_{x\in S}V_x}{\sum_{x\in S}C_x}\).若一个点 \(\in S ...
- INFINI Gateway 如何防止大跨度查询
背景 业务每天生成一个日期后缀的索引,写入当日数据. 业务查询有时会查询好多天的数据,导致负载告警. 现在想对查询进行限制--只允许查询一天的数据(不限定是哪天),如果想查询多天的数据就走申请. 技术 ...
- thinkpad t490触摸板失灵解决方法
笔记本电脑之前触摸板使用正常,可能在某次更新之后,发现失灵不可用. 解决方法: 更新或滚动触摸板驱动程序 当您在设备管理器中时,右键单击列表中的触摸板(可能称为Dell TouchPad,Lenovo ...
- idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError
idea编译报错 静态Map初始化报错java.lang.ExceptionInInitializerError package cc.mrbird.utils; import java.util.H ...