网络爬虫(2):存储

简介:

目前我想到的存储方案有两种:单文件单页面存储和单文件多页面存储。

单文件单页面存储就是一个页面存储在一个文件中,文件名称可以使用页面编号doc_id。这种方案查找的时候容易定位,直接使用文件名就可以,缺点是会产生大量琐碎的文件,管理、冗余和查询感觉都不太方便。

单文件多页面存储即一个文件存储多个页面,写满一个文件后,自动开始写下一个。每个文件有一个编号store_file_id,在查找某一个页面的时候,通过页面的编号doc_id,可以找到对应的store_file_id及页面在文件中的位置position,然后就能找个这个页面。每个文件的大小是可以定制的,默认200M一个。一个页面的数据不会分在两个文件中,只会在一个页面写入完成后,才会发生写新文件的操作,所以存储实际的大小会是200M多几十K。

目前采用的就是单文件多页面的存储方式。其中的每个页面又按以下格式存放数据:

  1. doc_id:页面文档编号,unsigned int,该页面的url的md5签名。
  2. timestamp:页面的抓取时间,time_t类型。
  3. is_analyzed:该页面是否已经分析,bool(short)类型。
  4. url_length:该页面url的长度,unsigned int。
  5. url:该页面的url,长度为url_length的char数组。
  6. domain_length:域名的长度,unsigned int,类似url_length。
  7. domain:域名,长度为domain_length的char数组,类似url。
  8. response_length:响应的长度,unsigned int,类似url_length。
  9. response:响应的内容,长度为response_length的char数组,类似url。

存储格式图示如下(单一存储文件):

页面存储

store模块中的主要函数如下:

/*
 * 初始化文件存储,在调用store_page方法前,必须先调用此方法。
 *     @store_path               存储路径
 *     @store_file_max_length    存储文件的最大长度,单位是字节
 */
extern int initial_store(char* store_path, unsigned long store_file_max_length);
/*
 * 关闭文件存储
 */
extern int close_store();
/*
 * 将页面存储到磁盘
 *     @page    要储存的页面
 */
extern int store_page(page* page);
/*
 * 取得下一个未分析的页面
 *     @page   用于存在数据的页面
 *     @return 成功返回0,出错返回-1,没有未分析的页面,返回1
 */
extern int get_page_to_parse(page* page);

initial_store和close_store这对方法用于开始和结束。initial_store会根据给出的store_path自动计算出下一个要写入的文件的编号和位置。close_store负责关闭文件指针,这两个函数在主程序中出现,且只出现一次:initial_store在出程序的开始,close_store在主程序的结束。

store_page和get_page_to_parse这对方法用于写入和读出。store_page将给出的page结构体写入文件,同时负责新存储文件的创建等。get_page_to_parse则负责读取下一个要分析的页面,存储在page指针中。get_page_to_parse还会将这次读取给出的文件在磁盘中标记为已分析。

这里的分析的含义仅指提取页面中的url。

本文转自冬冬博客园博客,原文链接:http://www.cnblogs.com/yuandong/archive/2008/06/24/Web_Spider_Store.html,如需转载请自行联系原作者

相关文章
|
7月前
|
存储 分布式计算 Hadoop
Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
255 3
|
2月前
|
数据采集 存储 数据处理
Python爬虫-数据处理与存储(一)
Python爬虫-数据处理与存储(一)
67 0
|
4月前
|
消息中间件 存储 Serverless
函数计算产品使用问题之怎么访问网络附加存储(NAS)存储模型文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1月前
|
存储 网络协议 安全
软件管理,磁盘存储,文件系统以及网络协议
【11月更文挑战第9天】本文介绍了软件管理、磁盘存储和网络协议等内容。软件管理包括软件生命周期管理和软件包管理,涉及需求分析、设计、实现、测试、发布、维护等阶段,以及软件包的安装、升级和依赖关系处理。磁盘存储部分讲解了磁盘的物理结构、分区与格式化、存储管理技术(如 RAID 和存储虚拟化)。网络协议部分涵盖了分层模型、重要协议(如 HTTP、TCP、IP)及其应用与安全。
|
3月前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
2月前
|
存储 网络协议 数据挖掘
|
7月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
345 2
|
2月前
|
数据采集 存储
爬虫案例—根据四大名著书名抓取并存储为文本文件
爬虫案例—根据四大名著书名抓取并存储为文本文件
33 0
|
2月前
|
SQL 关系型数据库 MySQL
Python爬虫-数据处理与存储(二)
Python爬虫-数据处理与存储(二)
37 0
|
4月前
|
存储 网络协议 搜索推荐
在Linux中,如何配置和管理虚拟机的网络和存储?
在Linux中,如何配置和管理虚拟机的网络和存储?