Python搭建代理IP池实现检测IP的方法


Posted in Python onOctober 27, 2019

在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获取有效 IP 的时候只需要获取分数高的 IP

代码地址:https://github.com/Stevengz/Proxy_pool

另外三篇:
Python搭建代理IP池(一)- 获取 IP
Python搭建代理IP池(二)- 存储 IP
Python搭建代理IP池(四)- 接口设置与整体调度

由于代理 IP 的数量非常多,为了提高 IP 的检测效率,这里使用异步请求库 Aiohttp 来进行检测。至于为什么不用抓取时用的 Requests 库,是因为它是一个同步请求库,在发出一个请求之后需要等待网页加载完成之后才能继续执行程序。这个过程会阻塞在等待响应中,如果服务器响应非常慢,一个请求就会需要十几秒,程序不会继续往下执行

异步请求库就解决了这个问题,在请求发出之后,程序可以继续接下去执行其他的事情,当响应到达时会通知程序再去处理这个响应,这样程序就没有被阻塞,可以充分把时间和资源利用起来

添加设置

增加了几个测试用的常量

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

# 代理池数量界限
POOL_UPPER_THRESHOLD = 1000

VALID_STATUS_CODES = [200, 302]

# 测试API,建议抓哪个网站测哪个
TEST_URL = 'http://www.baidu.com'

# 最大批测试量
BATCH_TEST_SIZE = 30

VALID_STATUS_CODES 变量包含了正常的状态码,获取 Response 后需要判断响应的状态,如果状态码在

VALID_STATUS_CODES 这个列表里,则代表代理可用

定义方法

定义了一个类 Tester,init() 方法中建立了一个 MySqlClient 对象,供类中其他方法使用。接下来定义了一个 test_single_proxy() 方法,用来检测单个代理的可用情况,其参数就是被检测的代理

tester.py

import asyncio
import aiohttp
import time
import sys
from aiohttp import ClientError
from db import MySqlClient
from setting import *


class Tester(object):
 def __init__(self):
  self.mysql = MySqlClient()
 
 # 测试单个代理
 async def test_single_ip(self, ip):
  conn = aiohttp.TCPConnector(verify_ssl=False)
  async with aiohttp.ClientSession(connector=conn) as session:
   try:
    if isinstance(ip, bytes):
     ip = ip.decode('utf-8')
    real_ip = 'http://' + ip
    print('正在测试', ip)
    async with session.get(TEST_URL, proxy=real_ip, timeout=15, allow_redirects=False) as response:
     if response.status in VALID_STATUS_CODES:
      self.mysql.max(ip)
      print('代理可用', ip)
     else:
      self.mysql.decrease(ip)
      print('请求响应码不合法 ', response.status, 'IP', ip)
   except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError, AttributeError):
    self.mysql.decrease(ip)
    print('代理请求失败', ip)
 
 # 主函数
 def run(self):
  print('测试器开始运行')
  try:
   count = self.mysql.count()
   print('当前剩余', count, '个代理')
   for i in range(0, count, BATCH_TEST_SIZE):
    start = i
    stop = min(i + BATCH_TEST_SIZE, count)
    print('正在测试第', start + 1, '-', stop, '个代理')
    test_ip_group = self.mysql.batch(start, stop)
    loop = asyncio.get_event_loop()
    tasks = [self.test_single_ip(ip_tuple[0]) for ip_tuple in test_ip_group]
    loop.run_until_complete(asyncio.wait(tasks))
    sys.stdout.flush()
    time.sleep(5)
  except Exception as e:
   print('测试器发生错误', e.args)


if __name__ == "__main__":
 test = Tester()
 test.run()

test_single_proxy() 方法前面加了 async 关键词,代表这个方法是异步的,方法内部首先创建了 Aiohttp 的 ClientSession 对象,此对象类似于 Requests 的 Session 对象,可以直接调用该对象的 get() 方法来访问页面

运行结果:

Python搭建代理IP池实现检测IP的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
Python实现PS滤镜中马赛克效果示例
Jan 20 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
Pandas中resample方法详解
Jul 02 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
python不同版本的_new_不同点总结
Dec 09 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
浅析使用Python搭建http服务器
Oct 27 #Python
Python搭建代理IP池实现存储IP的方法
Oct 27 #Python
Python搭建代理IP池实现获取IP的方法
Oct 27 #Python
详解python statistics模块及函数用法
Oct 27 #Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 #Python
python自动结束mysql慢查询会话的实例代码
Oct 27 #Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 #Python
You might like
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
canvas绘制多边形
2017/02/24 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
vue父子组件通信的高级用法示例
2019/08/29 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python操作Excel之xlsx文件
2017/03/24 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python正则实现提取电话功能
2018/02/24 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python实现logistic分类算法代码
2020/02/28 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
业务员岗位职责范本
2013/12/15 职场文书
父母对孩子说的话
2014/04/12 职场文书
作风年建设汇报材料
2014/08/14 职场文书
语文课外活动总结
2014/08/27 职场文书
员工离职感谢信
2015/01/22 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫