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 base64 decode incorrect padding错误解决方法
Jan 08 Python
Python格式化css文件的方法
Mar 10 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
详解Python的Lambda函数与排序
Oct 25 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Python批量发送post请求的实现代码
May 05 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
django-csrf使用和禁用方式
Mar 13 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
总结几个非常实用的Python库
Jun 26 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/04/26 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP中串行化用法示例
2016/11/16 PHP
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
python实现树形打印目录结构
2018/03/29 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
python如何从文件读取数据及解析
2019/09/19 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
pytorch中图像的数据格式实例
2020/02/11 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
运输服务质量承诺书
2014/03/27 职场文书
副处级干部考察材料
2014/05/17 职场文书
个人借款协议书范本
2014/11/17 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
2016年万圣节活动总结
2016/04/05 职场文书