GuozhongCrawler QQ群 202568714
java
GuozhongCrawler内置三大PageDownloader。分别是采用HttpClient做为内核下载的DefaultPageDownloader、采用HtmlUnitDriver做为内核下载WebDriverDownloader、采用ChromeDriver调用浏览器做为内核下载的ChromeDriverDownloader。web
其中DefaultPageDownloader和WebDriverDownloader在实际开发中用的最好性能也是最好的。而ChromeDriverDownloader虽然性能不佳。可是ChromeDriverDownloader可以灵活调用浏览器抓取。在调试过程当中使用ChromeDriverDownloader能够看到爬虫真实的运行流程确实为开发增添了很多乐趣。chrome
首先咱们来看下如何使用大三下载器。以及它们各类什么特色。浏览器
1、DefaultPageDownloader框架
DefaultPageDownloader既然是采用HttpClient做为内核下载器。那么他必须兼容全部httpClient应该有的功能。例子咱们以职友企业网抓取为例子。咱们准备了阿里巴巴和淘宝网两个公司的主页URL。并经过CrawTaskBuilder注入到CrawlTask中。prepareCrawlTask时指定使用DefaultPageDownloader做为下载器。jvm
String alibaba = "http://www.jobui.com/company/281097/";
String taobao = "http://www.jobui.com/company/593687/";
CrawTaskBuilder builder = CrawlManager.getInstance()
.prepareCrawlTask("职友网爬虫", DefaultPageDownloader.class)
.useThread(2)//使用两个线程下载
.injectStartUrl(alibaba, PageCompanyDescript.class)
.injectStartUrl(taobao, PageCompanyDescript.class)
.usePageEncoding(PageEncoding.UTF8);
CrawlTask spider = builder.build();
CrawlManager.getInstance().start(spider);ide
PageCompanyDescript.java的实现咱们如今暂时只输出解析出来的公司名称代码以下性能
public class PageCompanyDescript implements PageProcessor {
@Override
public PageScript getJavaScript() {
return null;
}
@Override
public Pattern getNormalContain() {
return null;
}
@Override
public void process(OkPage page, StartContext context,
List<BasicRequest> queue, List<Proccessable> objectContainer)
throws Exception {
Document doc = Jsoup.parse(page.getContent());
Element h1 = doc.select("h1[id=companyH1]").first();
if(h1 != null){
System.out.println("公司全称:"+h1.text());
}
}
@Override
public void processErrorPage(Page arg0, StartContext arg1)
throws Exception {
}
}测试
OK。如今测试代码就已经完成。咱们运行。ui
2、WebDriverDownloader
使用WebDriverDownloader其实只要把main方法中的prepareCrawlTask("职友网爬虫", DefaultPageDownloader.class)
改为prepareCrawlTask("职友网爬虫", WebDriverDownloader.class)便可完成WebDriverDownloader的设置。
为了体现区别咱们在PageCompanyDescript中实现getJavaScript方法来执行一段js代码。getJavaScript实现以下:
@Override
public PageScript getJavaScript() {
return new PageScript() {
@Override
public void executeJS(HtmlUnitDriver driver) throws Exception {
WebElement element = driver.findElementById("companyH1");
driver.executeScript("arguments[0].innerHTML='WebDriverDownloader支持执行JavaScript';", element);
}
};
}
OK运行以后的结果以下图。
10:10:23,572到 10:10:32,056中间相差了9s的时间。这是由于webdriver的js引擎在jvm中执行确实过慢。但大规模抓取过程当中仍是建议采用抓包抓取的方式。
3、ChromeDriverDownloader
ChromeDriverDownloader和WebDriverDownloader功能上同样。只是下载会调用谷歌浏览器。用户须要安装谷歌浏览器和下载chromedriver。放在谷歌浏览器的安装目录。个人目录是D:\program files (x86)\Chrome。那么chromedriver的路径是D:\program files (x86)\Chrome\chromedriver.exe。
这里解释下ChromeDriver是Chromium team开发维护的,它是实现WebDriver有线协议的一个单独的服务。ChromeDriver经过chrome的自动代理框架控制浏览 器,ChromeDriver只与12.0.712.0以上版本的chrome浏览器兼容。
chromedriver下载地址:https://code.google.com/p/chromedriver/wiki/WheredAllTheDownloadsGo?tm=2
以后咱们修改main方法中的代码:
//设置chromedriver.exe路径
System.setProperty("webdriver.chrome.driver", "D:\\program files (x86)\\Chrome\\chromedriver.exe");
String alibaba = "http://www.jobui.com/company/281097/";
String taobao = "http://www.jobui.com/company/593687/";
CrawTaskBuilder builder = CrawlManager.getInstance()
.prepareCrawlTask("职友网爬虫", ChromeDriverDownloader.class)
.useThread(2)//使用两个线程下载
.injectStartUrl(alibaba, PageCompanyDescript.class)
.injectStartUrl(taobao, PageCompanyDescript.class)
.usePageEncoding(PageEncoding.UTF8);
CrawlTask spider = builder.build();
CrawlManager.getInstance().start(spider);
再次执行会弹出谷歌浏览器界面,咱们能够看到爬虫抓取过程了。
控制台输出
可能你会注意到。咱们用了useThread(2)//使用两个线程下载。为何没有出现两个谷歌浏览器同时抓。这里解释是由于咱们注入种子URL的方式是使用injectStartUrl它会注入2个StartContext。而StartContext比如是一批种子URL的上下文。同一时间是不能同时使用的。为此GuozhongCrawler提供了DynamicEntrance的概念实现多个种子URL同时共享一个StartContext的功能。想了解DynamicEntrance的话,请继续关注后期GuozhongCrawler系列教程。谢谢你们!
GuozhongCrawler QQ群 202568714