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 Queue模块详解
Nov 30 Python
Python构造函数及解构函数介绍
Feb 26 Python
python实现端口转发器的方法
Mar 13 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
5款实用的python 工具推荐
Oct 13 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
yolov5返回坐标的方法实例
Mar 17 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/02 国漫
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
使用PYTHON接收多播数据的代码
2012/03/01 Python
python读写文件操作示例程序
2013/12/02 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python与R语言的简要对比
2017/11/14 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
详解Python打包分发工具setuptools
2019/08/05 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
简历上的自我评价
2014/02/03 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
工会文体活动总结
2015/05/07 职场文书
义卖募捐活动总结
2015/05/09 职场文书
贫困生证明范文
2015/06/16 职场文书
男方家长婚礼致辞
2015/07/27 职场文书