经常被反爬封IP?你需要一个IP代理池

面向监狱编程

 

爬虫不难,难的是面对各种网站的反爬机制,这样就经常碰到了被IP的反爬了。没有爬几个就被封了IP返回的状态码302,或者其他。不禁感慨,搞爬虫就像黑帽子搞破解。

那好吧,社会求职技能所需不得不咬牙迎难而上。说说搭建IP代理池的架构原理,看图。

 

总的来说,可以分为4个模块:获取模块、存储模块、接口模块和检测模块;因为过滤器和定时检查都是在检测IP的可用性。

简单介绍这四个模块的功能作用:

获取模块:定时从代理网站抓取代理,代理可以是免费的也可以是付费的(由于家境贫寒,我抓取公开免费的),抓取的形式是“IP:端口”,接着把抓取到的代理存储到数据库。

存储模块:负责存储抓取下来的代理,必须保证不重复,还要标识可用情况,因为公开免费的有可能已经被人用过已被其他网站封了。这里使用高效和方便的存储方式就是使用redis的有序集合。

接口模块:假如用直接连接数据库提供代理数据就显得不那么安全和方便了,这时我们可以用web api接口提供代理数据,其中会随机返回一个可用的代理供接口使用者。

检测模块:需要定时检测数据据库里的代理,如果不是作为通用爬虫就直接设置需要抓取的网站,要不然直接百度为检测网站,还需要设置一个代理的可用机制,新抓取到的IP入库给10分,一旦检测到可用的给100分,每检测一次不可用扣一分,0分的直接移出数据库。

 

以上就是内部的一些实现了。

附上个人Github参考代码链接

最后,第二次以后使用代理池建议先删除一下上次的key:

127.0.0.1:6379> keys *
1) "name"
2) "proxies"
3) "test"
127.0.0.1:6379> del proxies
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "test"
127.0.0.1:6379>

 

说说踩过的一个坑:

网上的一些教程示例代码其中redis数据库的一个zadd实现方法这样的,

 

可异常报错如下,当时无解了,困惑了许久:

最后不得不查看源码,源码如下:

看到第一个参数mapping,见其名知其意?继续看它是怎么实现的......

发现了没有,第二个传参应该就是一个map类型的,遍历map实现运算的。

 

所以,最后这样写就可以了:

大概是版本模块更新了吧......

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00