1. 程式人生 > >GuozhongCrawler系列教程 (1) 三大PageDownloader

GuozhongCrawler系列教程 (1) 三大PageDownloader

特點 string null 瀏覽器兼容 ror down odi 系列 lan

GuozhongCrawler QQ群 202568714

教程源代碼下載地址:http://pan.baidu.com/s/1pJBmerL

GuozhongCrawler內置三大PageDownloader。各自是採用HttpClient作為內核下載的DefaultPageDownloader、採用HtmlUnitDriver作為內核下載WebDriverDownloader、採用ChromeDriver調用瀏覽器作為內核下載的ChromeDriverDownloader。

當中DefaultPageDownloader和WebDriverDownloader在實際開發中用的最好性能也是最好的。而ChromeDriverDownloader盡管性能不佳。可是ChromeDriverDownloader可以靈活調用瀏覽器抓取。

在調試過程中使用ChromeDriverDownloader可以看到爬蟲真實的執行流程確實為開發增添了不少樂趣。

首先我們來看下怎樣使用大三下載器。

以及它們各種什麽特點。

一、DefaultPageDownloader

DefaultPageDownloader既然是採用HttpClient作為內核下載器。

那麽他必須兼容全部httpClient應該有的功能。

樣例我們以職友企業網抓取為樣例。我們準備了阿裏巴巴和淘寶網兩個公司的主頁URL。並通過CrawTaskBuilder註入到CrawlTask中。

prepareCrawlTask時指定使用DefaultPageDownloader作為下載器。

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);

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。如今測試代碼就已經完畢。我們執行。

技術分享



二、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中運行確實過慢。但大規模抓取過程中還是建議採用抓包抓取的方式。



三、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

GuozhongCrawler系列教程 (1) 三大PageDownloader