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实现计算两个时间之间相差天数的方法
May 10 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python标准库笔记struct模块的使用
Feb 22 Python
python构建深度神经网络(续)
Mar 10 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
python验证身份证信息实例代码
May 06 Python
详解如何设置Python环境变量?
May 13 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
Python调用C/C++的方法解析
Aug 05 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用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
php创建图像具体步骤
2017/03/13 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python实现画图软件功能方法详解
2020/07/28 Python
Flask处理Web表单的实现方法
2021/01/31 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
如何处理简单的PHP错误
2015/10/14 面试题
银行简历自我评价
2014/02/11 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
授权委托书范文
2014/07/31 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
幼师自荐信范文
2015/03/06 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
停发工资证明范本
2015/06/12 职场文书
电台广播稿范文
2015/08/19 职场文书
如何写好开幕词?
2019/06/24 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python