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实现的寻找前5个默尼森数算法示例
Mar 25 Python
python指定写入文件时的编码格式方法
Jun 07 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python读取文本中的坐标方法
Oct 14 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python实现数字炸弹游戏
Jul 17 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
使用tensorflow 实现反向传播求导
May 26 Python
python套接字socket通信
Apr 01 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+DBM的同学录程序(1)
2006/10/09 PHP
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python中的Numpy入门教程
2014/04/26 Python
跟老齐学Python之类的细节
2014/10/13 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
python实现五子棋游戏
2019/06/18 Python
python线程join方法原理解析
2020/02/11 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
销售主管竞聘书
2014/03/31 职场文书
签约仪式策划方案
2014/06/02 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL