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判断端口是否打开的实现代码
Feb 10 Python
Python中的并发编程实例
Jul 07 Python
Python lxml模块安装教程
Jun 02 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python IDLE入门简介
Dec 08 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
pandas DataFrame运算的实现
Jun 14 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
python实现粒子群算法
Oct 15 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 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
cache_lite试用
2007/02/14 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php创建无限级树型菜单
2015/11/05 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
许愿墙中用到的函数
2006/10/07 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
React diff算法的实现示例
2018/04/20 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
JS实现小米轮播图
2020/09/21 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
python获取android设备的GPS信息脚本分享
2015/03/06 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Python批量查询域名是否被注册过
2017/06/21 Python
Python中turtle作图示例
2017/11/15 Python
python 正确保留多位小数的实例
2018/07/16 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
python中rc1什么意思
2020/06/19 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
文化产业实施方案
2014/06/07 职场文书
竞聘自述材料
2014/08/25 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
Python 图片添加美颜效果
2022/04/28 Python