这里我们给出一个htmlunit实例,爬百度云;
为了更好的体现htmlunit的优势,我们先用httpclient爬下;
比如 https://pan.baidu.com/share/home?uk=305605848#category/type=0
这个是我的百度云用户首页
我们现在要爬用户分享的文件 ;
我们先用httpclient:
代码如下:
package com.open1111; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class BlogCrawler { public static void main(String[] args) throws ClientProtocolException, IOException { CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建httpclient实例 HttpGet httpget = new HttpGet("https://pan.baidu.com/share/home?uk=305605848#category/type=0"); // 创建httpget实例 httpget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); // 设置请求头消息User-Agent CloseableHttpResponse response = httpclient.execute(httpget); // 执行get请求 HttpEntity entity=response.getEntity(); // 获取返回实体 System.out.println("网页内容:"+EntityUtils.toString(entity, "utf-8")); // 指定编码打印网页内容 response.close(); // 关闭流和释放系统资源 } }
运行结果:
我们得到的是这东西,没获取到数据,原因就是百度云的数据加载 是通过ajax加载以及js渲染上去的,所以用httpclient搞不定;
这时候,我们用htmlunit搞下:
package com.open1111; import java.io.IOException; import java.net.MalformedURLException; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnitTest7 { public static void main(String[] args){ WebClient webClient=new WebClient(BrowserVersion.FIREFOX_52); HtmlPage page; try { page = webClient.getPage("https://pan.baidu.com/share/home?uk=305605848#category/type=0"); Thread.sleep(10000); // 休息10秒钟 等待htmlunit执行js System.out.println(page.asXml()); } catch (FailingHttpStatusCodeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ webClient.close(); // 关闭客户端 释放内存 } } }
运行输出:
Htmlunit搞数据搞出来了。。
代码用了sleep 10秒 主要是因为htmlunit执行ajax js也是需要一定的时候 具体多长时间 不定,并且htmlunit没有提供类似假如执行完ajax js后的事件或者提醒api,所以我们只能人工去判断 比如每个5秒去判断一次,尝试三次机会;
具体实现 等后面发布至尊vip 爬百度云资源 大伙可以参考下;
下一篇:Junit空指针问题