使用JSOUP就行 這里給出點思路
我只做了自己的首頁和其他人的微博首頁的抓取 其他的抓取沒嘗試(不好意思 比較懶...)
首先是利用JSOUP進行登陸 獲取頁面 看了下微博的登陸表格 發現用了ajax的方式 所以代碼獲取cookie有點難
所以偷了個懶就用IE的開發者工具獲取到了cookie 獲取到的cookie要寫成map的形式 然后用代碼:
- Response res=Jsoup.connect("http://weibo.com").cookies(map).method(Method.POST).execute();
- String s=res.body();
得到了下發現挺多的:
可以自己寫段腳本來打印map.put(xxx,xxx)
我這里用scala寫了段 用java寫一樣的 無所謂:
- s.split("; ").foreach(s => {val x=s.split("=");println(s"""map.put("${x(0)}","${x(1)}");""")});
最后得到的body 嗯......是一大堆的script標簽 最上面是微博的固定的頂上那一欄的內容(導航條的內容)
lz嘗試了下 發現需要的是 <script>FM.view 中一個id為pl_content_homeFeed的 他就是首頁的內容
然后lz進行了下簡單的處理 沒有用正則 因為....額...寫不好:
- String s=res.body();
- //System.out.println(s);
- String[] ss=s.split("<script>FM.view");
- int i=0;
- //pl_content_homeFeed
- // for(String x:ss){
- // System.out.println(i++ + "======================================");
- // System.out.println(x.substring(0, x.length()>100?100:x.length()));
- // System.out.println("===========================================");
- // }
- String content=ss[8].split("\"html\":\"")[1].replaceAll("\\\\n", "").replaceAll("\\\\t", "").replaceAll("\\\\", "");
- content=content.substring(0, content.length()<=13?content.length():content.length()-13);
- System.out.println(content);
輸出的content就是首頁顯示的微博內容
不過這個輸出的話unicode沒有被轉成中文字符 需要用native2ascii工具 去網上找到了一個:
http://soulshard.iteye.com/blog/346807
實測可以使用:
- System.out.println(Native2AsciiUtils.ascii2Native(content));
注意了 以上的代碼 lz是固定了主頁的 所以在截取時直接用了index為8的
把post方法改成get方法 也可以獲取到其他人的微博頁
然后給出一個打印出獲取的所有html內容的做法(試了一些主頁可行):
- package jsoupTest;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.jsoup.Connection.Method;
- import org.jsoup.Connection.Response;
- import org.jsoup.Jsoup;
- public class JsoupTest {
- public static void main(String[] args) throws IOException {
- Map<String, String> map = new HashMap<>();
- //map.put請根據自己的微博cookie得到
- Response res = Jsoup.connect("http://weibo.com/u/別人的主頁id")
- .cookies(map).method(Method.GET).execute();
- String s = res.body();
- System.out.println(s);
- String[] ss = s.split("<script>FM.view");
- int i = 0;
- // pl_content_homeFeed
- // pl.content.homeFeed.index
- List<String> list = new ArrayList<>();
- for (String x : ss) {
- // System.out.println(i++ + "======================================");
- // System.out.println(x.substring(0,
- // x.length() > 200 ? 200 : x.length()));
- // System.out.println("===========================================");
- if (x.contains("\"html\":\"")) {
- String value = getHtml(x);
- list.add(value);
- System.out.println(value);
- }
- }
- // content=ss[8].split("\"html\":\"")[1].replaceAll("(\\\\t|\\\\n)",
- // "").replaceAll("\\\\\"", "\"").replaceAll("\\\\/", "/");
- // content=content.substring(0,
- // content.length()<=13?content.length():content.length()-13);
- // System.out.println(Native2AsciiUtils.ascii2Native(content));
- }
- public static String getHtml(String s) {
- String content = s.split("\"html\":\"")[1]
- .replaceAll("(\\\\t|\\\\n|\\\\r)", "").replaceAll("\\\\\"", "\"")
- .replaceAll("\\\\/", "/");
- content = content.substring(0,
- content.length() <= 13 ? content.length()
- : content.length() - 13);
- return Native2AsciiUtils.ascii2Native(content);
- }
- }
抓取的內容應該要適當格式化一下才可以用Jsoup做解析
不過試了下直接做解析也沒什么問題(雖然有一些標簽錯誤)
這只是個頁面抓取的策略 其他的我不想多寫了 大家自己實踐一下 前提是你用自己的新浪微博的cookie進行抓取