技术背景
在网络爬虫开发中,通过模拟浏览器行为去获取网络数据是一种常见的方式。而在这个过程中,我还需要监控网络请求、响应状态码、资源类型、响应时间等数据。本篇博文将介绍如何使用BrowserMobProxy结合Selenium进行网络爬虫开发,并结合Monitor类实现网络监控和数据统计。
功能需求
- 使用BrowserMobProxy管理代理,实现对网络请求的捕获和监控
- 配置Chrome浏览器选项,允许远程控制、忽略证书错误、设置浏览器驱动位置等
- Monitor类提供对状态码、响应时间、资源类型、页面元素等监控和数据统计
- BaseSpider类作为爬虫的抽象类,提供爬取和处理页面的方法
- DefaultCrawler类继承BaseSpider,实现具体的爬虫逻辑,包括解析页面元素和处理HarEntry数据
技术实现
BrowserMobProxyManager
职责:
- 启动和停止BrowserMobProxy。
- 创建新的HAR日志。
- 启用或禁用特定的捕获类型。
- 获取HAR日志。
package com.qcmb.crawler;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.CaptureType;
import org.openqa.selenium.Proxy;
/**
* 负责BrowserMobProxy的配置和管理
*/
public class BrowserMobProxyManager {
private final BrowserMobProxy proxy;
public BrowserMobProxyManager(){
proxy = new BrowserMobProxyServer();
}
public void start(String harName) {
proxy.start(0);
//初始化一个新的 HAR 日志,并指定要捕获的请求内容。
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT);
//创建一个名为"MyTest"的新 HAR 日志。
proxy.newHar(harName);
}
public Proxy getSeleniumProxy() {
return ClientUtil.createSeleniumProxy(proxy);
}
public Har getHar() {
return proxy.getHar();
}
public void stop() {
proxy.stop();
}
}
SetupOption
职责:
- 设置Chrome浏览器的代理。
- 允许远程控制浏览器。
- 忽略一些安全警告。
- 设置驱动程序的位置。
- 设置专用浏览器的位置。
package com.qcmb.crawler;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 配置
*/
public class SetupOption {
private final String driverPath;
private final String browserPath;
//设置Chrome浏览器选项,以代理模式
protected final ChromeOptions options;
public SetupOption(String driverPath, String browserPath){
options = new ChromeOptions();
this.driverPath = driverPath;
this.browserPath = browserPath;
}
public ChromeOptions initOptions(Proxy seleniumProxy){
options.setProxy(seleniumProxy);
//允许远程控制浏览器
options.addArguments("--remote-allow-origins=*");
//忽略一些安全
options.addArguments("--ignore-certificate-errors");
options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
//驱动位置
System.setProperty("webdriver.chrome.driver", driverPath);
//专用浏览器位置
options.setBinary(browserPath);
return options;
}
}
Monitor
职责:
- 监控网络请求的状态码。
- 监控网络请求的响应时间。
- 监控网络请求的资源类型。
- 监控页面元素的数量。
package com.qcmb.crawler;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 监控
*/
public class Monitor{
//监控资源
private final Map<String, ResourceType> resourceTypes =