python代理池项目_python 代理池升级版v1.1

python 代理池升级版v1.1

概述

前段时间,因为项目的需要,简单的实现了一个代理池,只是实现了预想的基本功能,后边想在完善。可是没想到我太(tai)忙(lan)了(le),之前也有反馈各种bug,一直没有维护,作为一个崇尚开源的超能力者,既然开源了,只要有人在用就应该维护下去,于是花了点时间,有重新做了一下设计,只是没想到,这一拖竟然是7个月之后。

代理池的1.0版在这 ,这个应该能体现我最初的想法。

最近花了点时间,对项目进行了整体的重构。开源地址见文末。

新特性

说一下这次重构后添加的新特性 :

数据源数量达到8个,一次任务刷新ip总量在2000左右,有效ip(数据库无记录)在500个,刷新时间30分钟。

支持文件配置,添加读取配置文件类,采用单例模式实现。

对程序中的常量进行抽取,添加了常量文件,减少维护成本。

将代理验证和代理刷新进行分离,分别管理。

对数据库客户端进行统一管理,加入数据库工厂类,采用工厂模式。

通过配置文件调用数据源,类似java中的反射机制,减少模块间的耦合和侵入性。

抽离下载工具类,添加user-agent列表,支持随机产生user-agent,下载失败默认重试3次,随机睡眠,3次失败后放弃任务,重试次数可自行配置。

添加日志模块。

封装创建进程工具类。

添加发送邮件模块。

提供程序启动的总入口,也可以分模块启动。

框架图

271c269509d5?from=timeline

模块设计

核心时序图

271c269509d5?from=timeline

核心时序图.png

上面的两幅图,基本上已经体现了代理池的核心逻辑,既然是池,就要有新源的注入,不然就成为一个死池,所以定时任务就是这个新源,网络上的免费ip资源可用性本来就不是很高,交流学习可以用,生产环境就不要想了,因为特别的不稳定。

依赖库

程序默认数据库类型为mongodb ,请确保已经安装该库,并能成功启动。

APScheduler==3.3.1

Flask==0.12.1

lxml==3.7.3

requests==2.13.0

pymongo==3.4.0

相关的依赖库及版本号已经导入到requirements.txt中,可以使用(venv) $ pip install -r requirements.txt 命令安装依赖

使用配置

conf.ini

[db]

#数据库类型

db_type = mongodb

db_host = 127.0.0.1

db_port = 27017

[freeProxy]

firstFreeProxy = firstFreeProxy

secondFreeProxy = secondFreeProxy

thirdFreeProxy = thirdFreeProxy

fourFreeProxy = thirdFreeProxy

fiveFreeProxy = thirdFreeProxy

sixFreeProxy = thirdFreeProxy

sevenFreeProxy = thirdFreeProxy

eightFreeProxy = eightFreeProxy

[WebApi]

port = 5001

[config]

#是否删除原有数据

isDelete = 1

#是否启用邮件通知

isEmail = 1

[WebUrl]

verifyUrl = 'http://www.baidu.com'

常量文件 Constants.py

'''配置文件键值对'''

db = 'db'

db_type = 'db_type'

db_host = 'db_host'

db_port = 'db_port'

db_name = 'db_name'

freeProxy = "freeProxy"

'''定义数据库类型'''

mongodb = 'mongodb'

redisdb = 'redis'

mysqldb = 'mysql'

'''定义参数常量'''

type = 'type'

name = 'name'

host = 'host'

port = 'port'

clazz = 'getfreeproxy'

'''配置数据库相关信息'''

mongoClient = 'MongoDBClient'

dbName = "IpProxyPool" #数据库名字

commonPool = 'Common_IP' #ip池总表

validatePool = 'verify_ip' #验证ip表

defaultHost = '127.0.0.1' #默认本机地址

defaultPort = 27017 #端口默认为mongodb端口

'''Http请求配置'''

retryTime = 3

timeout = 30

'''进程配置'''

processNum = 3 #设置进程的数量

sleepTime = 60*31 #设置验证进程休眠的时间

'''任务下载刷新周期'''

schedulerMinutes = 30 #单位为分钟

'''邮件配置'''

smtp_server = 'smtp.xxx.com'

from_email = 'xxx' #发件人邮件地址

email_password = 'xxx'

to_email = 'xxx' #接收人邮件地址

'''打印日志输出等级配置'''

logLevel = 0 #0代表debug级别(默认) 1 为info 级别

若要修改程序的刷新时间,请修改上面的schedulerMinutes值,sleepTime 为数据库为空时的休眠时间。休眠时间应该大于定时刷新时间。默认刷新周期为30分钟,休眠时间为31分钟。关于日志的输出等级设置logLevel的值即可。

采用了约定大于配置的规则,在配置文件和常量文件中关于Key的设置尽量不要改变,以免产生不必要的麻烦,如果要更改数据库的类型,请参考常量文件的定义进行更改。在conf.ini中有一个[config]的配置,此版本没有用到。发送邮件的功能此版本也没有用到,预想是在网站进行改版,提取不到数据的情况下,程序自动发出邮件通知,及时通知开发人员进行提取规则的升级。另外程序只是内置了对mongodb的支持,工厂类实现了redis和mysql的相关代码,但是并没有创建实体类,如果要使用redis或者mysql或者其他的数据库, 请自行修改源码,参考mongodb实现方式。

新增ip源

关于ip源的增加,只需要修改两个地方,一个是CollectFreeProxy.py,将新增加的源,放入此文件中,第二个是修改conf.ini文件,修改【freeProxy】节点。具体请参考已有的代码。

启动

进入到此程序的根目录IpProxyPool文件夹下, 使用 :

python -m Run.Run

运行,若是第一次运行,效果图如下:

271c269509d5?from=timeline

初次运行.png

提取ip

conf.ini ,端口默认为 5000 , 默认地址为 127.0.0.1/5000 . 会有相关api的介绍。

封装代理方法:

def proxy():

import json

response = requests.get('http://xxxx.xxxx.xxxx.xxxx:5001/get/')

jsonStr = json.loads(response.text)

proxy = jsonStr['proxy']

proxy = {

'http': proxy,

'https': proxy}

return proxy

地址:

版本迭代:

当前python只支持2.7版,3 版本不支持,迭代过程中会改善

当前的代理属性还不完整,只有一个ip地址,迭代中会逐渐的增加属性

会增加ip的评分机制,验证代理的活性。根据活性取得分数

无效代理的删除,当前的删除机制是不完善的。初步预想的删除是根据时间和评分来删除

代理验证进程目前只有一个验证功能,可能会增加删除功能,在验证的过程中如果发现有不符合规则的代理,直接删除掉

可用代理池的删除还没有想好该怎么实现,是在api调用的时候进行判断删除,还是启动一个新的进程进行实时规则验证删除,又或者通过api调用删除,还要在想一下。

提供一个API地址:http://47.94.236.225:5001 ,单机,小水管机器,勿压测和频繁请求,谢谢 !

少年听雨歌楼上,红烛昏罗帐。

壮年听雨客舟中,江阔云低,断雁叫西风。

感谢支持!

---起个名忒难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值