网页爬虫抓取js动态渲染数据

经过排查,我终于知道了原因,原因是网站优化了代码,以前是将查询结果生成静态页面。现在改成使用ajax动态获取数据然后再使用javascript进行网页渲染。于是,excel这头蠢驴拿到的是查询前的空数据、、、

说到这里,可能有些人马上就会想到,看下浏览器调试器的network视图,然后也发同样的http请求不就好了。

遗憾的是,这个网站也不是省油的灯。它在服务端作了安全限制,只有网页自己发出的请求才能通过安全验证。

这下,心好累,一点思路都没有。

突然,我想到一个傻b的思路,直接等浏览器渲染后页面后,来个另存为,显然也能工作。

但程序员天生是很懒的,我可不允许做这种事。

凭着第七感,我知道需要能够模拟浏览器自己执行脚本发请求再渲染。问了一下有爬虫工作经验的大学同学。同学说,要分析请求的参数和cookie等等,还说每一个网页都要单独处理。这明显不科学啊。还说如果要通用的话,可以用phantomJS、或者Selenium之类的东西。原谅我听都没听过。

最后,我决定用java的方法。说实在的,java的世界真的很强大,只要你想得到,肯定有大牛已经帮你实现了。

于是,我发现了一个神器——htmlunit

说白了,这个框架就是一个没有界面的浏览器。可以模拟浏览器的各种行为,拿到页面元素,模拟点击事件等等。

种种牛逼功能还得自己慢慢发掘,其官网地址为(htmlunit官网

推荐使用maven下载相关依赖,否则要手工下载一堆jar包。maven这东西,用过的人都说它好。哈哈~~

代码比较简单,直接看就可以了,需要注意的是,由于浏览器查询需要时间,在查询的过程中,应该让主线程休眠一段时间,才能保证htmlunit浏览器已经查询完毕。

[java]  view plain  copy
  1. import java.util.concurrent.TimeUnit;  
  2.   
  3. import com.gargoylesoftware.htmlunit.BrowserVersion;  
  4. import com.gargoylesoftware.htmlunit.WebClient;  
  5. import com.gargoylesoftware.htmlunit.html.DomNodeList;  
  6. import com.gargoylesoftware.htmlunit.html.HtmlElement;  
  7. import com.gargoylesoftware.htmlunit.html.HtmlPage;  
  8. import com.gargoylesoftware.htmlunit.html.HtmlTable;  
  9. import com.gargoylesoftware.htmlunit.html.HtmlTableBody;  
  10.   
  11. public class Entrance {  
  12.   
  13.     public static void main (String[] args ) throws Exception   
  14.     {  
  15.         String webUrl = "http://www.xy2046.com/xypk10.aspx?T=234&day=2016-05-29";  
  16.         HtmlPage page = getHtmlPage(webUrl);  
  17.         final HtmlTable div = (HtmlTable) page.getElementById("mytable");  
  18.         HtmlTableBody tbody = (HtmlTableBody) div.getBodies().get(0);  
  19.         printTable(tbody);  
  20.         System.err.println("查询数据成功");  
  21.     }  
  22.   
  23.     private static HtmlPage getHtmlPage(String url) throws Exception{  
  24.         final WebClient webClient=new WebClient(BrowserVersion.CHROME);  
  25.         webClient.getOptions().setCssEnabled(false);  
  26.         webClient.getOptions().setMaxInMemory(500);  
  27.         final HtmlPage page = webClient.getPage(url);  
  28.         System.err.println("查询中,请稍候");  
  29.         TimeUnit.SECONDS.sleep(5);  //web请求数据需要时间,必须让主线程休眠片刻  
  30.         webClient.close();  
  31.           
  32.         return page;  
  33.     }  
  34.       
  35.     private static void printTable(HtmlTableBody tbody) throws Exception{  
  36.         DomNodeList trs = tbody.getElementsByTagName("tr");  
  37.         for(int i=0;i
  38.             HtmlElement node = trs.get(i);  
  39.             DomNodeList tds = node.getElementsByTagName("td");  
  40.             for(int j=0;j
  41.                 HtmlElement td = tds.get(j);  
  42.                 System.err.print(td.asText()+"\t");  
  43.             }  
  44.             System.err.println();  
  45.         }  
  46.     }  
  47. }  
代码运行结果如下:

网页爬虫抓取js动态渲染数据_第1张图片

你可能感兴趣的:(爬虫)