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访问sqlserver示例
Feb 10 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
python实现输入数字的连续加减方法
Jun 22 Python
Python连接Redis的基本配置方法
Sep 13 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
python 返回列表中某个值的索引方法
Nov 07 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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 curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
自动更新作用
2006/10/08 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
django反向解析和正向解析的方式
2018/06/05 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
没编程基础可以学python吗
2020/06/17 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
软件测试企业面试试卷
2016/07/13 面试题
Why we need EJB
2016/10/20 面试题
涉外文秘个人求职的自我评价
2013/10/07 职场文书
求职信格式范本
2013/11/15 职场文书
名人演讲稿范文
2013/12/28 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
集体婚礼策划方案
2014/02/22 职场文书
扬尘污染防治方案
2014/06/15 职场文书
小学庆六一活动总结
2014/08/28 职场文书
2014年度思想工作总结
2014/11/27 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python