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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
pycharm安装图文教程
May 02 Python
Python入门_学会创建并调用函数的方法
May 16 Python
Python编写一个闹钟功能
Jul 11 Python
django进阶之cookie和session的使用示例
Aug 17 Python
Python字典的核心底层原理讲解
Jan 24 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
python tkinter canvas使用实例
Nov 04 Python
python程序输出无内容的解决方式
Apr 09 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
python编写扎金花小程序的实例代码
Feb 23 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
jQuery 源码分析笔记
2011/05/25 PHP
php标签云的实现代码
2012/10/10 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
react build 后打包发布总结
2018/08/24 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
对python中的logger模块全面讲解
2018/04/28 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
超简单使用Python换脸实例
2019/03/27 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
基于opencv实现简单画板功能
2020/08/02 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书