zoukankan      html  css  js  c++  java
  • 爬取微博的数据时别人用的是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进行抓取

  • 相关阅读:
    常量,基本运算符,if判断,while循环
    python解释器的垃圾回收机制,小整数池,变量的三个特性,is与==,与用户交互,数据类型的基本使用,基本运算符
    编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互
    编程简介
    bootstrap 无限极菜单
    JQuery lhgdialog使用
    mysql 不是主键不能删除的保护问题解决办法?
    遍历所有的选中的radio的个数和值
    MySQL 的 RowNum 实现
    Ibatis 测试出SQL
  • 原文地址:https://www.cnblogs.com/qianzf/p/7749660.html
Copyright © 2011-2022 走看看