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采用django框架实现支付宝即时到帐接口
May 17 Python
Python 列表理解及使用方法
Oct 27 Python
python机器学习之神经网络(二)
Dec 20 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Python3数字求和的实例
Feb 19 Python
matplotlib.pyplot画图并导出保存的实例
Dec 07 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
python 常见的反爬虫策略
Sep 27 Python
Python 串口通信的实现
Sep 29 Python
python中time、datetime模块的使用
Dec 14 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
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
jquery手风琴特效插件
2015/02/04 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
django实现分页的方法
2015/05/26 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
询价采购方案
2014/06/09 职场文书
协议书格式模板
2016/03/24 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python