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

基于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;
	}
	@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<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);
		}
	}
	

	@Override
	public 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 {

	@Test
	public 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);
		}
	}
}
  • 测试结果,完美实现

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

今天先到这,功能还得完善。第一次写,有不足之处欢迎大家指出。
  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值