获取新浪微博滚动加载内容
2014-12-05 09:27
155 查看
实现思路吧:
1.请求微博内容页面。
2.模拟发起第一次滚动请求,提取里面的html部分内容
3.模拟发起第二次滚动请求,提取里面html部分内容,以及分页bar
4.根据分页bar,抓取分页内容,每次抓取分页内容都是重复1-3的步骤
前段时间写了一些关于抓取新浪微博的经历,现在就贴一些我遇到过一些问题的代码实现思路吧:(我使用的是 htmlunit 爬虫)
每个人的博客主页中都有微博内容块,每次点击查看微博内容的时候你会发现,微博内容不是一次加载的;这个问题不管是新浪还是腾讯,它们的内容加载方式都是一样的。
废话不多说,直接将代码实现:
1. 请求微博内容url,获取请求返回的数据,由于返回的微博内容时嵌入在js中,但是js中的微博内容是有规律的;所以我就截取js中包含微博内容的html标签内容。
然后解析html标签字符串,通过xpath方式获取想要的内容。
//微博首页
HtmlPage page = client.getPage(weiboUrl);
/*
* 提取js中的微博内容:
* 1. 使用htmlunit提供的xpath方法获取;缺点速度太慢,而且不稳定
* 2. 提取js中的html字符串,解析html内容;缺点提取html字符串准确度不高
*/
String responseContent = page.getWebResponse().getContentAsString();
String weiboContent = MyStringUtils.takeSomeJs2Html(responseContent, jsWeiboContent, jsHtmlMark);
HtmlCleaner cleaner = new HtmlCleaner();
TagNode contentNode = cleaner.clean(weiboContent);
Object[] nodes = contentNode.evaluateXPath("//div[@class='WB_text']");
2. 模拟第一次滚动请求加载数据,请求成功返回的是json数据,所以需要使用json方式提取其中的包含html标签内容的字符串内容。然后解析字符串,获取想要的内容。
//模拟第一次滚动请求
String rollingUrlOne = UrlFactory.createRollingOneAddContentUrl(domainId, 1, pageId);
WebRequest requestOne = new WebRequest(new URL(rollingUrlOne), HttpMethod.GET);
WebResponse jsonOne = client.loadWebResponse(requestOne);
JSONObject jsonObj = JSONObject.fromObject(jsonOne.getContentAsString());
String data = (String)jsonObj.get("data");
Document docOne = Jsoup.parse(data);
Elements elementsOne = docOne.select("div.WB_text");
滚动请求url:
//微博内容第一次滚动加载请求url
public static String createRollingOneAddContentUrl(String domainId,int pageNum,String userId){
return "http://weibo.com/p/aj/mblog/mbloglist?domain="+domainId+"&pre_page="+pageNum+"&page="+pageNum+"&pagebar=0&id="+userId;
}
//微博内容第二次滚动加载请求url
public static String createRollingTwoAddContentUrl(String domainId,int pageNum,String userId){
return "http://weibo.com/p/aj/mblog/mbloglist?domain="+domainId+"&pre_page="+pageNum+"&page="+pageNum+"&pagebar=1&id="+userId+"&script_uri=/p/"+userId+"/weibo";
}
3.模拟第二次滚动请求加载数据,实现原理如上。
//模拟第二次滚动请求
String rollingUrlTwo = UrlFactory.createRollingTwoAddContentUrl(domainId, 1, pageId);
WebRequest requestTwo = new WebRequest(new URL(rollingUrlTwo), HttpMethod.GET);
WebResponse jsonTwo = client.loadWebResponse(requestTwo);
JSONObject jsonObj2 = JSONObject.fromObject(jsonTwo.getContentAsString());
String data2 = (String)jsonObj2.get("data");
Document docTwo = Jsoup.parse(data2);
Elements elementsTwo = docTwo.select("div.WB_text");
4.获取分页列表,重复上面的操作过程即可。
//取分页列表
Elements elementsPage = docTwo.select("div.W_pages > span.list > div > a");
if(elementsPage!=null){
//去掉分页列表中的最后一条,最后一条为第一页
for(int i=elementsPage.size()-2;i>=0;i--){
Element element = elementsPage.get(i);
String pageHref = element.attr("href");
loadPageData(client,pageHref,elementsPage.size()-i,domainId,pageId);
// if(i>=50){
// System.out.println("微博内容太多,只取了前50页的微博内容。。。");
// break;
// }
}
}
1.请求微博内容页面。
2.模拟发起第一次滚动请求,提取里面的html部分内容
3.模拟发起第二次滚动请求,提取里面html部分内容,以及分页bar
4.根据分页bar,抓取分页内容,每次抓取分页内容都是重复1-3的步骤
前段时间写了一些关于抓取新浪微博的经历,现在就贴一些我遇到过一些问题的代码实现思路吧:(我使用的是 htmlunit 爬虫)
每个人的博客主页中都有微博内容块,每次点击查看微博内容的时候你会发现,微博内容不是一次加载的;这个问题不管是新浪还是腾讯,它们的内容加载方式都是一样的。
废话不多说,直接将代码实现:
1. 请求微博内容url,获取请求返回的数据,由于返回的微博内容时嵌入在js中,但是js中的微博内容是有规律的;所以我就截取js中包含微博内容的html标签内容。
然后解析html标签字符串,通过xpath方式获取想要的内容。
//微博首页
HtmlPage page = client.getPage(weiboUrl);
/*
* 提取js中的微博内容:
* 1. 使用htmlunit提供的xpath方法获取;缺点速度太慢,而且不稳定
* 2. 提取js中的html字符串,解析html内容;缺点提取html字符串准确度不高
*/
String responseContent = page.getWebResponse().getContentAsString();
String weiboContent = MyStringUtils.takeSomeJs2Html(responseContent, jsWeiboContent, jsHtmlMark);
HtmlCleaner cleaner = new HtmlCleaner();
TagNode contentNode = cleaner.clean(weiboContent);
Object[] nodes = contentNode.evaluateXPath("//div[@class='WB_text']");
2. 模拟第一次滚动请求加载数据,请求成功返回的是json数据,所以需要使用json方式提取其中的包含html标签内容的字符串内容。然后解析字符串,获取想要的内容。
//模拟第一次滚动请求
String rollingUrlOne = UrlFactory.createRollingOneAddContentUrl(domainId, 1, pageId);
WebRequest requestOne = new WebRequest(new URL(rollingUrlOne), HttpMethod.GET);
WebResponse jsonOne = client.loadWebResponse(requestOne);
JSONObject jsonObj = JSONObject.fromObject(jsonOne.getContentAsString());
String data = (String)jsonObj.get("data");
Document docOne = Jsoup.parse(data);
Elements elementsOne = docOne.select("div.WB_text");
滚动请求url:
//微博内容第一次滚动加载请求url
public static String createRollingOneAddContentUrl(String domainId,int pageNum,String userId){
return "http://weibo.com/p/aj/mblog/mbloglist?domain="+domainId+"&pre_page="+pageNum+"&page="+pageNum+"&pagebar=0&id="+userId;
}
//微博内容第二次滚动加载请求url
public static String createRollingTwoAddContentUrl(String domainId,int pageNum,String userId){
return "http://weibo.com/p/aj/mblog/mbloglist?domain="+domainId+"&pre_page="+pageNum+"&page="+pageNum+"&pagebar=1&id="+userId+"&script_uri=/p/"+userId+"/weibo";
}
3.模拟第二次滚动请求加载数据,实现原理如上。
//模拟第二次滚动请求
String rollingUrlTwo = UrlFactory.createRollingTwoAddContentUrl(domainId, 1, pageId);
WebRequest requestTwo = new WebRequest(new URL(rollingUrlTwo), HttpMethod.GET);
WebResponse jsonTwo = client.loadWebResponse(requestTwo);
JSONObject jsonObj2 = JSONObject.fromObject(jsonTwo.getContentAsString());
String data2 = (String)jsonObj2.get("data");
Document docTwo = Jsoup.parse(data2);
Elements elementsTwo = docTwo.select("div.WB_text");
4.获取分页列表,重复上面的操作过程即可。
//取分页列表
Elements elementsPage = docTwo.select("div.W_pages > span.list > div > a");
if(elementsPage!=null){
//去掉分页列表中的最后一条,最后一条为第一页
for(int i=elementsPage.size()-2;i>=0;i--){
Element element = elementsPage.get(i);
String pageHref = element.attr("href");
loadPageData(client,pageHref,elementsPage.size()-i,domainId,pageId);
// if(i>=50){
// System.out.println("微博内容太多,只取了前50页的微博内容。。。");
// break;
// }
}
}
相关文章推荐
- 获取新浪微博滚动加载内容
- 基于jquery模仿新浪微博的无狭缝滚动2(内容动态加载)
- Js仿新浪微博首页内容滚动
- JQuery实现页面随滚动条滚动而动态加载内容的效果
- 获取WebView加载HTML时网页中的内容
- 获取WebView加载HTML时网页中的内容
- div嵌套页面 div加载页面 (其中获取目标页面的内容是用dwr框架连接java程序做的)
- Android中通过Java获取Webview加载内容
- 【转】JQuery实现页面随滚动条滚动而动态加载内容的效果
- JQuery实现页面随滚动条滚动而动态加载内容的效果
- JQuery实现页面随滚动条滚动而动态加载内容的效果
- 小模块:内容循环滚动(仿新浪微博未登录首页滚动微博显示)
- jQuery向下滚动即时加载内容实现的瀑布流效果
- 新浪微博APP开发应用示例之获取指定微博账户的微博内容记录
- 2011-01-16 21:13 JQuery实现页面随滚动条滚动而动态加载内容的效果
- Js仿新浪微博首页内容滚动
- MVC 3.0 滚动滚动条加载内容
- 页面随滚动条滚动而动态加载内容的效果
- jquery实现页面滚动到最下方自动按分页的形式加载内容效果
- 滚动到页面底部继续加载页面其他内容