zhg158 发表于 2018-11-24 00:24

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,打算后面把这个也加进去,通过目录链接下载,不过这样虽然绝大部分小说可以搜索到,但是终究是不完美,
如果能在用户搜索的时候自动抓取小说目录链接就比较舒服了,而且抓取规则通用性得高才行,不然麻烦死。
有思路得分享一下,一起交流


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

感谢分享
页: [1] 2 3
查看完整版本: java实现通用小说爬虫