爬取微博的數據時別人用的是FM.view方法傳遞html標簽那么jsoup怎么解析呢


使用JSOUP就行 這里給出點思路

我只做了自己的首頁和其他人的微博首頁的抓取 其他的抓取沒嘗試(不好意思 比較懶...) 

 

首先是利用JSOUP進行登陸 獲取頁面 看了下微博的登陸表格 發現用了ajax的方式 所以代碼獲取cookie有點難

所以偷了個懶就用IE的開發者工具獲取到了cookie 獲取到的cookie要寫成map的形式 然后用代碼:

Java代碼   收藏代碼
  1. Response res=Jsoup.connect("http://weibo.com").cookies(map).method(Method.POST).execute();  
  2. String s=res.body();  

 得到了下發現挺多的:



 可以自己寫段腳本來打印map.put(xxx,xxx)

我這里用scala寫了段 用java寫一樣的 無所謂:

Scala代碼   收藏代碼
  1. 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進行了下簡單的處理 沒有用正則 因為....額...寫不好:

Java代碼   收藏代碼
  1.         String s=res.body();  
  2.         //System.out.println(s);  
  3.         String[] ss=s.split("<script>FM.view");  
  4.         int i=0;  
  5.         //pl_content_homeFeed  
  6. //        for(String x:ss){  
  7. //          System.out.println(i++ + "======================================");  
  8. //          System.out.println(x.substring(0, x.length()>100?100:x.length()));  
  9. //          System.out.println("===========================================");  
  10. //        }  
  11.         String content=ss[8].split("\"html\":\"")[1].replaceAll("\\\\n", "").replaceAll("\\\\t", "").replaceAll("\\\\", "");  
  12.         content=content.substring(0, content.length()<=13?content.length():content.length()-13);  
  13.         System.out.println(content);  

 輸出的content就是首頁顯示的微博內容 

不過這個輸出的話unicode沒有被轉成中文字符 需要用native2ascii工具 去網上找到了一個:

http://soulshard.iteye.com/blog/346807

實測可以使用:

Java代碼   收藏代碼
  1. System.out.println(Native2AsciiUtils.ascii2Native(content));  

 

注意了 以上的代碼 lz是固定了主頁的 所以在截取時直接用了index為8的

把post方法改成get方法 也可以獲取到其他人的微博頁 

然后給出一個打印出獲取的所有html內容的做法(試了一些主頁可行):

Java代碼   收藏代碼
  1. package jsoupTest;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import org.jsoup.Connection.Method;  
  10. import org.jsoup.Connection.Response;  
  11. import org.jsoup.Jsoup;  
  12.   
  13. public class JsoupTest {  
  14.     public static void main(String[] args) throws IOException {  
  15.         Map<String, String> map = new HashMap<>();  
  16.         //map.put請根據自己的微博cookie得到  
  17.   
  18.         Response res = Jsoup.connect("http://weibo.com/u/別人的主頁id")  
  19.                 .cookies(map).method(Method.GET).execute();  
  20.         String s = res.body();  
  21.         System.out.println(s);  
  22.         String[] ss = s.split("<script>FM.view");  
  23.         int i = 0;  
  24.         // pl_content_homeFeed  
  25.         // pl.content.homeFeed.index  
  26.         List<String> list = new ArrayList<>();  
  27.         for (String x : ss) {  
  28. //          System.out.println(i++ + "======================================");  
  29. //          System.out.println(x.substring(0,  
  30. //                  x.length() > 200 ? 200 : x.length()));  
  31. //          System.out.println("===========================================");  
  32.             if (x.contains("\"html\":\"")) {  
  33.                 String value = getHtml(x);  
  34.                 list.add(value);  
  35.                 System.out.println(value);  
  36.             }  
  37.   
  38.         }  
  39.         // content=ss[8].split("\"html\":\"")[1].replaceAll("(\\\\t|\\\\n)",  
  40.         // "").replaceAll("\\\\\"", "\"").replaceAll("\\\\/", "/");  
  41.         // content=content.substring(0,  
  42.         // content.length()<=13?content.length():content.length()-13);  
  43.         // System.out.println(Native2AsciiUtils.ascii2Native(content));  
  44.     }  
  45.   
  46.     public static String getHtml(String s) {  
  47.         String content = s.split("\"html\":\"")[1]  
  48.                 .replaceAll("(\\\\t|\\\\n|\\\\r)", "").replaceAll("\\\\\"", "\"")  
  49.                 .replaceAll("\\\\/", "/");  
  50.         content = content.substring(0,  
  51.                 content.length() <= 13 ? content.length()  
  52.                         : content.length() - 13);  
  53.         return Native2AsciiUtils.ascii2Native(content);  
  54.     }  
  55. }  

 

抓取的內容應該要適當格式化一下才可以用Jsoup做解析

不過試了下直接做解析也沒什么問題(雖然有一些標簽錯誤)

 

這只是個頁面抓取的策略 其他的我不想多寫了 大家自己實踐一下 前提是你用自己的新浪微博的cookie進行抓取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM