转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44851419

http://www.llwjy.com/blogdetail/1b5ae17c513d127838c2e02102b5bb87.html

个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~
-------------------------------------------------------------------------------------------------

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

页面分析

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

在这一部分,我们需要获取书名、作者名、分类、字数、简介、最新章节名、章节页URL和标签等信息。在页面上,我们通过鼠标右键--查看网页源代码 发现下面一个现象

纵横小说为了做360的seo,把小说的一些关键信息放到head中,这样就大大减少我们下正则的复杂度,由于这几个正则大同小异,所以就只用书名做简单的介绍,其余的正则可以参照后面的源代码。 这里的书名在上述截图中的33行,我们需要提取中间的 飞仙诀 信息,因此我们提取该信息的正则表达式为” <meta name="og:novel:book_name" content="(.*?)"/> “ ,其他信息和此正则类似。通过上图这部分源代码我们可以轻易的获取书名、作者名、最新章节、简介、分类和章节列表页URL,对于标签和字数这两个字段,我们就需要继续分析下面的源代码。通过简单的查找,我们可以找到下图中的源代码,这里就包含我们需要的字数和标签两个属性。

对于字数这个属性,我们可以通过简单的正则表达式 ” <span itemprop="wordCount">(\d*?)</span> “ 获取,而对于标签这个属性,我们需要通过两步才能得到想要的内容。

第一步:获取keyword所在的html代码,也就是上图中的234行,这一步的正则表达式为 ” <div class="keyword">(.*?)</div> “;

第二步:对第一步获得的部分html做进一步提取,获取想要的内容,这一步的正则表达式为 ” <a.*?>(.*?)</a> “。

代码实现

对于非更新列表也的网页信息采集,我们统一继承CrawlBase类,对于如何伪装可以参照上一篇博客,这里就重点介绍DoRegex类中的两个方法

方法一:

String getFirstString(String dealStr, String regexStr, int n)

这里的第一个参数是要处理的字符串,这里也就是网页源代码,第二个参数是要查找内容的正则表达式,第三个参数是要提取的内容在正则表达式中的位置,函数的功能是从指定的字符串中查找与正则第一个匹配的内容,返回指定的提取信息。

方法二:

String getString(String dealStr, String regexStr, String splitStr, int n)

这里的第1、2、4参数分别对应方法一中的第1、2、3参数,参数splitStr的意义是分隔符,函数的功能是在指定的字符串中查找与正则表达式匹配的内容,之间用指定的分隔符隔开。

运行结果

源代码

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

 /**  *@Description:  简介页*/
package com.lulei.crawl.novel.zongheng;  import java.io.IOException;
import java.util.HashMap;import com.lulei.crawl.CrawlBase;
import com.lulei.util.DoRegex;
import com.lulei.util.ParseUtil;public class IntroPage extends CrawlBase {private static final String NAME = "<meta name=\"og:novel:book_name\" content=\"(.*?)\"/> ";private static final String AUTHOR = "<meta name=\"og:novel:author\" content=\"(.*?)\"/> ";private static final String DESC = "<meta property=\"og:description\" content=\"(.*?)\"/> ";private static final String TYPE = "<meta name=\"og:novel:category\" content=\"(.*?)\"/> ";private static final String LATESTCHAPTER = "<meta name=\"og:novel:latest_chapter_name\" content=\"(.*?)\"/> ";private static final String CHAPTERLISTURL = "<meta name=\"og:novel:read_url\" content=\"(.*?)\"/> ";private static final String WORDCOUNT = "<span itemprop=\"wordCount\">(\\d*?)</span>";private static final String KEYWORDS = "<div class=\"keyword\">(.*?)</div>";private static final String KEYWORD = "<a.*?>(.*?)</a>";private String pageUrl;private static HashMap<String, String> params;/*** 添加相关头信息,对请求进行伪装*/static {params = new HashMap<String, String>();params.put("Referer", "http://book.zongheng.com");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");}public IntroPage(String url) throws IOException {readPageByGet(url, "utf-8", params);this.pageUrl = url;}/*** @return* @Author:lulei  * @Description: 获取书名*/private String getName() {return DoRegex.getFirstString(getPageSourceCode(), NAME, 1);}/*** @return* @Author:lulei  * @Description: 获取作者名*/private String getAuthor() {return DoRegex.getFirstString(getPageSourceCode(), AUTHOR, 1);}/*** @return* @Author:lulei  * @Description: 书籍简介*/private String getDesc() {return DoRegex.getFirstString(getPageSourceCode(), DESC, 1);}/*** @return* @Author:lulei  * @Description: 书籍分类*/private String getType() {return DoRegex.getFirstString(getPageSourceCode(), TYPE, 1);}/*** @return* @Author:lulei  * @Description: 最新章节*/private String getLatestChapter() {return DoRegex.getFirstString(getPageSourceCode(), LATESTCHAPTER, 1);}/*** @return* @Author:lulei  * @Description: 章节列表页Url*/private String getChapterListUrl() {return DoRegex.getFirstString(getPageSourceCode(), CHAPTERLISTURL, 1);}/*** @return* @Author:lulei  * @Description: 字数*/private int getWordCount() {String wordCount = DoRegex.getFirstString(getPageSourceCode(), WORDCOUNT, 1);return ParseUtil.parseStringToInt(wordCount, 0);}/*** @return* @Author:lulei  * @Description: 标签*/private String keyWords() {String keyHtml = DoRegex.getFirstString(getPageSourceCode(), KEYWORDS, 1);return DoRegex.getString(keyHtml, KEYWORD, " ", 1);}public static void main(String[] args) throws IOException {// TODO Auto-generated method stub  IntroPage intro = new IntroPage("http://book.zongheng.com/book/362857.html");System.out.println(intro.pageUrl);System.out.println(intro.getName());System.out.println(intro.getAuthor());System.out.println(intro.getDesc());System.out.println(intro.getType());System.out.println(intro.getLatestChapter());System.out.println(intro.getChapterListUrl());System.out.println(intro.getWordCount());System.out.println(intro.keyWords());}}

----------------------------------------------------------------------------------------------------
ps:最近发现其他网站可能会对博客转载,上面并没有源链接,如想查看更多关于 基于lucene的案例开发 请 点击这里。或访问网址http://blog.csdn.net/xiaojimanman/article/category/2841877 或 http://www.llwjy.com/blogtype/lucene.html

基于lucene的案例开发:纵横小说简介页采集相关推荐

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

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44854719 http://www.llwjy.com/blogdetail/d ...

  2. 基于lucene的案例开发:纵横小说数据库操作

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46785223 http://www.llwjy.com/blogdetail/e ...

  3. 基于phantomjs二次开发的百度元搜索采集器

    在爬虫.自然语言处理群320349384中的交流中,偶然接触到phantomjs.casper等相对于httpclient较新的框架及采集解决方案,微查之后发现方案可行,故尽清明三日之力,将其二次开发 ...

  4. 基于EFR32的Zigbee开发-介绍

    基于EFR32的Zigbee开发-介绍 EFR32 简介 EFR32 系列芯片是芯科公司出品的 Zigbee 芯片,多个系列具有高性能.低功耗和安全等多个方向的侧重,来面对不同的需求. Simplic ...

  5. 基于Lucene垂直搜索引擎的研究与开发实践报告

    目录 一.垂直搜索引擎概述 二.项目概述 三.关键技术 3.1 Lucene 3.2 全文检索 四.系统设计 4.1 实现全文检索 4.1.1.Lucene 实现全文检索的流程 4.2 可视化界面设计 ...

  6. Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机GA遗传算法PSO粒子群优化算法)、案例应用之详细攻略

    Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机&GA遗传算法&PSO粒子群优化算法).案例应用之详细攻略 目录 1.SVM算法使用案例 1.1.Libsvm ...

  7. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  8. 基于易语言开发的小说下载工具

    基于易语言开发的小说下载工具 这次的编程,是为了交作业,嘻嘻 老规矩,上个图 ***让我女朋友露个脸,哈哈哈哈哈*** 起因:看到论坛里面,没什么用易语言下载小说的软件,是易语言不好用吗?还是Pyth ...

  9. Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN、SOFM神经网络)、案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略

    Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN.SOFM神经网络).案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略 目录

最新文章

  1. java js css 压缩工具_javascript和css文件的压缩(YUI Compressor)
  2. [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
  3. svg mysql_SVG 实例
  4. mongodb集群linux日志分割,Linux下Mongodb数据库日志切割及定时删除
  5. Codeforces 781B. Innokenty and a Football League
  6. [Java][Android] 多线程同步-主线程等待所有子线程完成案例
  7. 虚拟机VMware镜像下载及安装Linux系统
  8. “互联网+监管”平台建设思路
  9. ai中位图转矢量图(扩展与扩展外观)
  10. 50个最常用的Unix/Linux命令
  11. 使用Python将PDF转换成图片
  12. oracle数据库 同义词读写操作,Oracle数据库之同义词(SYNONYM)使用
  13. ie9 html5 web worker,HTML5之殇
  14. MaskGAN:Towards Diverse and Interactive Facial Image Manipulation翻译
  15. python 报错“xxx is not defined”
  16. Google Chrome 66可以下载啦
  17. mysql一条语句是如何被执行的——带你了解mysql语句执行内部顺序
  18. 从hilinux.com架设谈网站或其他服务器运维
  19. iOS 几种常用的 crash log 崩溃信息调试方法. (转载)
  20. MATLAB调用多个核(常用于跑多次再取平均的仿真)

热门文章

  1. R语言环境及平台配置
  2. java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试
  3. MSP430F5529-PWM波在串口中的输出及调整
  4. Received disconnect from xxx.xxx.xxx port 22:2: Too many authentication failures for git
  5. NSGA 2 学习笔记 -- crowding distance
  6. 亿图图示----工业自动化模块展示
  7. android - 【记录】三星手机(N9002)刷机、官方系统、TWRP
  8. servlet part对象文件上传
  9. 20221218-19英语学习
  10. MFC 分割窗体(Splitter Windows)