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中的getopt函数使用详解
Jul 28 Python
对pandas replace函数的使用方法小结
May 18 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
通俗讲解python 装饰器
Sep 07 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
python绘制云雨图raincloud plot
Aug 05 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
PHP Array交叉表实现代码
2010/08/05 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
Sample script that deletes a SQL Server database
2007/06/16 Javascript
jquery的颜色选择插件实例代码
2008/10/02 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
js实现日历的简单算法
2017/01/24 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
python列表list保留顺序去重的实例
2018/12/14 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
深入了解Django View(视图系统)
2019/07/23 Python
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
农村婚礼证婚词
2014/01/10 职场文书
公司活动总结怎么写
2014/06/25 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
毕业设计致谢词
2015/05/14 职场文书
2015年教师国培感言
2015/08/01 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python