python如何基于redis实现ip代理池
2020-03-24 19:01
429 查看
这篇文章主要介绍了python如何基于redis实现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("检测循环任务")
以上就是全部的内容,最后给大家推荐一个口碑不错的公众号【程序员学府】,这里有很多的老前辈学习技巧,学习心得,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员定时讲解Python技术,分享一些学习的方法和需要留意的小细节,喜欢我要记得关注我
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- python如何基于redis实现ip代理池
- 基于Redis 的高并发抢红包程序是如何实现的
- Python 基于固定 IP 来命名 ARM 虚拟机的实现
- 2017.8.22 用python实现简单基于TCP/IP的客户端与服务器端
- Python 基于固定 IP 来命名 ARM 虚拟机的实现
- 如何基于python实现归一化处理
- 如何简单实现接口自动化测试(基于 Python)
- python 全栈开发,Day140(RabbitMQ,基于scrapy-redis实现分布式爬虫)
- 基于Python,scrapy,redis的分布式爬虫实现框架
- 基于Python使用scrapy-redis框架实现分布式爬虫 注
- 如何简单实现接口自动化测试—基于 python
- redis如何实现持久化(python)--------------------------落雨成风
- 详解Java如何实现基于Redis的分布式锁
- Python基于scapy实现修改IP发送请求的方法示例
- 基于PYTHON requests包,代理ip+header+延时爬取的简单实现
- 基于Python+scrapy+redis的分布式爬虫实现框架
- 如何简单实现接口自动化测试(基于 python)
- Python 基于固定 IP 来命名 ARM 虚拟机的实现
- Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?