热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Java的网络爬虫实现抓取网络小说(一)

基于Java的网络爬虫实现抓取网络小说(一)今天开始写点东西,一方面加深印象一方面再学习。网络爬虫(Webcrawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互

基于Java的网络爬虫实现抓取网络小说(一)

今天开始写点东西,一方面加深印象一方面再学习。 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
接下来是正题。在这里我们先以笔下文学:http://www.bxwx8.org;为准抓取一本其中的小说,例如《完美世界》链接是:http://www.xs.la/0_5/;来实现一个简单的抓取。
  • 首先建立一个名为Novel的maven项目
  • 项目所需要的jar包pom.xml

4.0.0
Novel
novel.spider
0.0.1-SNAPSHOT


org.jsoup
jsoup
1.9.2


org.apache.httpcomponents
httpclient
4.5.2


dom4j
dom4j
1.6.1


junit
junit
4.12


  • 我们要获取的是章节目录,需要相关的实体类Chapter.java
package novel.spider.entity;

import java.io.Serializable;

/**
* 小说章节实体类
* @author lilonghua
* @date: 2017年6月22日
*/
public class Chapter implements Serializable {
private static final long serialVersiOnUID= 1L;
private String title;//小说章节
private String url;//章节链接
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Chapter [title=" + title + ", url=" + url + "]";
}
}
  • 接下来我们要写一个接口,一个用来获取章节url的方法IChapterInter.java
ackage novel.spider.interfaces;

import java.util.List;

import novel.spider.entity.Chapter;

/**
* 小说url接口
* @author lilonghua
* @date: 2017年6月22日
*/
public interface IChapterInter {

/**
* 获取一个完整的url链接,显示所有章节列表
* @param @param url
* @param @return
* @return
* @throws
*/
public List getChapter(String url);

}
  • 之后我们需要在写一个方法来获取传过来的url,并且实现它的抓取IChapterInterImpl.java
package novel.spider.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import novel.spider.entity.Chapter;
import novel.spider.interfaces.IChapterInter;

/**
* 小说url接口实现类
*
* @author lilonghua
* @date: 2017年6月22日
*/
public class IChapterInterImpl implements IChapterInter {

protected String crawl(String url) throws Exception {
//采用HttpClient技术
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();
CloseableHttpResponse httpRespOnse= httpClient.execute(new HttpGet(url))) {
String result = EntityUtils.toString(httpResponse.getEntity());
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}


@Override
public List getChapter(String url) {
try {
String result = crawl(url);
Document doc = Jsoup.parse(result);
Elements as = doc.select("#list dd a");
List chapters = new ArrayList<>();
for (Element a : as) {
Chapter chapter = new Chapter();
chapter.setTitle(a.text());
chapter.setUrl("http://www.bxwx8.org" + a.attr("href"));
chapters.add(chapter);
}
return chapters;
} catch (Exception e) {
throw new RuntimeException(e);
}
}


}
  • 最后是测试,我们需要在test下创建测试类TestOne.java
package novel.spider.test;

import java.util.List;

import org.junit.Test;

import novel.spider.entity.Chapter;
import novel.spider.impl.IChapterInterImpl;

/**
* 测试链接
* @author lilonghua
* @date: 2017年6月22日
*/
public class TestOne {

@Test
public void test1(){
IChapterInterImpl ChapterInterImpl = new IChapterInterImpl();
List chapterList = ChapterInterImpl.getChapter("http://www.biquge.tw/0_5/");
for (Chapter chapter : chapterList) {
System.out.println(chapter);
}
}
}
  • 测试结果,完美实现

  • 最后来个完整的项目结构图

今天先到这,功能还得完善。第一次写,有不足之处欢迎大家指出。

推荐阅读
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • npminstall-Dbabelcorebabelpreset-envbabelplugin-transform-runtimebabelpolyfillbabel-loader ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
author-avatar
mobiledu2502881767
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有