新浪微博内容采取什么方式加载的

JavaScript067

新浪微博内容采取什么方式加载的,第1张

前段时间写了一些关于抓取新浪微博的经历,现在就贴一些我遇到过一些问题的代码实现思路吧:(我使用的是 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()-2i>=0i--){

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、然后进入微博关注界面,点击该界面上的“批量管理”按钮。

3、进入批量管理后,可以看到已经关注点击的用户右上角的“勾选”按钮。

4、然后单击这些关注者并选择对此页面不感兴趣的用户。选择后,单击“取消关注”按钮。

5、然后单击提示页上的“确定”按钮,批量取消下列用户。