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中的作用域规则详解
Jan 30 Python
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
python 识别图片中的文字信息方法
May 10 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
python统计文章中单词出现次数实例
Feb 27 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
Python logging模块handlers用法详解
Aug 14 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 Python
Python获取字典中某个key的value
Apr 13 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读取和保存base64编码的图片内容
2017/04/22 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
javascript 冒号 使用说明
2009/06/06 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
房屋买卖委托公证书
2014/04/08 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
主要领导对照检查材料
2014/08/26 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
英语导游词
2015/02/13 职场文书
团员个人总结
2015/02/26 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年妇女工作总结
2015/05/14 职场文书
食堂卫生管理制度
2015/08/04 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python