程序员人生 网站导航

小说爬虫之JAVA代码的实现(附代码)

栏目:php教程时间:2015-05-14 09:20:03

第1次采取Markdown看看效果。

  • 思路:首先找到1篇小说,获得第1章小说的URL,然后根据该URL来获得该章小说的标题、内容和下1章的URL。以后重复类似动作,就可以获得到整篇小说的内容了。

  • 实现方法:这里语言采取==Java==,使用了jsoup。jsoup简单的使用方法可以参考这里。

  • 实现进程:首先找到1篇小说,这里以“神墓”为例,我们打开第1章,然后查看网页源代码。
    在源码中我们可以看到下1页的url、文章标题和小说内容。我们可以先获得1个Document对象,然后分别根据Element的Id或样式来获得小说的内容、标题或下1页URL。

    1. 小说中的下1页地址
      下一页
    2. 小说的标题
      小说标题
    3. 小说的内容
      小说内容
    4. 小说的下1页地址也能够从这里获得
      其他
  • 实现代码:新建1个项目spider,导入jsoup⑴.7.3.jar包。

    1. 新建com.dapeng.bean包,在该包下新建类Article。其主要代码以下:
package com.dapeng.bean; public class Article { private String id;//id private String title;//标题 private String content;//内容 private String url;//当前章节url private String nextUrl;//下1章url /** *省略getter、setter方法 */ @Override public String toString() { return "Article [id=" + id + ", title=" + title + ", content=" + content + ", url=" + url + ", nextUrl=" + nextUrl + "]"; } }

2.新建com.dapeng.method包,在该包下新建UtilMethod类。主要用于实现获得文章标题、内容、下1章URL等方法。其代码以下:

package com.dapeng.method; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import com.dapeng.bean.Article; public class UtilMethod { /** * 根据url获得Document对象 * @param url 小说章节url * @return Document对象 */ public static Document getDocument(String url){ Document doc = null; try { doc = Jsoup.connect(url).timeout(5000).get(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return doc; } /** * 根据获得的Document对象找到章节标题 * @param doc * @return 标题 */ public static String getTitle(Document doc){ return doc.getElementById("title").text(); } /** * 根据获得的Document对象找到小说内容 * @param doc * @return 内容 */ public static String getContent(Document doc){ if(doc.getElementById("content") != null){ return doc.getElementById("content").text(); }else{ return null; } } /** * 根据获得的Document对象找到下1章的Url地址 * @param doc * @return 下1章Url */ public static String getNextUrl(Document doc){ Element ul = doc.select("ul").first(); String regex = "<li><a href="(.*?)">下1页</a></li>"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(ul.toString()); Document nextDoc = null; if (matcher.find()) { nextDoc = Jsoup.parse(matcher.group()); Element href = nextDoc.select("a").first(); return "http://www.bxwx.org/b/5/5131/" + href.attr("href"); }else{ return null; } } /** * 根据url获得id * @param url * @return id */ public static String getId(String url){ String urlSpilts[] = url.split("/"); return (urlSpilts[urlSpilts.length - 1]).split(".")[0]; } /** * 根据小说的Url获得1个Article对象 * @param url * @return */ public static Article getArticle(String url){ Article article = new Article(); article.setUrl(url); Document doc = getDocument(url); article.setId(getId(url)); article.setTitle(getTitle(doc)); article.setNextUrl(getNextUrl(doc)); article.setContent(getContent(doc)); return article; } }

3.新建com.dapeng.test包,用于测试获得整篇小说。新建GetArticles类。其代码以下:

package com.dapeng.test; import com.dapeng.bean.Article; import com.dapeng.method.UtilMethod; public class GetArticles { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String firstUrl = "http://www.bxwx.org/b/5/5131/832882.html"; Article article = UtilMethod.getArticle(firstUrl); while(article.getNextUrl() != null && article.getContent() != null && !article.getId().equals("996627")){ article = UtilMethod.getArticle(article.getNextUrl()); System.out.println(article.getId()+"----"+article.getTitle()); } } }

运行GetArticles方法,可以看到类似以下的效果:

832883----第1卷 从神墓中走出 第2章 沧海桑田 832884----第1卷 从神墓中走出 第3章 人世悠悠 832885----第1卷 从神墓中走出 第4章 无解之谜 832886----第1卷 从神墓中走出 第5章 冷艳 832887----第1卷 从神墓中走出 第6章 公主 832888----第1卷 从神墓中走出 第7章 小恶魔 832889----第1卷 从神墓中走出 第8章 烈火仙莲 832890----第1卷 从神墓中走出 第9章 百丈巨蛇 ....

到这里该代码就告1段落了。后续的就不再进行了,比如说将小说插入数据库,然后自己搭建1个小说站点,或将小说写入到1个txt文档中,不用再看那烦人的广告了。等等。。这里就不再进行了。

最后代码附上。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐