突然发现ip由于过于频繁的访问被禁用了,所以在这里搞一个免费HTTP代理ip池,众所周知,代理IP都是有时效性的。不可避免地,你会发现爬取到的代理大部分都是不可用的,所以在使用代理IP之前还需要对代理IP的可用性进行验证,验证的方法就是:使用代理IP去请求指定URL,根据返回的响应判断代理IP是否可用。

项目代码

utils.py

utils.py 是一个工具类,包含了一些常用操作,比如:剔除字符串的首位空白,获取代理IP的URL,更新代理IP的信息。# -*- coding: utf-8 -*-
import logging
from settings import PROXY_URL_FORMATTER# 设置日志的输出样式
logging.basicConfig(level=logging.INFO,format='[%(asctime)-15s] [%(levelname)8s] [%(name)10s ] - %(message)s (%(filename)s:%(lineno)s)',datefmt='%Y-%m-%d %T')
logger = logging.getLogger(__name__)# 剔除字符串的首位空格
def strip(data):if data is not None:return data.strip()return data# 获取代理IP的url地址
def _get_url(proxy):return PROXY_URL_FORMATTER % {'schema': proxy['schema'], 'ip': proxy['ip'], 'port': proxy['port']}# 根据请求结果更新代理IP的字段信息
def _update(proxy, successed=False):proxy['used_total'] = proxy['used_total'] + 1if successed:proxy['continuous_failed'] = 0proxy['success_times'] = proxy['success_times'] + 1else:proxy['continuous_failed'] = proxy['continuous_failed'] + 1
 

settings.py

settings.py 汇聚了整个项目的配置信息。

# 指定Redis的主机名和端口
REDIS_HOST = '172.16.250.238'
REDIS_PORT = 6379
REDIS_PASSWORD = 123456# 保存已经检验的代理的 Redis key 格式化字符串
PROXIES_REDIS_FORMATTER = 'proxies::{}'# 保存已经检验的代理
PROXIES_REDIS_EXISTED = 'proxies::existed'# 保存未检验代理的Redis key
PROXIES_UNCHECKED_LIST = 'proxies:unchecked:list'# 已经存在的未检验HTTP代理和HTTPS代理集合
PROXIES_UNCHECKED_SET = 'proxies:unchecked:set'# 最多连续失败几次
MAX_FAILURE_TIMES = 2# 代理地址的格式化字符串
PROXY_URL_FORMATTER = '%(schema)s://%(ip)s:%(port)s'BASE_HEADERS = {'Connection': 'close','Accept': '*/*','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
}# 检验代理可用性的请求地址
PROXY_CHECK_URLS = {'https': ['https://blog.csdn.net/pengjunlee/article/details/81212250','https://blog.csdn.net/pengjunlee/article/details/54974260', 'https://icanhazip.com'],'http': ['http://blog.csdn.net/pengjunlee/article/details/80919833','http://blog.csdn.net/pengjunlee/article/details/81589972', 'http://icanhazip.com']}

proxy_queue.py

proxy_queue.py 定义了两个代理存储队列类:刚刚爬取到的尚未检测过可用性的代理IP队列(UncheckQueue)和已经检测过可用性的代理IP队列(CheckQueue,该队列中的代理IP也需要定时反复检测可用性)。

# -*- coding: utf-8 -*-
import json
from utils import _get_url
from settings import PROXIES_REDIS_EXISTED, PROXIES_REDIS_FORMATTER, PROXIES_UNCHECKED_LIST, PROXIES_UNCHECKED_SET, \MAX_FAILURE_TIMES"""
Proxy Queue Base Class
"""
class BaseQueue(object):def __init__(self, server):"""Initialize the proxy queue instanceParameters----------server : StrictRedisRedis client instance"""self.server = serverdef _is_existed(self, proxy):"""判断当前代理是否已经存在"""added = self.server.sadd(PROXIES_REDIS_EXISTED, _get_url(proxy))return added == 0def push(self, proxy):"""根据检验结果,将代理放入相应队列"""if not self._is_existed(proxy) and proxy['continuous_failed'] < MAX_FAILURE_TIMES:key = PROXIES_REDIS_FORMATTER.format(proxy['schema'])self.server.rpush(key, json.dumps(proxy, ensure_ascii=False))def pop(self, schema, timeout=0):"""Pop a proxy"""raise NotImplementedErrordef __len__(self, schema):"""Return the length of the queue"""raise NotImplementedErrorclass CheckedQueue(BaseQueue):"""待检测的代理队列"""def __len__(self, schema):"""Return the length of the queue"""return self.server.llen(PROXIES_REDIS_FORMATTER.format(schema))def pop(self, schema, timeout=0):"""从未检测列表弹出一个待检测的代理"""if timeout > 0:p = self.server.blpop(PROXIES_REDIS_FORMATTER.format(schema), timeout)if isinstance(p, tuple):p = p[1]else:p = self.server.lpop(PROXIES_REDIS_FORMATTER.format(schema))if p:p = eval(p)self.server.srem(PROXIES_REDIS_EXISTED, _get_url(p))return pclass UncheckedQueue(BaseQueue):"""已检测的代理队列"""def __len__(self, schema=None):"""Return the length of the queue"""return self.server.llen(PROXIES_UNCHECKED_LIST)def pop(self, schema=None, timeout=0):"""从未检测列表弹出一个待检测的代理"""if timeout > 0:p = self.server.blpop(PROXIES_UNCHECKED_LIST, timeout)if isinstance(p, tuple):p = p[1]else:p = self.server.lpop(PROXIES_UNCHECKED_LIST)if p:p = eval(p)self.server.srem(PROXIES_UNCHECKED_SET, _get_url(p))

运行方法

打开命令行终端,执行如下命令开始检测代理IP的可用性:

 
python check_proxy.py -u # 检测 proxies:unchecked:list 队列中代理的可用性
python check_proxy.py -c -s http # 检测 proxies::http 队列中代理的可用性
python check_proxy.py -c -s https # 检测 proxies::https 队列中代理的可用性[root@localhost proxy_check]# python3 /usr/local/src/python_projects/proxy_check/check_proxy.py -c -s http
[2019-05-23 20:15:18] [    INFO] [     utils ] - 待检测代理数量: 437 (check_proxy.py:33)
[2019-05-23 20:15:23] [    INFO] [     utils ] - 使用代理< http://5.202.192.146:8080 > 请求 < http://blog.csdn.net/pengjunlee/article/details/80919833 > 结果: 失败  (check_proxy.py:58)
[2019-05-23 20:15:28] [    INFO] [     utils ] - 使用代理< http://5.202.192.146:8080 > 请求 < http://blog.csdn.net/pengjunlee/article/details/81589972 > 结果: 失败  (check_proxy.py:58)
[2019-05-23 20:15:34] [    INFO] [     utils ] - 使用代理< http://5.202.192.146:8080 > 请求 < http://icanhazip.com > 结果: 失败  (check_proxy.py:58)
[2019-05-23 20:15:34] [    INFO] [     utils ] - 待检测代理数量: 436 (check_proxy.py:33)
[2019-05-23 20:15:35] [    INFO] [     utils ] - 使用代理< http://60.217.137.22:8060 > 请求 < http://blog.csdn.net/pengjunlee/article/details/80919833 > 结果: 成功  (check_proxy.py:63)

超级操作,海量数据任你爬,无惧ip限制相关推荐

  1. select每门可说大于90分_小女子风雨黑暗无惧 90分全自动反向折叠照明伞

    我是个护士,四班倒,白天还好,不下雨也还好,如果遇到中班,晚上22点交班后,外面太黑了,如果在碰伤下雨天,真不知怎么好了.虽然家离工作的医院距离很近,有个500米左右,但一个人在黑暗下雨的夜晚行走,还 ...

  2. 别怕,BCH无惧攻击

    对于数字货币来说最害怕的莫过于黑客和51%攻击.前有黑客利用以太坊 ERC-20 智能合约中的漏洞攻击美链和SMT,导致其币价几乎归零.后有比特币黄金BTG和XVG遭受黑客51%攻击损失惨重.因此每当 ...

  3. 域名与转发服务器ip指向不一致_域名映射到家庭网络(无公网IP)

    下面几段文字是我对内网穿透的理解和原理分析.如果只想了解如何配置,请直接跳到最下方图文配置介绍. 由于IPv4的地址已经全部分配完毕,某些运营商不给普通用户公网IP,你的路由器可能连接到运营商上一级路 ...

  4. python爬取国内代理ip_Python语言爬取代理IP

    本文主要向大家介绍了Python语言爬取代理IP,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. #!/usr/bin/env python #-*-coding=utf-8 -* ...

  5. 无浮动IP的虚机出公网流量路径

    女主宣言 通过Neutron构建网络时涉及的知识点比较广,虚拟化网络实施上又具有非常大的灵活性,这往往会让刚接触的同学摸不着头脑.本文特意对"无浮动IP的虚机出公网流量路径"这一场 ...

  6. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!

    摘要:在华为全联接2021期间,华为云GaussDB(for openGauss)正式推出重大内核新特性--同城双集群高可用方案,提供金融级高可用服务,支持RPO=0 .RTO<60s的同城双集 ...

  7. python爬取代理IP并进行有效的IP测试

    爬取代理IP及测试是否可用 很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的代理IP,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接 ...

  8. 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)

    系列 [实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') [实用工具系列之爬虫]python实现快速爬取财经资讯(防 '反爬虫') 本文使用python实现代理IP的爬取,并可以防' ...

  9. SSH远程ubuntu【无公网IP、内网穿透】 1-3

    系列文章 SSH远程ubuntu[无公网IP.内网穿透] 1-3 SSH远程ubuntu[无公网IP.内网穿透] 2-3 SSH远程ubuntu[无公网IP.内网穿透] 3-3 在之前的系列文章中(如 ...

最新文章

  1. android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。
  2. 波士顿动力副总裁:机器人一天就学会了芭蕾舞,尚未使用机器学习技术
  3. jar包 和 war包?
  4. myemployees库的四张表介绍
  5. 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 第1章 Python的创建型设计模式...
  6. Math中的常用方法
  7. 悉尼一船只引擎爆炸男子被迫跳水:严重烧伤被送医
  8. 基于mycat的mysql_基于Mycat中间件的MySQL读写分离
  9. 瑞典ENEA参展IIC,奏起OSE/Linux混合途径乐章【ZZ】
  10. Atitit 提升可读性的艺术 目录 1. 几大原则 2 1.1. 直接原则,无脑原则。。。 2 2. 本地化命名法 2 2.1. 可以使用管理命名法 多个api 比如old api,new ap
  11. android 电视 vob格式转换,vob格式转换器免费版|闪电vob格式转换器 v9.7.0 免费版 - 软件下载 - 绿茶软件园|33LC.com...
  12. android 5.0 屏幕录制,Android 5.0+ 视频录制 ScreenCapture
  13. mysql 允许主码重复_数据库主码可以重复吗
  14. R语言使用dplyr包计算dataframe分组聚合四分位距IQR值(四分位距(interquartile range, IQR),又称四分差)
  15. 算法竞赛入门经典 UVa815 Flooded!
  16. 【可穿戴算法】-进阶-心率变异性分析
  17. Vue上传文件 iview Upload UI 组件上传组件
  18. 计算机连接宽带还需要登陆用户,每次电脑启动都需要手动连接宽带怎么办? 爱问知识人...
  19. ${pageContext.request.contextPath}的作用
  20. android修改屏幕大小设置,android mediaplayer 视频修改视频大小 (屏幕尺寸mediaPlayer =......

热门文章

  1. xuperchain
  2. stm32 串口2空闲中断死机_关于STM32串口空闲中断IDEL的问题
  3. 看我如何从外网直接拿下内网靶标
  4. 嵌入式与产品-凤舞天
  5. 中专学的计算机大学可以换专业吗,计算机中专升大专可以换专业吗
  6. 数据库结构的简单设计
  7. 华三交换机升级的ipe文件_LSU1WCME0 V5升级V7失败问题处理经验
  8. 一篇文章学会写作,自媒体人的必经之路
  9. 移动应用统计的基本原理及 UMID 方案解析
  10. c语言编取消猎豹信息程培训,信息学奥林匹克竞赛C++教程(一)_编程基础