接上上一篇爬取起点小说网的内容说,上一篇只是获取小说名、章节以及章节链接,然后总是感觉不太好,并不能达到获取到整个网站的效果,用户在用时还得自己联网,故改进了改进,这一篇讲能够完全解析小说网,直到解析到内容为止。
与上一篇思路是一样的,不同的是,在解析时用递归的方式,将获取到这个链接传值到下一个解析入口,层层解析。与上一篇代码不同的是SpilderNovel中的代码,这一篇将只粘贴这一块的代码,对于其他模块的代码,有需要的请看前面的文章。
下面附上代码块:
package xuf.main;
import java.util.ArrayList;
import java.util.Date;
import java.util.stream.Stream;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.w3c.dom.stylesheets.LinkStyle;
import xuf.entity.NovelAttribute;
import xuf.service.INovel;
import xuf.service.NovelImpl;
public class SpiderNovel {
public static void main(String[] args) {
// 数据持久化对象,用于将信息存入数据库
INovel iNovel = new NovelImpl();
Long startTime, endTime;
System.out.println("小爬虫工作启动。。。。。。。。。。。");
startTime = new Date().getTime();
Document document;
try {
NovelAttribute novelAttribute = new NovelAttribute();
document = Jsoup.connect("http://www.qidian.com/").get();
Elements results0 = document.select("div.classify-list > dl > dd > a[href]");
for (Element e0 : results0) {
String fictionUr0 = e0.attr("abs:href");
ArrayList<String> list0 = new ArrayList<String>();
list0.add(fictionUr0);
String[] strArray0 = (String[]) list0.toArray(new String[0]);
for (String strurl0 : strArray0) {
System.out.println(strurl0);
document = Jsoup.connect(strurl0).get();
Elements results1 = document.select("div.channel-focus > div.big-list > ul > li > h3 > a[href]");
for (Element e1 : results1) {
String fictionUrl1 = e1.attr("abs:href");
ArrayList<String> list1 = new ArrayList<String>();
list1.add(fictionUrl1);
String[] strArray1 = (String[]) list1.toArray(new String[0]);
for (String strurl1 : strArray1) {
System.out.println(fictionUrl1);
document = Jsoup.connect(fictionUrl1).get();
Elements results2 = document.select("div.catalog-content-wrap > div.volume-wrap > div.volume > ul > li > a[href]");
for (Element e2 : results2) {
String fictionUrl2 = e2.attr("abs:href");
ArrayList<String> list2 = new ArrayList<String>();
list2.add(fictionUrl2);
String[] strArray2 = (String[]) list2.toArray(new String[0]);
for (String strurl2 : strArray2) {
System.out.println(strurl2);
}
document = Jsoup.connect(fictionUrl2).get();
Elements results4 = document.select("div.book-cover-wrap > h1");
for (Element e4 : results4) {
String fictionName = e4.text();
novelAttribute.setFictionName(fictionName);
}
Elements results3 = document.select("h3.j_chapterName");
for (Element e3 : results3) {
String fictionChapter = e3.text();
novelAttribute.setFictionChapter(fictionChapter);
}
Elements results5 = document.select("div.read-content");
for (Element e5 : results5) {
String fictionContent = e5.text();
novelAttribute.setFictionContent(fictionContent);
}
iNovel.SaveAttribute(novelAttribute);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
endTime = new Date().getTime();
System.out.println("工作结束,用时" + (endTime - startTime) + "ms");
}
}
以上就是这次的一个小的改动。