Python使用Redis实现IP代理池

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Python使用Redis实现IP代理池

可以使用快代理,芝麻代理,蘑菇代理 ,讯代理等代理商提供API代理IP或者免费代理建立自己IP代理池


#使用apscheduler库定时爬取ip,定时检测ip删除ip,做了2层检测,第一层爬取后放入redis——db0进行检测,成功的放入redis——db1再次进行检测,确保获取的代理ip的可用性
import requests, redis
import pandas
import random
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
import logging
db_conn = redis.ConnectionPool(host="*.*.*.*", port=6379, password="123456")
redis_conn_0 = redis.Redis(connection_pool=db_conn, max_connections=10,db=0)
redis_conn_1 = redis.Redis(connection_pool=db_conn, max_connections=10,db=1)
# 删除redis数据库里的ip
def remove_ip(ip,redis_conn):
    redis_conn.zrem("IP", ip)
    print("已删除 %s..." % ip)
# 获取redis数据库里一共有多少ip
def get_ip_num(redis_conn):
    num = redis_conn.zcard("IP")
    return num
# 获取ip的端口
def get_port(ip,redis_conn):
    port = redis_conn.zscore("IP", ip)
    port = str(port).replace(".0", "")
    return port
# 添加ip和端口到数据库里
def add_ip(ip, port,redis_conn):
    # nx: 不要更新已有的元素。总是添加新的元素,只有True,False
    redis_conn.zadd("IP", {ip: port}, nx=55)
    print("已添加 %s %s...ok" % (ip, port))
# 列出所有的ip
def get_all_ip(redis_conn):
    all_ip = redis_conn.zrange("IP", 0, -1)
    return all_ip
# 随机获取一个ip
def get_random_ip(redis_conn):
    end_num = get_ip_num(redis_conn)
    num = random.randint(0, end_num)
    random_ip = redis_conn.zrange("IP", num, num)
    if not random_ip:
        return "",""
    random_ip = str(random_ip[0]).replace("b", '').replace("'", "")
    port = get_port(random_ip,redis_conn)
    return random_ip, port
# 获取代理ip
def spider_ip(x,redis_conn):
    print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), x)
    for p in range(1, 20):
        res = pandas.read_html("http://www.89ip.cn/index_{}.html".format(p))
        # print(res)
        # print(type(res[0]))
        for i in range(len(res[0])):
            ip = res[0].iloc[i, 0]
            port = res[0].iloc[i, 1]
            print("ip", ip)
            print("port", port)
            add_ip(str(ip), str(port),redis_conn)
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='log1.txt',
                    filemode='a')
def aps_detection_ip(x,redis_conn):
    print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), x)
    res=get_random_ip(redis_conn)
    ip=res[0]
    port=res[1]
    try:
        requests.get("http://www.baidu.com",proxies={'https':'{ip}:{port}'.format(ip=ip,port=port)})
        print("可用",ip,port,res)
        if redis_conn!=redis_conn_1:
            add_ip(str(ip), str(port), redis_conn_1)
    except Exception:
        # ip错误失效就删除
        remove_ip(ip,redis_conn)
scheduler = BlockingScheduler()
scheduler.add_job(func=aps_detection_ip, args=('检测循环任务0',redis_conn_0), trigger='interval', seconds=3, id='aps_detection_ip_task0',max_instances=10)
scheduler.add_job(func=spider_ip, args=('获取循环任务0',redis_conn_0), trigger='interval', seconds=60*60*2, id='spider_ip_task0',max_instances=10)
scheduler.add_job(func=aps_detection_ip, args=('检测循环任务1',redis_conn_1), trigger='interval', seconds=3, id='aps_detection_ip_task1',max_instances=10)
scheduler._logger = logging
# scheduler.start()
if __name__ == '__main__':
    # print(get_ip_num())
    # spider_ip("获取循环任务")
    scheduler.start()
    # aps_detection_ip("检测循环任务")


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
机器学习/深度学习 算法 机器人
使用 Python TorchRL 进行多代理强化学习
本文详细介绍了如何使用TorchRL库解决多代理强化学习(MARL)问题,重点讨论了在多代理环境中应用近端策略优化(PPO)。通过使用VMAS模拟器,该文展示了如何在GPU上并行训练多机器人系统,使其在避免碰撞的同时到达目标。文章涵盖了依赖项安装、PPO原理、策略与评论家网络设计、数据收集及训练循环,并强调了TorchRL在简化开发流程、提升计算效率方面的优势。无论是集中式还是分布式评论家配置,TorchRL均能有效支持复杂的MARL研究与实践。
59 5
使用 Python TorchRL 进行多代理强化学习
|
3月前
|
NoSQL Unix 网络安全
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
1月前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
27 7
|
1月前
|
运维 安全 网络协议
Python 网络编程:端口检测与IP解析
本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。
|
2月前
|
NoSQL Linux Redis
linux安装单机版redis详细步骤,及python连接redis案例
这篇文章提供了在Linux系统中安装单机版Redis的详细步骤,并展示了如何配置Redis为systemctl启动,以及使用Python连接Redis进行数据操作的案例。
71 2
|
1月前
|
监控 开发者 Python
Python在AOIP(Audio Over IP)方面的应用探讨
Python在AOIP(Audio Over IP)方面的应用探讨
|
1月前
|
消息中间件 存储 NoSQL
python 使用redis实现支持优先级的消息队列详细说明和代码
python 使用redis实现支持优先级的消息队列详细说明和代码
37 0
|
1月前
|
IDE 搜索推荐 网络安全
Python编程:编写被动信息搜集之网址的IP及Whois查询
Python编程:编写被动信息搜集之网址的IP及Whois查询
下一篇
无影云桌面