如何维护一个1000 IP的免费代理池
楔子
好友李博士要买房了, 前几天应邀帮他抓链家的数据分析下房价, 爬到一半遇到了验证码.
李博士的想法是每天把链家在售的二手房数据都抓一遍, 然后按照时间序列分析. 链家线上在交易的二手房数据大概有30000余套, 而一天只有86400秒, 也就是最慢3s也要访问一个页面. 测试按照这种频率, 大概访问100个页面就会被封了, 而且封锁的时间还不短, 至少在12小时左右. 如果想要每天快速的爬一些数据, 必须得搞定验证码.
链家封锁是按照IP封禁的, 简单的添加上cookies并没有什么效果. 要破解IP封禁, 自然地想法是加上代理就好了. 在公司里代码各种工具都很成熟, 有现成的代理池可用, 自己要爬些数据的时候发现原来什么都需要自己做. 那就自己做个代理池吧.
方案
三种方法:
需要付费的方法
- 自己买IP地址,自己做代理池. 可以利用各种云可以换IP的api(弹性IP),采用几台实例做出口,如果被封了就换IP, 大概看一下IP的价格的话, 就知道这个实在不太现实, 太贵了理论上这个比上一个便宜, 但是还是很贵.
阿里云上最便宜的主机(内网主机, 没有公网IP)大概价格在60元左右, 如果自己做代理池的话, 想要多少并发出口就需要多少台主机. 假如我们需要同时有10个IP出口是可用的, 那么主机的费用就是 600元. 另外一个1Mbps的IP的价格大概是30元左右, IP的价格是300元. 每个月搭建一个代理池就要花费近1000元, 实在是用不起.
而且云主机厂商的IP地址往往是连续的, 很可能换来换去都在一个C段, 这时候对于直接封禁IP段的网站就无解了.
- 直接购买代理,这些代理往往是通过一些接近黑产的方式扫描端口得来的,需要验证才能使用.
购买的代理的价格大概是每天几块到几十块不等, 不同厂商之家大同小异, 一个月最少也都需要几百元左右. 不过之前听同事说这些代理的可用性一般, 拿到的代理还需要自己验证是否可用, 也就是花了钱还不能爽, 自然没有了买的欲望.
穷人的方法
这些卖代理的网站往往都提供了一些免费代理在首页来吸引流量, 少则几十, 多则几百, 初步测试了几个还算能用. 既然直接买来代理也还需要验证, 那还不如直接抓取他们网站上提供的免费代理了. 验证后入库, 用的时候直接选取一个用就好了. 如果代理库里有1000个左右的可用IP, 那还是能解决不少问题的.
代理的一些基础知识
某网站的代理列表:
一般来说, http/https代理用的比较多, socks代理似乎很少使用. 其中好多代理服务器只支持http代理. 比如 https://www.baidu.com 就只能使用https代理访问, 而不能使用http代理. 上图中给出了这些代理的类型, 然而实际测试发现, 这些类型好多都是不准的. 还有响应时间等数据也和服务器有关, 并不能直接使用上面的数据. 所以我们的思路是只要地址和端口, 其他的数据都自己验证.
架构设计
存储
我们把抓到的代理存到mysql中, 具体的表设计如下:
CREATE TABLE `proxy` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`ip` varchar(15) NOT NULL,
`port` int(10) unsigned NOT NULL DEFAULT '3128',
`type` smallint(5) unsigned NOT NULL DEFAULT '0',
`country` varchar(2) DEFAULT NULL,
`state` varchar(15) DEFAULT NULL,
`enqueue_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_check_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`used_times` int(11) NOT NULL DEFAULT '0',
`from_url` varchar(1024) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_ip_port` (`ip`,`port`)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4
抓取和验证
代理的获取分为两个线程, 一个线程使用爬虫不断扫描已知的代理的网站, 获得代理的地址, 验证后入库. 另一个线程扫描库里的代理, 验证是否依然可用.
接口
代理服务对外主要提供一个接口, get_proxy
. 需要使用代理的程序每次调用这个接口获得一个可用代理使用. 每次尽量选取使用次数最少但是存活时间最长的代理.
实现
之前写过一个简单的按照配置文件抓取网页的小爬虫(https://github.com/yifeikong/minicrawler). 这下终于派上用场了. 把每个网页抽取代理的xpath配好, 之后就等着在数据库看数据就好了 _
使用 django 简单实现了一个后台, 大概是这样的:
经过测试, 一般代理的存活时间往往在十几分钟左右, 但是这些代理网站的更新时间一般也在十几分钟, 而且由于找到了大概几十个网站, 扫一遍并验证花费的时间可能在几个小时左右. 所以维持一个可用代理在1k左右的代理库是不成问题的.
get_proxy 的接口如下:
后记
经过测试发现, 国外的代理网站往往量很大, 而且可用率也比较高. 然而由于防火墙的原因, 这些网站以及甚至他们提供的代理在国内是不能访问的, 不过我的主机在阿里云香港, 所以也就没有问题了.
有不少网站显然是发现了我们这种抓代理的行为, 他们页面的IP或者端口是加密的, 而在浏览器中js执行过后则是有正确结果的. 也就是简单地通过抽取是得不到正确结果的. 比如这样:
比如这里在原始网页中是没有代理的IP的, 而是通过js动态生成的.
对于这种网页怎么操作的, 且听下回分解: 使用headless chrome抓取动态网页.
如何维护一个1000 IP的免费代理池的更多相关文章
- 记一次企业级爬虫系统升级改造(六):基于Redis实现免费的IP代理池
前言: 首先表示抱歉,春节后一直较忙,未及时更新该系列文章. 近期,由于监控的站源越来越多,就偶有站源做了反爬机制,造成我们的SupportYun系统小爬虫服务时常被封IP,不能进行数据采集. 这时候 ...
- 常见的User-Agent及免费代理IP网站
常见的User-Agent 1.Android Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 ...
- 转载:使用Tornado+Redis维护ADSL拨号服务器代理池
我们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以 ...
- 打造IP代理池,Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
爬虫面临的问题 不再是单纯的数据一把抓 多数的网站还是请求来了,一把将所有数据塞进去返回,但现在更多的网站使用数据的异步加载,爬虫不再像之前那么方便 很多人说js异步加载与数据解析,爬虫可以做到啊,恩 ...
- Python使用Tornado+Redis维护ADSL拨号服务器代理池
们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...
- 用golang 实现一个代理池
背景 写爬虫的时候总会遇到爬取速度过快而被封IP的情况,这个时候就需要使用代理了.在https://github.com/henson/ProxyPool 的启发下,决定自己实现一个代理池.项目已经开 ...
- python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)
python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...
- 配置个人Ip代理池
做爬虫最害怕的两件事一个是被封账户一个是被封IP地址,IP地址可以使用代理来解决,网上有许多做IP代理的服务,他们提供大量的IP地址,不过这些地址不一定都是全部可用,因为这些IP地址可能被其他人做爬虫 ...
- python代理池的构建5——对mongodb数据库里面代理ip检查
上一篇博客地址:python代理池的构建4--mongdb数据库的增删改查 一.对数据库里面代理ip检查(proxy_test.py) #-*-coding:utf-8-*- ''' 目的:检查代理I ...
随机推荐
- java语言基础(变量和运算符)
java八大基本数据类型: 整型{ int(整型) short(短整型) long(长整型)} 浮点型{ float(浮点型) double(双精度)} 布尔{boolean} ...
- 【 DCOS 】织云 CMDB 管理引擎技术详解
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者 : 李琦 , 腾讯高级工程师 , 就职于网络平台部.曾负责公司海量运营系统的规划设计,如 TMP.Sniper.GSLB.IDCSp ...
- 从Object和Function说说JS的原型链
ECMAScript规定了两个特殊的内置对象:Object和Function.他们的特殊性在于,他们本身既是对象又是函数,而他们同时也是对象和函数的构造器.这种自己生自己的逻辑显然违反人性,如果还停留 ...
- PS各个工具的字母快捷键和英…
原文地址:PS各个工具的字母快捷键和英文全名作者:Tycho 选框-Marquee(M) 移动-move(V) 套索-Lasso(L) 魔棒-Wand(W) 喷枪-in ...
- 个人作业2——英语学习APP的案例分析
第一部分:调研.评测 1.刚刚打开必应词典的时候,它给我的第一反应就是界面美观,最上面是一个查询框,下面有一些经典的句子.单词以及一些精选的文章,所有的功能都可以一目了然,看一眼就知道要怎么去使用,这 ...
- 团队作业4---第一次项目冲刺(AIpha版本)第二天
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 完成了主页及登录页面 2.功能 完成了后端数据处理的全部基本功能:a.数据结构设计及数据交互操作 b.博客页面数据采 ...
- Java学习10——package和import
package和import语句 为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间,使用时,import引入相应package ...
- Java学习3——java介绍
Java程序运行过程: Java两种核心机制: Java虚拟机(Java Virtual Machine),提供程序运行的解释环境,使Java成为一种与平台无关的语言. Java虚拟机可以理解成一个以 ...
- 201521123112《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 在做PTA5.3的时候一段看起来比较复杂的代码: List<En ...
- 201521123098 《Java程序设计》 第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1. 对接口这一定义有了初步的了解: 2. 学习了如何定义实现类和如何实现一些接 ...