吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9069|回复: 21
收起左侧

[Java 转载] java实现通用小说爬虫

  [复制链接]
zhg158 发表于 2018-11-24 00:24
前面写了一个安卓小说下载器
如果有喜欢看小说的可以去下载
安卓小说下载器https://www.52pojie.cn/forum.php ... rtype=1#pid22783327

在写的时候就觉得维护起来比较麻烦,当时就在构想怎么实现通用的小说爬虫,现在有了思路,动手写了下,试了10多个网站都还是效果不错
原理
老套路:提取小说目录的链接,然后通过链接解析正文
解析方式:正则表达式

构想:

正文几乎都是汉字标点符号,用正则匹配汉字,符号,换行符,还有一些网站有些特殊字符
  • [\u4E00-\u9FFF]正则匹配汉字--UTF-8
  • [\pP]匹配标点符号,[\\pN\\pL\\pM],所有数字,所有字母字符,音调符号
  • [\w]匹配0-9a-zA-Z
差不多用到的就这些规则,好了,开始实现
首先抓取目录链接地址
[Java] 纯文本查看 复制代码
//抓Chapter
	@Test
	void TestEncode() {
		String html = "";
		String chinese="\\u4E00-\\u9FFF";
		String url="https://www.xbiquge6.com/9_9208/";
		try {
			html = SpiderUtils.getSource(url);//获取源码
//			System.out.println(html);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Pattern compile = Pattern.compile("<a href=\"([\\w./-]+?)\".*?>(["+chinese+" \\d\\pP]+?)</a");
		Matcher m=compile.matcher(html);
		while(m.find()) {	
//			String reString=m.group(0).trim();
			String re1=m.group(1).trim();
			String re2=m.group(2).trim();
			if(re1.length()>5&&re2.length()>5) {
				System.out.println(SpiderUtils.GetAbsUrl(url,re1)+"--------"+re2);//获取绝对路径
			}
		}
	}

这个抓下来的url可能会带有几个不是目录页面的,这个可以过滤掉,我没有过滤,不过我的思路是可以比较url的长度来剔除部分,然后就是比较相似度。具体实现看自己
运行图
]5PC~ED}~CE`YZB0ZN(8P.png

然后就是抓到的url来抓正文了
还是上代码把,也不复杂
[Java] 纯文本查看 复制代码
//正则抓取内容
	@Test
	void test12() {
//		String pinyin="āáǎàēéěèīíǐìōóǒA8B0òūúǔùǖǘǚǜüê";
		String ch_punctuation="~\\u000A\\u0009\\u00A0\\u0020\\u3000";//匹配一些特殊的字符
//		String punctuation="[\\-,\\/,\\|,\\$,\\+,\\%,\\&,\\',\\(,\\),\\*,\\x20-\\x2f,\\x3a-\\x40,\\x5b-\\x60,\\x7b-\\x7e,\\x80-\\xff,\\u3000-\\u3002,\\u300a,\\u300b,\\u300e-\\u3011,\\u2014,\\u2018,\\u2019,\\u201c,\\u201d,\\u2026,\\u203b,\\u25ce,\\uff01-\\uff5e,\\uffe5]";
//		String eh_punctuation="\\u003A\\u0028\\u201C\\uFF0C\\uFF1F\\u3001\\u201D\\uFF01\\uFF1A\\u223C\\u003D\\u2026";
		String unicode_azAZ09="\\uFF41-\\uFF5a\\uFF21-\\uFF3a\\uFF10-\\uFF19";
		String chinese="\\u4E00-\\u9FFF";//匹配中文正则
		String html = "";
		try {
			html = SpiderUtils.getSource("https://www.xbiquge6.com/9_9208/9120869.html");
//			System.out.println(html);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Pattern compile = Pattern.compile("[pvr/\"]>[^字\\w<*][\\pP\\w\\pN\\pL\\pM"
				    +unicode_azAZ09+chinese+ch_punctuation
				    + "]{3,}[^字\\w>]{0,2}(<br|</p|</d|<p)");
		Matcher m=compile.matcher(html);
		while(m.find()) {	
			String reString=m.group(0).replace("\r\n", "").replace("<br", "\n").replace("</p", "\n")
					.replace("p>", "\n").replaceAll("&[a-z]{3,6};", "").replace("\n", "").replace("<p", "\n")
					.replace("/>", "").replace("r>", "").replace(" ","").replace("</d","").replace("v>","")
					.replace("\">", "").replace(" ", "").trim();
			if(reString.length()>0) {
				System.out.println(reString);
			}
		}
	}

简单的使用正则来实现的,运行结果
V]{30_1BYOTK3((A)MXA@Q5.png

这个实现了就可以通过目录页来抓取一本小说的全部内容了
核心全在正则,一个套则正则可能不完善,那就多来几套,思路很关键

现在还有一个想法,就是把弄个通用的小说目录链接爬虫,
我那安卓小说爬虫是把所有小说目录链接放在数据库里面的。解析也是用的jsoup,打算后面把这个也加进去,通过目录链接下载,不过这样虽然绝大部分小说可以搜索到,但是终究是不完美,
如果能在用户搜索的时候自动抓取小说目录链接就比较舒服了,而且抓取规则通用性得高才行,不然麻烦死。
有思路得分享一下,一起交流


免费评分

参与人数 6吾爱币 +6 热心值 +5 收起 理由
hohov + 1 谢谢@Thanks!
灿若繁星 + 1 + 1 我很赞同!
那一夜谁懂22 + 1 + 1 我很赞同!
1358582642 + 1 + 1 热心回复!
Psyber + 1 + 1 我很赞同!
menghun + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| zhg158 发表于 2018-11-24 08:36 来自手机
SimpleWu 发表于 2018-11-24 08:18
创建个类记录爬虫信息,以链表的形式爬去,提供个方法每次爬取多少章,从多少章开始,每次爬取清空列表。

这个是爬取章节链接,不是目录链接啊,目录链接有思路没有,主要是要爬取小说的链接,来自不同网站的目录页面的链接
SimpleWu 发表于 2018-11-24 09:14
zhg158 发表于 2018-11-24 08:36
这个是爬取章节链接,不是目录链接啊,目录链接有思路没有,主要是要爬取小说的链接,来自不同网站的目录 ...

我不是搞爬虫的。
Small-Bao 发表于 2018-11-24 00:56
自己写最恶心的就是去除干扰码和一些广告乱码了
l仰望0星空l 发表于 2018-11-24 07:14
感觉还不错,有机会试一试
SimpleWu 发表于 2018-11-24 08:18
创建个类记录爬虫信息,以链表的形式爬去,提供个方法每次爬取多少章,从多少章开始,每次爬取清空列表。
killer0 发表于 2018-11-24 09:04 来自手机
有些小说找不到,试试看
Psyber 发表于 2018-11-24 09:41
谢谢分享
Kaiter_Plus 发表于 2018-11-24 09:56
厉害,学习一下!
young24 发表于 2018-11-24 12:57
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 08:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表