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 相关文章推荐
Django自定义认证方式用法示例
Jun 23 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python3爬取数据至mysql的方法
Jun 26 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
Python数据集切分实例
Dec 08 Python
Python制作动态字符图的实例
Jan 27 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
python绘制箱型图
Apr 27 Python
浅谈Python中的函数(def)及参数传递操作
May 25 Python
Python操作CSV格式文件的方法大全
Jul 15 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校验表单检测字段是否为空的方法
2015/03/20 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript jQuery插件练习
2008/12/24 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
EJB timer的种类
2014/10/28 面试题
企业总经理岗位职责
2014/02/13 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
导游词之四川武侯祠
2019/10/21 职场文书