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科学计算环境推荐——Anaconda
Jun 30 Python
python实现按行切分文本文件的方法
Apr 18 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
python WindowsError的错误代码详解
Jul 23 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
Python线程下使用锁的技巧分享
Sep 13 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
详解python中init方法和随机数方法
Mar 13 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
Python实现EM算法实例代码
Oct 04 Python
python基于tkinter制作下班倒计时工具
Apr 28 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
JS 网站性能优化笔记
2011/05/24 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
php轻松实现文件上传功能
2016/03/03 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
20个常用Python运维库和模块
2018/02/12 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python多线程下信号处理程序示例
2019/05/31 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
python实现猜数游戏
2020/03/27 Python
Python 实现一个计时器
2020/07/28 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
大学军训自我鉴定
2013/12/15 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
护士自我评价
2014/02/01 职场文书
出生医学证明书
2014/09/15 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS