天天看点

网络爬虫(1)

算法分析

    我们现在从需求中提取关键词来逐步分析问题。

    首先是“种子节点”。它就是一个或多个在爬虫程序运行前手动给出的url(网址),爬虫正是下载并解析这些种子url指向的页面,从中提取出新的url,然后重复以上的工作,直到达到设定的条件才停止。

网络爬虫(1)

    最后是“设定的条件”,爬虫程序终止的条件可以根据实际情况灵活设置,比如设定爬取时间,爬取数量,爬行深度等。

    到此,我们分析完了爬虫如何开始,怎么运作,如何结束(当然,要实现一个强大,完备的爬虫要考虑的远比这些复杂,这里只是入门分析),下面给出整个运作的流程图:

网络爬虫(1)

 数据结构分析

    根据以上的分析,我们需要用一种数据结构来保存初始的种子url和解析下载的页面得到的url,并且我们希望先解析出的url先执行请求,因此我们用队列来储存url。因为我们要频繁的添加,取出url,因此我们采用链式存储。下载的页面解析后直接原封不动的保存到磁盘。

 技术分析

    所谓网络爬虫,我们当然要访问网络,我们这里使用jsoup,它对http请求和html解析都做了良好的封装,使用起来十分方便。根据数据结构分析,我们用linkedlist实现队列,用来保存未访问的url,用hashset来保存访问过的url(因为我们要大量的判断该url是否在该集合内,而hashset用元素的hash值作为“索引”,查找速度很快)。

 代码

    以上分析,我们一共要实现2个类:

   ① jsoupdownloader,该类是对jsoup做一个简单的封装,方便调用。暴露出以下几个方法:

—public document downloadpage(string url);根据url下载页面 —public set<string> parsepage(document doc, string regex);从document中解析出匹配regex的url。 —public void savepage(document doc, string savedir, string savename, string regex);保存匹配regex的url对应的document到指定路径。

    ② urlqueue,该类用来保存和获取url。暴露出以下几个方法:

—public void enqueue(string url);添加url。 —public string dequeue();取出url。 —public int getvisitedcount();获取访问过的url的数量;
网络爬虫(1)

继续阅读