python如何基于redis实现ip代理池


Posted in Python onJanuary 17, 2020

这篇文章主要介绍了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实现进程间通信简单实例
Jul 23 Python
Python实现带百分比的进度条
Jun 28 Python
浅析使用Python操作文件
Jul 31 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python调用百度REST API实现语音识别
Aug 30 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
tornado+celery的简单使用详解
Dec 21 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
keras得到每层的系数方式
Jun 15 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
解决python gdal投影坐标系转换的问题
Jan 17 #Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 #Python
Python计算机视觉里的IOU计算实例
Jan 17 #Python
python实现百度OCR图片识别过程解析
Jan 17 #Python
Python实现图像的垂直投影示例
Jan 17 #Python
基于python实现语音录入识别代码实例
Jan 17 #Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 #Python
You might like
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
非常实用的php验证码类
2016/05/15 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
采购文员岗位职责
2013/11/20 职场文书
销售总监工作职责
2013/11/21 职场文书
酒店管理求职信范文
2014/04/06 职场文书
医德考评自我评价
2014/09/14 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
2015年护士节活动总结
2015/02/10 职场文书
公司转让协议书
2016/03/19 职场文书
学生会自荐信
2019/05/16 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
pandas求平均数和中位数的方法实例
2021/08/04 Python