java1234开源博客系统
博客信息

htmlunit 爬取百度云资源

0
发布时间:『 2017-04-14 14:38』  博客类别:htmlunit  阅读(9391) 评论(0)

这里我们给出一个htmlunit实例,爬百度云;


为了更好的体现htmlunit的优势,我们先用httpclient爬下;


比如 https://pan.baidu.com/share/home?uk=305605848#category/type=0 

这个是我的百度云用户首页

QQ鎴浘20170414142708.jpg


我们现在要爬用户分享的文件 ;


我们先用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(); // 关闭流和释放系统资源
	}
}

运行结果:

QQ鎴浘20170414143038.jpg


我们得到的是这东西,没获取到数据,原因就是百度云的数据加载 是通过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(); // 关闭客户端 释放内存
		}
	}
}

运行输出:

QQ鎴浘20170414143508.jpg


Htmlunit搞数据搞出来了。。


代码用了sleep 10秒  主要是因为htmlunit执行ajax js也是需要一定的时候 具体多长时间 不定,并且htmlunit没有提供类似假如执行完ajax js后的事件或者提醒api,所以我们只能人工去判断 比如每个5秒去判断一次,尝试三次机会;


具体实现 等后面发布至尊vip 爬百度云资源 大伙可以参考下;



关键字:   htmlunit     爬百度云  
关注Java1234微信公众号
博主信息
Java1234_小锋
(知识改变命运,技术改变世界)
Powered by Java1234 V3.0 Copyright © 2012-2016 Java知识分享网 版权所有