GuozhongCrawler系列教程 (1) 三大PageDownloader

   

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

相關文章
相關標籤/搜索