GuozhongCrawler系列教程 (1) 三大PageDownloader
博客专区 > 郭钟 的博客 > 博客详情
GuozhongCrawler系列教程 (1) 三大PageDownloader
郭钟 发表于3年前
GuozhongCrawler系列教程 (1) 三大PageDownloader
  • 发表于 3年前
  • 阅读 129
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: GuozhongCrawler内置三大PageDownloader。分别是采用HttpClient作为内核下载的DefaultPageDownloader、采用HtmlUnitDriver作为内核下载WebDriverDownloader、采用ChromeDriver调用浏览器作为内核下载的ZhongChromeDriver。

   

GuozhongCrawler  QQ群 202568714

 

    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





共有 人打赏支持
粉丝 17
博文 12
码字总数 7550
作品 1
×
郭钟
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: