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批量修改文件后缀的方法
Jan 26 Python
python集合类型用法分析
Apr 08 Python
Python使用chardet判断字符编码
May 09 Python
多个应用共存的Django配置方法
May 30 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
Python笔记之代理模式
Nov 20 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
Python任务自动化工具tox使用教程
Mar 17 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
matlab xlabel位置的设置方式
May 21 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 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
详解PHP PDO简单教程
2019/05/28 PHP
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
俄罗斯女装店:12storeez
2019/10/25 全球购物
违反课堂纪律检讨书
2014/01/19 职场文书
求职毕业生自荐书
2014/02/08 职场文书
个人考核材料
2014/05/15 职场文书
公司授权委托书范文
2014/08/02 职场文书
党支部工作总结2015
2015/04/01 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Python实现机器学习算法的分类
2021/06/03 Python
Redis Stream类型的使用详解
2021/11/11 Redis
Redis基本数据类型List常用操作命令
2022/06/01 Redis