Python搭建代理IP池实现接口设置与整体调度
接口模块需要用API来提供对外服务的接口,当然也可以直接连数据库来取,但是这样就需要知道数据库的连接信息,不太安全,而且需要配置连接,所以一个比较安全和方便的方式就是提供一个WebAPI接口,通过访问接口即可拿到可用代理
代码地址:https://github.com/Stevengz/Proxy_pool
另外三篇:
Python搭建代理IP池(一)-获取IP
Python搭建代理IP池(二)-存储IP
Python搭建代理IP池(三)-检测IP
添加设置
添加模块开关变量
setting.py
#数据库地址 HOST='127.0.0.1' #MySql端口 MYSQL_PORT=3306 #MySQl用户名、密码 MYSQL_USERNAME='***' MYSQL_PASSWORD='***' #数据库名 SQL_NAME='test' #代理等级 MAX_SCORE=30 MIN_SCORE=0 INITIAL_SCORE=10 VALID_STATUS_CODES=[200,302] #代理池数量界限 POOL_UPPER_THRESHOLD=1000 #检查周期 TESTER_CYCLE=20 #获取周期 GETTER_CYCLE=300 #测试API,建议抓哪个网站测哪个 TEST_URL='http://www.baidu.com' #API配置 API_HOST='0.0.0.0' API_PORT=5555 #开关 TESTER_ENABLED=True GETTER_ENABLED=True API_ENABLED=True #最大批测试量 BATCH_TEST_SIZE=10
TESTER_ENABLED、GETTER_ENABLED、API_ENABLED都是布尔类型,True或者False。标明了测试模块、获取模块、接口模块的开关,如果为True,则代表模块开启
定义接口
使用框架:Flask
api.py
fromflaskimportFlask,g fromdbimportMySqlClient __all__=['app'] app=Flask(__name__) defget_conn(): ifnothasattr(g,'mysql'): g.mysql=MySqlClient() returng.mysql @app.route('/') defindex(): return'WelcometoProxyPoolSystem
' #随机代理 @app.route('/random') defget_proxy(): conn=get_conn() returnconn.random() #代理池总量 @app.route('/count') defget_counts(): conn=get_conn() returnstr(conn.count()) if__name__=='__main__': app.run()
声明了一个Flask对象,定义了三个接口,分别是首页、随机代理页、获取数量页。
只需要访问对应的接口即可获取到可用代理:
调度模块
调用定义的获取、存储、检测三个模块,将这三个模块通过多进程的形式运行起来
scheduler.py
importtime frommultiprocessingimportProcess fromapiimportapp fromgetterimportGetter fromtesterimportTester fromdbimportMySqlClient fromsettingimport* classScheduler(): #定时测试代理 defschedule_tester(self,cycle=TESTER_CYCLE): tester=Tester() whileTrue: print('测试器开始运行') tester.run() time.sleep(cycle) #定时获取代理 defschedule_getter(self,cycle=GETTER_CYCLE): getter=Getter() whileTrue: print('开始抓取代理') getter.run() time.sleep(cycle) #开启API defschedule_api(self): app.run(API_HOST,API_PORT) defrun(self): print('代理池开始运行') ifTESTER_ENABLED: tester_process=Process(target=self.schedule_tester) tester_process.start() ifGETTER_ENABLED: getter_process=Process(target=self.schedule_getter) getter_process.start() ifAPI_ENABLED: api_process=Process(target=self.schedule_api) api_process.start() if__name__=="__main__": scheduler=Scheduler() scheduler.run()
启动入口是run()方法,分别判断了三个模块的开关,如果开启的话,就新建一个Process进程,设置好启动目标,然后调用start()方法运行,这样三个进程就可以并行执行,互不干扰
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。