码迷,mamicode.com
首页 > 其他好文 > 详细

爬虫基本结构

时间:2017-11-13 11:20:31      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:dal   str   抓取   javascrip   rip   合作   set   trie   图片   

爬虫程序的工作是从一个种子链接的集合开始。把种子URL集合作为参数传递给网络爬
虫。爬虫先把这些初始的URL放入URL工作队列(Todo队列,又叫作Frontier),然后遍历
所有工作队列中的URL,下载网页并把其中新发现的URL再次放入工作队列。为了判断一个
URL是否已经遍历过,把所有遍历过的URL放入历史表。

技术分享

while (todo.size () > 0) { //如果 Todo队列不是空的
  //从Todo队列里面提取URL
  String strUrl = todo.iterator().next();
  //下载URL对应的网页内容
  String content = downloadPageContent(strUrl);
  //把网页内容存储到本地
  //提取网页内容中新发现的URL链接
  HashSet<String> newLinks = retrieveLinks(content, new URL(strUrl));
  //把新发现的链接加入Todo队列
  todo.addAll(newLinks);
  //从Todo队列里删除已经爬过的URL
  todo.remove(strUrl);
  //把从Todo队列里删除的URL添加到Visited集合中
  visited.add(strUrl);
}

 

 

整个互联网是一个大的有向有环图,其中的每个URL相当于图的一个节点,因此,网页遍
历就可以釆用图遍历的算法进行。通常,网络爬虫的遍历策略有三种,广度优先遍历、深度优先
遍历和最佳优先遍历。其中,深度优先遍历由于极有可能使爬虫陷入黑洞,因此,广度优先遍历
和最佳优先遍历就成为了常用的爬虫策略。垂直搜索往往采用定制的遍历方法抓取特定的网站。

一般的爬虫软件,通常都包含以下几个模块。
(1) 保存种子URL和待抓取的URL的数据结构,把网页中发现的新链接放入Frontier中。
(2) 保存已经抓取的URL的数据结构,防止重复抓取。需要快速知道一个URL是否已经
抓取过。

(3) 页面获取模块。
(4) 对已经获取的页面内容的各个部分进行抽取的模块。例如抽取HTML、JavaScript等。
其他可选的模块包括下面5个。
(1) 负责连接前处理模块。
(2) 负责连接后处理模块。
(3) 过滤器模块。HTML中并没有描述链接资源的类型。如果要访问某些类型的资源,往
往通过后缀判断资源的类型。例如,htm往往代表静态网页类型,img往往代表图片。
(4) 负责多线程的模块。多线程同时下载网页。
(5)负责分布式的模块。

 

1.保存种子和爬取出来的URL的数据结构

技术分享

2.保存已经抓取过的URL的数据结构

己经抓取过的URL的规模和待抓取的URL的规模是一个相当的量级。正如我们前面介绍
的TODO表和Visited表。它们唯一的不同是,Visited表会经常被查询,以便确定发现的URL
是否已经处理过。因此,如果Visited表数据结构是一个内存数据结构,可以釆用HashCHashMap
或者HashSet)来存储,如果保存在数据库中,可以对URL列建立索引。

 

爬虫基本结构

标签:dal   str   抓取   javascrip   rip   合作   set   trie   图片   

原文地址:http://www.cnblogs.com/Michael2397/p/7824948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!