jsoup解析html/根据关键词拿到论坛帖子信息

75 篇文章 0 订阅
以论坛《宽带山》为例,需要根据给定的关键词,取得关于该关键词的所有帖子,包括人气数,发帖主题,回复数,发表人,发表时间,帖子链接,帖子详细文本内容等。

 

            详细代码如下:

Java代码
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.jsoup.Jsoup;  
  7. import org.jsoup.nodes.Document;  
  8. import org.jsoup.nodes.Element;  
  9. import org.jsoup.select.Elements;  
  10.   
  11. public class KeyWordsSearchUtil {  
  12.   
  13.     /** 
  14.      * 根据关键词查询论坛所需信息map 
  15.      * @param KeyWord  传入关键词 
  16.      * @return 
  17.      */  
  18.     public static List<Map<String, Object>> findByKeyWord(String KeyWord) {  
  19.           
  20.         List<Map<String, Object>>postsList=new ArrayList<Map<String,Object>>();  
  21.         Map<String, Object>postsOneMap=null;  
  22.         try {  
  23.             Document doc = Jsoup.connect("http://club.pchome.net/forum_1_15____md__1_"+java.net.URLEncoder.encode(KeyWord,"utf-8")+".html")  
  24.               .data("query""Java")  
  25.               .userAgent("Mozilla")  
  26.               .cookie("auth""token")  
  27.               .timeout(10000)  
  28.               .ignoreHttpErrors(true)  
  29.               .post();  
  30.               
  31.             Elements postsLs=doc.select("li.i2").not(".h-bg");  
  32.             if (postsLs!=null&&postsLs.size()>0) {  
  33.                 for (Element childPost : postsLs) {  
  34.                     postsOneMap=new HashMap<String, Object>();  
  35.                     postsOneMap.put("postsPopularity", childPost.select("li > span.n2").first().text());  
  36.                     postsOneMap.put("postsTitle", childPost.select("span.n3 > a").attr("title"));  
  37.                     postsOneMap.put("postsFloor", childPost.select("span.n4").first().text());  
  38.                     postsOneMap.put("postsCname", childPost.select("a.bind_hover_card").first().text());  
  39.                     postsOneMap.put("postsCtime", childPost.select("li > span.n6").first().text());  
  40.                     postsOneMap.put("postsUrl""http://club.pchome.net"+childPost.select("span.n3  a").attr("href"));  
  41.                     postsOneMap.put("postsContents", getContentsByUrl("http://club.pchome.net"+childPost.select("span.n3  a").attr("href")));  
  42.                       
  43.                     postsList.add(postsOneMap);  
  44.                 }  
  45.             }  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.           
  50.         return postsList;  
  51.     }  
  52.       
  53.     /** 
  54.      * 根据帖子的url获取帖子的文本内容 
  55.      * @param url 帖子的路径 
  56.      * @return 
  57.      */  
  58.     public static String getContentsByUrl(String url) {  
  59.         String contents="11";  
  60.         try {  
  61.             Document doc = Jsoup.connect(url)  
  62.               .data("query""Java")  
  63.               .userAgent("Mozilla")  
  64.               .cookie("auth""token")  
  65.               .timeout(10000)  
  66.               .ignoreHttpErrors(true)  
  67.               .post();  
  68.               
  69.             if(doc.select("div.mc").first()!=null){  
  70.                 Element contentsEle=doc.select("div.mc div").first();  
  71.                 contents=contentsEle.select("div").first().text();  
  72.                 if (contents.contains("[向左转]  [向右转]  [原图]")) {  
  73.                     contents=contents.replace("[向左转]  [向右转]  [原图]""");  
  74.                 }  
  75.             }  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.         return contents;  
  80.     }  
  81.       
  82.     public static void main(String[] args) throws Exception {  
  83.         List<Map<String, Object>>postsList=KeyWordsSearchUtil.findByKeyWord("电影");  
  84.         System.out.println("http://club.pchome.net/forum_1_15____md__1_"+java.net.URLEncoder.encode("电影","utf-8")+".html");  
  85.         System.out.println(postsList.size()+"/");  
  86.         for (int i = 0; i < postsList.size(); i++) {  
  87.             for(Map.Entry<String, Object>entry:postsList.get(i).entrySet()){  
  88.                 System.out.println("key="+entry.getKey()+"| value="+entry.getValue());  
  89.             }  
  90.             System.out.println("-----------------");  
  91.         }  
  92.         //http://club.pchome.net/thread_1_15_7519679.html  
  93. //      String str=getContentsByUrl("http://club.pchome.net/thread_1_15_7519679.html");  
  94. //      System.out.println(str);  
  95.     }  
  96. }  

                      

                            以上代码能成功抓取宽带山论坛中,关键词为:电影 的相关帖子列表,main方法中已有测试,网络畅通下可测试通过。但上面代码仅为完成功能,性能较差,项目中需重写或优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值