Python搭建 * 池实现检测IP的方法
作者:Steven·简谈 发布时间:2023-10-05 04:42:51
在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获取有效 IP 的时候只需要获取分数高的 IP
代码地址:https://github.com/Stevengz/Proxy_pool
另外三篇:
Python搭建 * 池(一)- 获取 IP
Python搭建 * 池(二)- 存储 IP
Python搭建 * 池(四)- 接口设置与整体调度
由于代理 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() 方法来访问页面
运行结果:
来源:https://blog.csdn.net/weixin_44613063/article/details/102577476


猜你喜欢
- 一、picklepickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。&n
- 需求:我要查询百度域名的到期时间或者开始时间思路分析:如果在linux系统中直接使用下面命令即可:echo | openssl s_clie
- 额。。。每个请求都有token值的传入,但是token非常易变,一旦变化,所有的接口用例都得改一遍token,工作量太大了。。。那么有没有一
- 普通滑动验证以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简
- 目录简介图形加载和说明图形的灰度灰度图像的压缩原始图像的压缩总结简介本文将会以图表的形式为大家讲解怎么在NumPy中进行多维数据的线性代数运
- 最近迷上了Python,要说为什么呢?Python语法简单,功能强大,有广泛的第三方库能快速编程实现自己的想法(无需重复去造轮子)。就像某位
- Mysql Table doesn't exist问题程序连接Mysql的时候总是提示表不存在,Table 'xx.QRTZ
- 1 lambdalambda原型为:lambda 参数:操作(参数)lambda函数也叫匿名函数,即没有具体名称的函数,它允许快速定义单行函
- APScheduler是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持
- 其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。
- Python 中使用线程有两种方式:函数或者用类来包装线程对象。函数式:调用 thread 模块中的start_new_thread()函数
- 一、logging日志模块等级常见log级别从高到低:CRITICAL 》ERROR 》WARNING 》INFO 》DEBUG,默认等级为
- 本文实例讲述了Python整型运算之布尔型、标准整型、长整型操作。分享给大家供大家参考,具体如下:#coding=utf8def integ
- 一、多线程共享全局变量首先我们来回忆下在函数中修改全局变量的情况。在一个函数中,对全局变量进行修改的时候,到底是否需要使用 global 进
- function ten2eight(x){ var s=[]; var r=''; while(x>0){ s.pu
- 问题:编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 +
- 本文实例讲述了Python实现扣除个人税后的工资计算器。分享给大家供大家参考,具体如下:正好处于找工作期间避免不了会跟单位谈论薪资的情况,当
- 如何实现像腾讯QQ聊天窗口中文字链接提醒效果。完善了部分代码...比如,在不是连接的地方单击的时候,把那个提示关闭掉...在复制不成功的时候
- 因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个
- EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )在线正则表达式测试:http://www.aspxhome.com/RegE