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的web框架编写前端模版的教程
Apr 30 Python
python显示生日是星期几的方法
May 27 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
Python装饰器基础概念与用法详解
Dec 22 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
Python APScheduler执行使用方法详解
Dec 10 Python
Python 多线程处理任务实例
Nov 07 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验证码类代码分享(已封装成类)
2011/07/17 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
js 深拷贝函数
2008/12/04 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
对django xadmin自定义菜单的实例详解
2019/01/03 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
大学在校生求职信范文
2013/11/21 职场文书
大学毕业生的自我鉴定
2013/11/30 职场文书
体育教师自我鉴定
2014/02/12 职场文书
法律七进实施方案
2014/03/15 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
中国入世承诺
2014/04/01 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
农村党员对照检查材料
2014/09/24 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
2019同学聚会主持词
2019/05/06 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python