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 相关文章推荐
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
用python3读取python2的pickle数据方式
Dec 25 Python
Python模块 _winreg操作注册表
Feb 05 Python
详解Python修复遥感影像条带的两种方式
Feb 23 Python
Python动态强类型解释型语言原理解析
Mar 25 Python
Python实现Appium端口检测与释放的实现
Dec 31 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 Python
Python学习之时间包使用教程详解
Mar 21 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
js style动态设置table高度
2014/10/21 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
Python批量转换文件编码格式
2015/05/17 Python
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
单位领导证婚词
2014/01/14 职场文书
法律系毕业生求职信
2014/05/28 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
给朋友的赠语
2015/06/23 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
HTML常用标签超详细整理
2022/03/19 HTML / CSS