本人最近在研究爬蟲。作為一個新手。研究了些爬蟲框架,發現所有開源的爬蟲框架很多,功能也很齊全,但唯獨遺憾的是,目前還沒有發現那個爬蟲對js完美的解釋並執行。看了淺談網絡爬蟲爬js動態加載網頁(二)之后很有感慨,首先對博主的鑽研精神季度敬佩。雖然該文中第二和第三種方案不怎么靠譜,但能想到這些方案,說明博主的思維發散性很強,不會局限於單方向鑽牛角尖式的思考。不過很遺憾,因為我就是這樣的人。我始終覺得博主對於HtmlUnit的了解不夠深入(也可能是我的誤解)。於是就開始鑽牛角尖了。看了HtmlUnit的簡介之后,我有一種預感,認為HtmlUnit沒理由不能支持Js的自動解釋於執行,事實證明了我的想法。 廢話多說無益,
這里拿地址【http://cq.qq.com/baoliao/detail.htm?294064】來測試,通過查看該頁面源碼,可以發現,該頁面文章標題,內容,瀏覽量都是采用占位符的形式,在頁面加載時,通過js替換之,下面代碼獲取該文章瀏覽量字段。
public void testCrawler() throws Exception { /**HtmlUnit請求web頁面*/ WebClient wc = new WebClient(); wc.getOptions().setJavaScriptEnabled(true); //啟用JS解釋器,默認為true wc.getOptions().setCssEnabled(false); //禁用css支持 wc.getOptions().setThrowExceptionOnScriptError(false); //js運行錯誤時,是否拋出異常 wc.getOptions().setTimeout(10000); //設置連接超時時間 ,這里是10S。如果為0,則無限期等待 HtmlPage page = wc.getPage("http://cq.qq.com/baoliao/detail.htm?294064"); String pageXml = page.asXml(); //以xml的形式獲取響應文本 /**jsoup解析文檔*/ Document doc = Jsoup.parse(pageXml, "http://cq.qq.com"); Element pv = doc.select("#feed_content span").get(1); System.out.println(pv.text()); Assert.assertTrue(pv.text().contains("瀏覽")); System.out.println("Thank God!"); }
附上maven配置:
<dependency> <!-- jsoup HTML parser library @ http://jsoup.org/ --> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.13</version> </dependency>
更多信息請查看個人博客:http://www.iamcoder.net