基于lucene的案例开发:纵横小说简介页采集
转载请注明出处: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的案例开发:纵横小说简介页采集相关推荐
- 基于lucene的案例开发:纵横小说章节列表采集
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44854719 http://www.llwjy.com/blogdetail/d ...
- 基于lucene的案例开发:纵横小说数据库操作
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46785223 http://www.llwjy.com/blogdetail/e ...
- 基于phantomjs二次开发的百度元搜索采集器
在爬虫.自然语言处理群320349384中的交流中,偶然接触到phantomjs.casper等相对于httpclient较新的框架及采集解决方案,微查之后发现方案可行,故尽清明三日之力,将其二次开发 ...
- 基于EFR32的Zigbee开发-介绍
基于EFR32的Zigbee开发-介绍 EFR32 简介 EFR32 系列芯片是芯科公司出品的 Zigbee 芯片,多个系列具有高性能.低功耗和安全等多个方向的侧重,来面对不同的需求. Simplic ...
- 基于Lucene垂直搜索引擎的研究与开发实践报告
目录 一.垂直搜索引擎概述 二.项目概述 三.关键技术 3.1 Lucene 3.2 全文检索 四.系统设计 4.1 实现全文检索 4.1.1.Lucene 实现全文检索的流程 4.2 可视化界面设计 ...
- Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机GA遗传算法PSO粒子群优化算法)、案例应用之详细攻略
Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机&GA遗传算法&PSO粒子群优化算法).案例应用之详细攻略 目录 1.SVM算法使用案例 1.1.Libsvm ...
- Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)
(一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...
- 基于易语言开发的小说下载工具
基于易语言开发的小说下载工具 这次的编程,是为了交作业,嘻嘻 老规矩,上个图 ***让我女朋友露个脸,哈哈哈哈哈*** 起因:看到论坛里面,没什么用易语言下载小说的软件,是易语言不好用吗?还是Pyth ...
- Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN、SOFM神经网络)、案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略
Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN.SOFM神经网络).案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略 目录
最新文章
- java js css 压缩工具_javascript和css文件的压缩(YUI Compressor)
- [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
- svg mysql_SVG 实例
- mongodb集群linux日志分割,Linux下Mongodb数据库日志切割及定时删除
- Codeforces 781B. Innokenty and a Football League
- [Java][Android] 多线程同步-主线程等待所有子线程完成案例
- 虚拟机VMware镜像下载及安装Linux系统
- “互联网+监管”平台建设思路
- ai中位图转矢量图(扩展与扩展外观)
- 50个最常用的Unix/Linux命令
- 使用Python将PDF转换成图片
- oracle数据库 同义词读写操作,Oracle数据库之同义词(SYNONYM)使用
- ie9 html5 web worker,HTML5之殇
- MaskGAN:Towards Diverse and Interactive Facial Image Manipulation翻译
- python 报错“xxx is not defined”
- Google Chrome 66可以下载啦
- mysql一条语句是如何被执行的——带你了解mysql语句执行内部顺序
- 从hilinux.com架设谈网站或其他服务器运维
- iOS 几种常用的 crash log 崩溃信息调试方法. (转载)
- MATLAB调用多个核(常用于跑多次再取平均的仿真)
热门文章
- R语言环境及平台配置
- java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试
- MSP430F5529-PWM波在串口中的输出及调整
- Received disconnect from xxx.xxx.xxx port 22:2: Too many authentication failures for git
- NSGA 2 学习笔记 -- crowding distance
- 亿图图示----工业自动化模块展示
- android - 【记录】三星手机(N9002)刷机、官方系统、TWRP
- servlet part对象文件上传
- 20221218-19英语学习
- MFC 分割窗体(Splitter Windows)