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


今天开始写点东西,一方面加深印象一方面再学习。
网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
接下来是正题。在这里我们先以笔下文学:http://www.bxwx8.org;为准抓取一本其中的小说,例如《完美世界》链接是:http://www.xs.la/0_5/;来实现一个简单的抓取。
  • 首先建立一个名为Novel的maven项目
  • 项目所需要的jar包pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>Novel</groupId><artifactId>novel.spider</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.9.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>
  • 我们要获取的是章节目录,需要相关的实体类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;}@Overridepublic 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<Chapter> 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);}}@Overridepublic List<Chapter> getChapter(String url) {try {String result = crawl(url);Document doc = Jsoup.parse(result);Elements as = doc.select("#list dd a");List<Chapter> 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 {@Testpublic void test1(){IChapterInterImpl  ChapterInterImpl = new IChapterInterImpl();List<Chapter> chapterList = ChapterInterImpl.getChapter("http://www.biquge.tw/0_5/");for (Chapter chapter : chapterList) {System.out.println(chapter);}}
}
  • 测试结果,完美实现

  • 最后来个完整的项目结构图
今天先到这,功能还得完善。第一次写,有不足之处欢迎大家指出。

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

  1. 基于Java的阿里妈妈数据抓取技术

    基于Java的阿里妈妈数据抓取技术 前言: 对于需要登录的网站爬虫最大的困难就是需要登录,然后才能获取到数据,如微博,阿里妈妈,webqq等.之前也有看过使用浏览器登录到网站后直接从浏览器中获取coo ...

  2. (插播)网络爬虫,抓取你想要得东西。

    project在以下 近期,有个朋友说.想在一些页面上获取一些关键性得信息.比方,电话.地址等等.一个个页面去找 又非常麻烦. 这时候,想起了 何不去用"爬虫"去抓取一些想要得东西 ...

  3. java 开发用到网络爬虫,抓取汽车之家网站全部数据经历

    经历了两个礼拜的折腾,某某知名网站的数据终于到手了.犯罪没被发现这种心情感觉很爽. 说一下我的犯罪经历,之前公司总是抓取某某网站数据,可能是被发现了.某某网站改变了策略.通过各种技术终止了我们的行为, ...

  4. python数据抓取技术与实战训练_师傅带徒弟学Python:项目实战1:网络爬虫与抓取股票数据...

    本视频基于**Python 3.X版本 本视频课程是第四篇第一个实战项目,内容包括网络爬虫技术.使用urllib爬取数据.使用Selenium爬取数据.使用正则表达式.使用BeautifulSoup库 ...

  5. java爬取网易云歌单_[原创]基于Java网易云音乐评论抓取~【悠着点玩啊~】

    本帖最后由 wushaominkk 于 2018-3-20 10:40 编辑 一般我们爬虫都是采用Python,自己闲的无聊就有Java编写一个简单的网易云音乐评论的抓取,这个仅仅是我开发的一个小小调 ...

  6. 网络爬虫--python抓取豆瓣同城北京地区活动信息

    感谢主赐予我们时光. 本内容只涉及技术探讨,不作为商业用途. 背景 作为入门级的爬虫,其实不需要了解复杂的正则表达式匹配,高深的网络协议.只需要了解一些基本的python语法和html请求/响应原理就 ...

  7. 40行代码教你利用Python网络爬虫批量抓取小视频

    1. 前言 还在为在线看小视频缓存慢发愁吗?还在为想重新回味优秀作品但找不到资源而忧虑吗?莫要慌,让python来帮你解决,40行代码教你爬遍小视频网站,先批量下载后仔细观看,岂不美哉! 2. 整理思 ...

  8. python爬取小视频-40行代码教你利用Python网络爬虫批量抓取小视频

    /1 前言/ 还在为在线看小视频缓存慢发愁吗?还在为想重新回味优秀作品但找不到资源而忧虑吗?莫要慌,让python来帮你解决,40行代码教你爬遍小视频网站,先批量下载后仔细观看,岂不美哉! /2 整理 ...

  9. Python网络爬虫:抓取书籍排行榜 并生成HTML网页

    Hello,大家好,我是wangzirui32,我们来学习如何抓取书籍排行榜,并生成HTML网页,开始学习吧! 文章目录 1. 分析HTML 2. 爬虫程序 3. 生成HTML网页 3.1 rende ...

最新文章

  1. 如何在windows 10 x64安装佳能 CP900 驱动
  2. autojs微博_js实现微博发布小功能
  3. 一个兼容所有浏览器的阻止事件冒泡方法
  4. leetcode275. H指数 II(二分法)
  5. 如何在 Java 中正确使用 wait, notify 和 notifyAll?
  6. abs 不会整数 方法 溢出_asp cint clng的范围与防止cint和clng的溢出解决方法大全
  7. 包容网关 Inclusive Gateway
  8. docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
  9. 解决上传窗口弹不出的问题
  10. linux之SQL语句简明教程---CONCATENATE
  11. mysql 镜像安装方法_MySql镜像安装
  12. python函数手册pdf_Numpy函数手册(中文版).pdf
  13. 【Android 逆向】加壳技术识别 ( VMP 加壳示例 | Dex2C 加壳示例 )
  14. 如何在虚拟机linux下运行程序吗,在Linux上运行虚拟机的3种方法 | MOS86
  15. html图片随圆点下标轮播,基于JavaScript实现轮播图代码
  16. 非递归获取二叉树中叶子结点的个数
  17. 乐优商城第九天,第十天,(商品规格参数模版的新增,商品的新增)
  18. bochs运行xp_在bochs虚拟机中安装WindowsXP (学习)
  19. 转贴:ubuntu Rhythmbox歌曲名乱码问题
  20. 极米发布极光RS Pro、H3、Z8X三款新品

热门文章

  1. Python-Super
  2. 八年级使用计算机的教案,八年级信息技术教案
  3. Rxjava和EventBus对比
  4. IEC-104报文结构及解析说明
  5. 遥测,遥信,遥控,遥调
  6. Excel数据分析项目——天猫订单交易分析
  7. 有关《家》的经典歌曲_好听的法语歌:你一定听过的十首经典法语歌曲
  8. 【疑难杂症】Realtek PCIe GBE Family Controller 出现感叹号问题
  9. 微信小程序 课程教学辅助学习系统
  10. GD32和STM32区别