java实现通用小说爬虫
前面写了一个安卓小说下载器如果有喜欢看小说的可以去下载
安卓小说下载器https://www.52pojie.cn/forum.php?mod=viewthread&tid=825397&page=1&ordertype=1#pid22783327
在写的时候就觉得维护起来比较麻烦,当时就在构想怎么实现通用的小说爬虫,现在有了思路,动手写了下,试了10多个网站都还是效果不错
原理
老套路:提取小说目录的链接,然后通过链接解析正文
解析方式:正则表达式
构想:
正文几乎都是汉字标点符号,用正则匹配汉字,符号,换行符,还有一些网站有些特殊字符
[*][\u4E00-\u9FFF]正则匹配汉字--UTF-8
[*][\pP]匹配标点符号,[\\pN\\pL\\pM],所有数字,所有字母字符,音调符号
[*][\w]匹配0-9a-zA-Z
差不多用到的就这些规则,好了,开始实现
首先抓取目录链接地址
//抓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的长度来剔除部分,然后就是比较相似度。具体实现看自己
运行图
然后就是抓到的url来抓正文了
还是上代码把,也不复杂
//正则抓取内容
@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(">[^字\\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("&{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);
}
}
}
简单的使用正则来实现的,运行结果
这个实现了就可以通过目录页来抓取一本小说的全部内容了
核心全在正则,一个套则正则可能不完善,那就多来几套,思路很关键
现在还有一个想法,就是把弄个通用的小说目录链接爬虫,
我那安卓小说爬虫是把所有小说目录链接放在数据库里面的。解析也是用的jsoup,打算后面把这个也加进去,通过目录链接下载,不过这样虽然绝大部分小说可以搜索到,但是终究是不完美,
如果能在用户搜索的时候自动抓取小说目录链接就比较舒服了,而且抓取规则通用性得高才行,不然麻烦死。
有思路得分享一下,一起交流
SimpleWu 发表于 2018-11-24 08:18
创建个类记录爬虫信息,以链表的形式爬去,提供个方法每次爬取多少章,从多少章开始,每次爬取清空列表。
这个是爬取章节链接,不是目录链接啊,目录链接有思路没有,主要是要爬取小说的链接,来自不同网站的目录页面的链接 zhg158 发表于 2018-11-24 08:36
这个是爬取章节链接,不是目录链接啊,目录链接有思路没有,主要是要爬取小说的链接,来自不同网站的目录 ...
我不是搞爬虫的。 自己写最恶心的就是去除干扰码和一些广告乱码了 感觉还不错,有机会试一试 创建个类记录爬虫信息,以链表的形式爬去,提供个方法每次爬取多少章,从多少章开始,每次爬取清空列表。 有些小说找不到,试试看 谢谢分享 厉害,学习一下! 感谢分享