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(一)Python环境安装
Aug 20 Python
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
python timestamp和datetime之间转换详解
Dec 11 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
django将数组传递给前台模板的方法
Aug 06 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
Python基础教程之输入输出和运算符
Jul 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
星际争霸中的热键
2020/03/04 星际争霸
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JS模板实现方法
2013/04/03 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
python+opencv实现动态物体识别
2018/01/09 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python新手学习raise用法
2020/06/03 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
波兰珠宝品牌:YES
2019/08/09 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
信息专业个人的自我评价
2013/12/27 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
大气污染防治方案
2014/05/19 职场文书
森林病虫害防治方案
2014/06/02 职场文书
婚礼父母答谢词
2015/01/04 职场文书
2014年终个人总结报告
2015/03/09 职场文书
《刷子李》教学反思
2016/02/20 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
python字典的元素访问实例详解
2021/07/21 Python
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技
mysql序号rownum行号实现方式
2022/12/24 MySQL