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学习笔记:字典的使用示例详解
Jun 13 Python
python计算牛顿迭代多项式实例分析
May 07 Python
python读写ini配置文件方法实例分析
Jun 30 Python
Python实现购物车功能的方法分析
Nov 10 Python
python清理子进程机制剖析
Nov 23 Python
Atom的python插件和常用插件说明
Jul 08 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
python实现梯度下降和逻辑回归
Mar 24 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
Python几种常见算法汇总
Jun 02 Python
Python如何给你的程序做性能测试
Jul 29 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
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
Js获取事件对象代码
2010/08/05 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
python 排序算法总结及实例详解
2016/09/28 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
python计算auc指标实例
2017/07/13 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
python爬取youtube视频的示例代码
2021/03/03 Python
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
思想政治自我鉴定
2013/10/06 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
医院信息公开实施方案
2014/05/09 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
会员活动策划方案
2014/08/19 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
思想政治表现评语
2015/01/04 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL