重新回顾一下流程图,我们将我们的爬虫代码分为以下几个步骤:
下面我们来实现这些步骤。
根据之前的分析,我们先为爬虫建立一个基础的接口,我们接下来的代码将基于该接口进行实现:
public interface Crawler {
/**
* 初始化爬虫队列
*/
void initCrawlerList();
/**
* 获取一个未爬取页面,并将其标记为已爬
* @return
*/
WebPage getUnCrawlPage();
/**
* 添加页面至爬虫列表
*/
List<WebPage> addToCrawlList(List<WebPage> webPages);
/**
* 添加歌曲至已爬歌曲列表
*/
Song saveSong(Song song);
/**
* 获取所有已爬歌曲
*/
List<Song> getSongs();
/**
* 获取未爬页面->获取html->解析html并对结果进行处理->标记页面
* 即流程图右下角黑框部分
*/
void doRun();
/**
* 运行爬虫整体流程
*/
default void run() {
initCrawlerList();
doRun();
}
}
接下来,我们就基于这个接口,实现一个最简单的爬虫。这节课的所有代码都在BasicCrawler
类中,其中我们给出了部分参考代码,剩下的代码需要你在作业中实现,实现完成后,我们的简易爬虫就完成了。
从流程图中可以看到,爬虫队列是整个爬虫的一个核心,这里,我们先使用最简单的实现方式,以一个List
作为我们的爬虫队列:
定义好之后,我们来完成和爬虫队列相关的方法:
public void initCrawlerList() {
crawlerList = new ArrayList<WebPage>();
crawlerList.add(new WebPage("http://music.163.com/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0", PageType.playlists));
}
准备好爬虫队列后,我们接下来实现我们的爬虫流程:
public void doRun() {
WebPage webPage;
while ((webPage = getUnCrawlPage()) != null) {
// your code here
}
}
大部分方法都为你定义好了,现在需要你在doRun
方法中实现基本流程,然后运行main方法,就可以看见一个最简单的爬虫在运行啦。
注意,为了更快的看到效果,我们注释掉了原来的爬虫队列初始化代码,在初始化时,仅仅添加了一个歌单页面,也就是说,运行爬虫后,该爬虫只会爬取与该歌单下的歌曲页面,如果你希望看爬取更多的页面,需要打开initCrawlerList
方法中的注释。
登录发表评论 登录 注册