分享

基于lucene的案例开发19:纵横小说简介页采集

本帖最后由 nettman 于 2015-4-16 22:35 编辑

问题导读:
1、如何采集简介页内容?
2、采集时,如何获取标签和字数字段?
3、如何对获取的html代码做进一步处理?




接上篇:基于lucene的案例开发18:纵横小说更新列表页抓取

在上一篇博客中,我们已经对纵横中文小说的更新列表页做了简单的采集,获得了小说简介页的URL,因此这篇博客我们就介绍纵横中文小说简介页信息的采集,事例地址:http://book.zongheng.com/book/362857.html

页面分析
      在开始之前,建议个人先看一下简介页的样子,下图只是我们要采集的信息所在的区域。

20150403095718281.jpg

      在这一部分,我们需要获取书名、作者名、分类、字数、简介、最新章节名、章节页URL和标签等信息。在页面上,我们通过鼠标右键--查看网页源代码 发现下面一个现象
20150403100535326.jpg
      纵横小说为了做360的seo,把小说的一些关键信息放到head中,这样就大大减少我们下正则的复杂度,由于这几个正则大同小异,所以就只用书名做简单的介绍,其余的正则可以参照后面的源代码。 这里的书名在上述截图中的33行,我们需要提取中间的 飞仙诀 信息,因此我们提取该信息的正则表达式为” <meta name="og:novel:book_name" content="(.*?)"/> “ ,其他信息和此正则类似。通过上图这部分源代码我们可以轻易的获取书名、作者名、最新章节、简介、分类和章节列表页URL,对于标签和字数这两个字段,我们就需要继续分析下面的源代码。通过简单的查找,我们可以找到下图中的源代码,这里就包含我们需要的字数和标签两个属性。
20150403101608562.jpg
      对于字数这个属性,我们可以通过简单的正则表达式 ” <span itemprop="wordCount">(\d*?)</span> “ 获取,而对于标签这个属性,我们需要通过两步才能得到想要的内容。
第一步:获取keyword所在的html代码,也就是上图中的234行,这一步的正则表达式为 ” <div class="keyword">(.*?)</div> “;
第二步:对第一步获得的部分html做进一步提取,获取想要的内容,这一步的正则表达式为 ” <a.*?>(.*?)</a> “。

代码实现
      对于非更新列表页的网页信息采集,我们统一继承CrawlBase类,对于如何伪装可以参照上一篇博客,这里就重点介绍DoRegex类中的两个方法
方法一:
  1.     String getFirstString(String dealStr, String regexStr, int n)  
复制代码
     这里的第一个参数是要处理的字符串,这里也就是网页源代码,第二个参数是要查找内容的正则表达式,第三个参数是要提取的内容在正则表达式中的位置,函数的功能是从指定的字符串中查找与正则第一个匹配的内容,返回指定的提取信息。方法二:
  1.     String getString(String dealStr, String regexStr, String splitStr, int n)  
复制代码
     这里的第1、2、4参数分别对应方法一中的第1、2、3参数,参数splitStr的意义是分隔符,函数的功能是在指定的字符串中查找与正则表达式匹配的内容,之间用指定的分隔符隔开。
运行结果
20150403103817843.jpg

源代码
      通过对上面两个方法的介绍,相信对于下面的源代码也会很简单。

  1.      /**   
  2.      *@Description:  简介页
  3.      */   
  4.     package com.lulei.crawl.novel.zongheng;   
  5.       
  6.     import java.io.IOException;  
  7.     import java.util.HashMap;  
  8.       
  9.     import com.lulei.crawl.CrawlBase;  
  10.     import com.lulei.util.DoRegex;  
  11.     import com.lulei.util.ParseUtil;  
  12.         
  13.     public class IntroPage extends CrawlBase {  
  14.         private static final String NAME = "<meta name="og:novel:book_name" content="(.*?)"/> ";  
  15.         private static final String AUTHOR = "<meta name="og:novel:author" content="(.*?)"/> ";  
  16.         private static final String DESC = "<meta property="og:description" content="(.*?)"/> ";  
  17.         private static final String TYPE = "<meta name="og:novel:category" content="(.*?)"/> ";  
  18.         private static final String LATESTCHAPTER = "<meta name="og:novel:latest_chapter_name" content="(.*?)"/> ";  
  19.         private static final String CHAPTERLISTURL = "<meta name="og:novel:read_url" content="(.*?)"/> ";  
  20.         private static final String WORDCOUNT = "<span itemprop="wordCount">(\\d*?)</span>";  
  21.         private static final String KEYWORDS = "<div class="keyword">(.*?)</div>";  
  22.         private static final String KEYWORD = "<a.*?>(.*?)</a>";  
  23.         private String pageUrl;  
  24.          
  25.         private static HashMap<String, String> params;  
  26.         /**
  27.          * 添加相关头信息,对请求进行伪装
  28.          */  
  29.         static {  
  30.             params = new HashMap<String, String>();  
  31.             params.put("Referer", "http://book.zongheng.com");  
  32.             params.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36");  
  33.         }  
  34.          
  35.         public IntroPage(String url) throws IOException {  
  36.             readPageByGet(url, "utf-8", params);  
  37.             this.pageUrl = url;  
  38.         }  
  39.          
  40.         /**
  41.          * @return
  42.          * @Author:lulei   
  43.          * @Description: 获取书名
  44.          */  
  45.         private String getName() {  
  46.             return DoRegex.getFirstString(getPageSourceCode(), NAME, 1);  
  47.         }  
  48.          
  49.         /**
  50.          * @return
  51.          * @Author:lulei   
  52.          * @Description: 获取作者名
  53.          */  
  54.         private String getAuthor() {  
  55.             return DoRegex.getFirstString(getPageSourceCode(), AUTHOR, 1);  
  56.         }  
  57.          
  58.         /**
  59.          * @return
  60.          * @Author:lulei   
  61.          * @Description: 书籍简介
  62.          */  
  63.         private String getDesc() {  
  64.             return DoRegex.getFirstString(getPageSourceCode(), DESC, 1);  
  65.         }  
  66.          
  67.         /**
  68.          * @return
  69.          * @Author:lulei   
  70.          * @Description: 书籍分类
  71.          */  
  72.         private String getType() {  
  73.             return DoRegex.getFirstString(getPageSourceCode(), TYPE, 1);  
  74.         }  
  75.          
  76.         /**
  77.          * @return
  78.          * @Author:lulei   
  79.          * @Description: 最新章节
  80.          */  
  81.         private String getLatestChapter() {  
  82.             return DoRegex.getFirstString(getPageSourceCode(), LATESTCHAPTER, 1);  
  83.         }  
  84.          
  85.         /**
  86.          * @return
  87.          * @Author:lulei   
  88.          * @Description: 章节列表页Url
  89.          */  
  90.         private String getChapterListUrl() {  
  91.             return DoRegex.getFirstString(getPageSourceCode(), CHAPTERLISTURL, 1);  
  92.         }  
  93.          
  94.         /**
  95.          * @return
  96.          * @Author:lulei   
  97.          * @Description: 字数
  98.          */  
  99.         private int getWordCount() {  
  100.             String wordCount = DoRegex.getFirstString(getPageSourceCode(), WORDCOUNT, 1);  
  101.             return ParseUtil.parseStringToInt(wordCount, 0);  
  102.         }  
  103.          
  104.         /**
  105.          * @return
  106.          * @Author:lulei   
  107.          * @Description: 标签
  108.          */  
  109.         private String keyWords() {  
  110.             String keyHtml = DoRegex.getFirstString(getPageSourceCode(), KEYWORDS, 1);  
  111.             return DoRegex.getString(keyHtml, KEYWORD, " ", 1);  
  112.         }  
  113.       
  114.         public static void main(String[] args) throws IOException {  
  115.             // TODO Auto-generated method stub   
  116.             IntroPage intro = new IntroPage("http://book.zongheng.com/book/362857.html");  
  117.             System.out.println(intro.pageUrl);  
  118.             System.out.println(intro.getName());  
  119.             System.out.println(intro.getAuthor());  
  120.             System.out.println(intro.getDesc());  
  121.             System.out.println(intro.getType());  
  122.             System.out.println(intro.getLatestChapter());  
  123.             System.out.println(intro.getChapterListUrl());  
  124.             System.out.println(intro.getWordCount());  
  125.             System.out.println(intro.keyWords());  
  126.         }  
  127.       
  128.     }  
复制代码



相关内容:
基于lucene的案例开发1:lucene初始认知

基于lucene的案例开发2:索引数学模型

基于lucene的案例开发3:索引文件结构

基于lucene的案例开发4:创建索引

基于lucene的案例开发5:搜索索引

基于lucene的案例开发6:分词器介绍

基于lucene的案例开发7:Query查询

基于lucene的案例开发8:IndexSearcher中检索方法

基于lucene的案例开发9:案例初识

基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍

基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍

基于lucene的案例开发12:数据库连接池

基于lucene的案例开发13:实现实时索引基本原理

基于lucene的案例开发14:实时索引管理类IndexManager

基于lucene的案例开发15:实时索引的检索

基于lucene的案例开发16:实时索引的修改

基于lucene的案例开发17:查询语句创建PackQuery

基于lucene的案例开发18:纵横小说更新列表页抓取

基于lucene的案例开发19:纵横小说简介页采集

基于lucene的案例开发20:纵横小说章节列表采集

基于lucene的案例开发21:纵横小说阅读页采集


资料来源:http://blog.csdn.net/xiaojimanman/article/details/44851419


欢迎加入about云群371358502、39327136,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(1)人评论

跳转到指定楼层
LeucotheaShi 发表于 2015-4-15 14:29:21
赞~谢谢楼主分享~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条