【Strawboat】Java实现一个简单易用的IP池

一、简介

爬虫的目标网站一般都会针对爬虫做一些防御措施,其中最常见的手段之一就是过滤掉操作频率过高的IP。比如一些内容社区,文章阅读量的计算方式与IP相关联,一个IP阅读一篇文章后阅读量增加了1,接下来半个小时内去点击阅读量都不会再增加的。假如你有一万个IP,不断切换IP去访问,这时候的阅读量是会持续增加,不受半小时的时间间隔限制的。但是这一万个IP去哪里找呢?本文介绍的IP池-Strawboat就能提供这一万个IP。

Github地址:https://github.com/autumn-projects/strawboat

二、使用方式

1、Jar包引入

  • maven构建工具可按以下方式引入
<dependency>
    <groupId>com.oscroll</groupId>
    <artifactId>strawboat</artifactId>
    <version>1.0.1</version>
</dependency>

2、快速使用

// 创建默认的IP池
ScheduledPool pool = new ScheduledPool();
// 在线程中启动IP池
new Thread(pool::execute).start();
// 从IP池中取出IP
new Thread(() -> {
    for (; ; ) {
        IP ip = pool.take();
        // do something..
    }
}).start();

其中ScheduledPool是阻塞队列的一个装饰类,也就是说pool.take()方法在执行时,如果pool中没有IP,会一直阻塞。

三、进阶用法

1、实现原理

Strawboat主要声明了ProviderFilter两个接口。Provider接口用于提供IP,Filter接口用于过滤IP,对于这两个接口,项目中都有默认的实现方式。然后通过一个确定的规则将ProviderFilter结合起来。

Provider接口

Provider中提供了一个getIPList()方法,每次调用返回一组IP。

Strawboat默认提供了以下网站的免费代理IP:

  • 西刺代理
  • 快代理
  • 云代理
  • 89免费代理

Filter接口

Provider中提供了一个filter()方法,来验证当前IP是否可用。默认通过代理IP访问百度的返回结果来判断该IP是否有效。

IP池实现

IP池默认使用以上ProviderFilter的具体实现,循环获取每个网站的IP并对其进行过滤,如果IP有效则加入队列。

2、拓展与自定义

ScheduledPool初始化时可以指定选用的ProviderFilter

public ScheduledPool(List<Provider> providerList, List<Filter> filterList) {
    this.providerList = providerList;
    this.filterList = filterList;
}

用户可以选用已有的Provider,或者实现Provider接口,将自定义的IP获取方式放入IP池中,同理Filter的实现方式也是如此。

四、结束语

当前版本为Strawboat的第一个版本(strawboat-1.0.1),包含了IP池应有的功能,用户也能根据自己的需求进行拓展。只是功能上还比较单一,这一点在以后的版本中会进行拓展。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,959评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,432评论 25 708
  • 孩子随便跑,那是他的事,这个妈妈不管。 孩子流鼻血了,妈妈照样看手机里的电视剧,如此真定,孩子自己倒知道擦擦鼻血。...
    兰儿悠悠阅读 566评论 12 30
  • 乔希·维茨金是一个天才级的人物。他从九岁起便八度荣获全美象棋冠军。在纵横西方棋坛十年以后,改行研习太极拳,并连续2...
    棋灵解书阅读 243评论 0 0