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编写一个简单的Lisp解释器的教程
Apr 03 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
python中的lambda表达式用法详解
Jun 22 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python常见的pandas用法demo示例
Mar 16 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
Python 合并拼接字符串的方法
Jul 28 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
python中翻译功能translate模块实现方法
Dec 17 Python
解决Pycharm 运行后没有输出的问题
Feb 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
Mysql的常用命令
2006/10/09 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
浅谈Angular7 项目开发总结
2018/12/19 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
python with statement 进行文件操作指南
2014/08/22 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
python使用Matplotlib画饼图
2018/09/25 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
pandas的qcut()方法详解
2019/07/06 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
环境工程求职简历的自我评价范文
2013/10/24 职场文书
《失物招领》教学反思
2016/02/20 职场文书