现在的服务基本上都离不开监控。Webmagic 爬虫框架自带了监控功能,本文将带领大家使用?Webmagic 爬虫的监控功能。
Webmagic 爬虫的监控是 0.5.0 新增的功能。利用这个功能,可以查看爬虫的执行情况——已经下载了多少页面、还有多少页面、启动了多少线程等信息。该功能通过 JMX 实现,你可以使用 Jconsole 等 JMX 工具查看本地或者远程的爬虫信息。
注意: 如果你自己定义了 Scheduler,那么需要用这个类实现 MonitorableScheduler 接口,才能查看“LeftPageCount”和“TotalPageCount”这两条信息。
为爬虫项目添加监控
添加监控非常简单,获取一个 SpiderMonitor 的单例 SpiderMonitor.instance(),并将你想要监控的 Spider 注册进去即可。你可以注册多个 Spider 到 SpiderMonitor 中。
public class MonitorExample { public static void main(String[] args) throws Exception { Spider oschinaSpider = Spider.create(new OschinaBlogPageProcessor()) .addUrl("http://my.oschina.net/flashsword/blog"); Spider githubSpider = Spider.create(new GithubRepoPageProcessor()) .addUrl("https://github.com/code4craft"); SpiderMonitor.instance().register(oschinaSpider); SpiderMonitor.instance().register(githubSpider); oschinaSpider.start(); githubSpider.start(); } }
查看监控信息
WebMagic 的监控使用 JMX 提供控制,你可以使用任何支持 JMX 的客户端来进行连接。我们这里以 JDK 自带的 JConsole 为例。我们首先启动 WebMagic 的一个 Spider,并添加监控代码。然后我们通过 JConsole 来进行查看。
启动程序,然后在命令行输入 jconsole(windows 下是在 DOS 下输入 jconsole.exe)即可启动 JConsole。
这里我们选择启动 WebMagic 的本地进程,连接后选择“MBean”,点开“WebMagic”,就能看到所有已经监控的 Spider 信息了!
这里我们也可以选择“操作”,在操作里可以选择启动-start()和终止爬虫-stop(),这会直接调用对应 Spider 的 start()和 stop()方法,来达到基本控制的目的。
扩展监控接口
除了已有的一些监控信息,如果你有更多的信息需要监控,也可以通过扩展的方式来解决。你可以通过继承 SpiderStatusMXBean 来实现扩展,具体例子可以看这里: 定制扩展 demo。
WebMagic 配置代理
从 0.4.0 版本开始,WebMagic 开始支持 Http 代理。因为场景的多样性,代理这部分 API 一直处于不稳定状态,但是因为需求确实存在,所以 WebMagic 会继续支持代理部分的完善。目前发布的 API 只是 beta 版,后续 API 可能会有更改。代理相关的设置都在 Site 类中。
API | 说明 |
---|---|
Site.setHttpProxy(HttpHost httpProxy) | 设置单一的普通 HTTP 代理 |
Site.setUsernamePasswordCredentials(UsernamePasswordCredentials usernamePasswordCredentials) | 为 HttpProxy 设置账号密码 |
Site.setHttpProxyPool(List/?httpProxyList, boolean isUseLastProxy) | 设置代理池 |
设置单一的普通 HTTP 代理为 101.101.101.101 的 8888 端口,并设置密码为”username”,”password”
site.setHttpProxy(new HttpHost("101.101.101.101",8888)) .setUsernamePasswordCredentials(new UsernamePasswordCredentials("username","password"))
设置代理池,其中包括 101.101.101.101 和 102.102.102.102 两个 IP
List<String[]> poolHosts = new ArrayList<String[]>(); poolHosts.add(new String[]{"username","password","101.101.101.101","8888"}); poolHosts.add(new String[]{"username","password","102.102.102.102","8888"}); //httpProxyList 输入是 IP+PORT, isUseLastProxy 是指重启时是否使用上一次的代理配置 site.setHttpProxyPool(poolHosts,false);
0.6.0 版本后,允许实现自己的代理池,通过扩展接口 ProxyPool 来实现。目前 WebMagic 的代理池逻辑是:轮流使用代理池中的 IP,如果某个 IP 失败超过 20 次则增加 2 小时的重用时间,具体实现可以参考 SimpleProxyPool。