网络爬虫的系统实现
- 格式:pdf
- 大小:159.41 KB
- 文档页数:4
如何使用ChatGPT进行网络爬虫和信息抽取对话近年来,随着人工智能技术的不断发展,自然语言处理成为了研究热点之一。
ChatGPT作为一种基于深度学习的自然语言处理模型,具备了强大的对话生成能力。
在这篇文章中,我将分享如何利用ChatGPT进行网络爬虫和信息抽取对话,帮助大家更好地应用于实际项目中。
1. 网络爬虫简介网络爬虫是一种自动化获取互联网信息的程序,它可以根据指定的规则和策略,自动从互联网上抓取所需的数据并进行处理。
在使用ChatGPT前,我们首先需要搭建一个网络爬虫系统,以便为ChatGPT提供需要的信息。
2. 数据收集与存储在构建网络爬虫系统之前,我们需要明确我们需要获取的数据是什么,并考虑如何存储这些数据。
可以使用数据库或文本文件来存储从互联网上抓取的数据。
一旦确定了数据存储的方式,我们可以开始实现网络爬虫程序的编写。
3. 网络爬虫实现实现网络爬虫的方法有多种,我们可以选择使用Python编程语言,结合Scrapy等爬虫框架来进行开发。
在编写爬虫程序时,我们需要定义爬取的起始URL,以及提取数据的规则和逻辑。
同时,要注意设置合理的爬取频率和请求间隔,以免对目标网站造成过大的压力。
4. ChatGPT应用在搭建好网络爬虫系统之后,我们就可以开始与ChatGPT进行对话了。
通过预训练好的ChatGPT模型,我们可以实现与机器之间的自然语言交互。
在对话的过程中,我们可以向ChatGPT提供需要的信息,并从ChatGPT的回答中提取我们所需的结果。
5. 对话处理为了更好地处理对话,我们可以引入一些自然语言处理技术。
例如,可以使用分词技术将对话分割成词语,然后使用实体识别技术提取出关键信息。
还可以使用语义分析技术对对话进行理解和推断。
这些技术可以帮助我们更加准确地理解用户的问题,并从中提取出有用的信息。
6. 信息抽取与展示在对话的过程中,ChatGPT回答的内容可能包含我们所需的信息。
通过使用信息抽取技术,我们可以从ChatGPT的回答中解析出我们关心的特定信息,并进行展示。
网络爬虫工作原理1 聚焦爬虫工作原理及关键技术概述网络爬虫是一个自动提取网页的程序,它为搜索引擎从Internet网上下载网页,是搜索引擎的重要组成。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。
然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止,另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:(1) 对抓取目标的描述或定义;(2) 对网页或数据的分析与过滤;(3) 对URL的搜索策略。
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。
而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。
这两个部分的算法又是紧密相关的。
2 抓取目标描述现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。
基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。
根据种子样本获取方式可分为:(1)预先给定的初始抓取种子样本;(2)预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;(3)通过用户行为确定的抓取目标样例,分为:a) 用户浏览过程中显示标注的抓取样本;b) 通过用户日志挖掘得到访问模式及相关样本。
其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。
现有的聚焦爬虫对抓取目标的描述或定义可以分为基于目标网页特征,基于目标数据模式和基于领域概念三种。
摘要网络爬虫是一种自动搜集互联网信息的程序。
通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息等。
本文通过JAVA实现了一个基于广度优先算法的多线程爬虫程序。
本论文阐述了网络爬虫实现中一些主要问题:为何使用广度优先的爬行策略,以及如何实现广度优先爬行;为何要使用多线程,以及如何实现多线程;系统实现过程中的数据存储;网页信息解析等。
通过实现这一爬虫程序,可以搜集某一站点的URLs,并将搜集到的URLs 存入数据库。
【关键字】网络爬虫;JAVA;广度优先;多线程。
ABSTRACTSPIDER is a program which can auto collect informations from internet. SPIDER can collect data for search engines, also can be a Directional information collector, collects specifically informations from some web sites, such as HR informations, this paper, use JAVA implements a breadth-first algorithm multi-thread SPDIER. This paper expatiates some major problems of SPIDER: why to use breadth-first crawling strategy, and collect URLs from one web site, and store URLs into database.【KEY WORD】SPIDER; JA V A; Breadth First Search; multi-threads.目录第一章引言 (1)第二章相关技术介绍 (2)2.1JAVA线程 (2)2.1.1 线程概述 (2)2.1.2 JAVA线程模型 (2)2.1.3 创建线程 (3)2.1.4 JAVA中的线程的生命周期 (4)2.1.5 JAVA线程的结束方式 (4)2.1.6 多线程同步 (5)2.2URL消重 (5)2.2.1 URL消重的意义 (5)2.2.2 网络爬虫URL去重储存库设计 (5)2.2.3 LRU算法实现URL消重 (7)2.3URL类访问网络 (8)2.4爬行策略浅析 (8)2.4.1宽度或深度优先搜索策略 (8)2.4.2 聚焦搜索策略 (9)2.4.3基于内容评价的搜索策略 (9)2.4.4 基于链接结构评价的搜索策略 (10)2.4.5 基于巩固学习的聚焦搜索 (11)2.4.6 基于语境图的聚焦搜索 (11)第三章系统需求分析及模块设计 (13)3.1系统需求分析 (13)3.2SPIDER体系结构 (13)3.3各主要功能模块(类)设计 (14)3.4SPIDER工作过程 (14)第四章系统分析与设计 (16)4.1SPIDER构造分析 (16)4.2爬行策略分析 (17)4.3URL抽取,解析和保存 (18)4.3.1 URL抽取 (18)4.3.2 URL解析 (19)4.3.3 URL保存 (19)第五章系统实现 (21)5.1实现工具 (21)5.2爬虫工作 (21)5.3URL解析 (22)5.4URL队列管理 (24)5.4.1 URL消重处理 (24)5.4.2 URL等待队列维护 (26)5.4.3 数据库设计 (27)第六章系统测试 (29)第七章结论 (32)参考文献 (33)致谢 (34)外文资料原文 (35)译文 (51)第一章引言随着互联网的飞速发展,网络上的信息呈爆炸式增长。
网络爬虫系统的设计与实现的开题报告一、选题背景随着大数据时代的到来,互联网上的信息呈现爆炸式增长,人们实现对大数据的分析和利用越来越需要网络爬虫系统的支持。
虽然现在已经有了很多开源的网络爬虫框架,比如Scrapy、Crawler4j等,但是它们的定制化能力并不强,很难满足实际需求。
因此,开发一个高度可定制的网络爬虫系统,能够满足不同用户的需求,成为了当前的一个热门研究领域。
二、研究意义网络爬虫系统是实现大数据抓取、信息采集和数据挖掘的重要工具。
在信息化的社会环境下,网络爬虫系统具有广泛的应用前景,其主要作用有:1.为大数据分析提供可靠数据源2.实现信息的自动采集与爬取3.促进互联网信息的共享与利用三、研究内容本课题主要研究高度可定制的网络爬虫系统的设计与实现,包括以下内容:1.分析现有网络爬虫系统的不足之处2.设计高度可定制的网络爬虫系统架构3.利用Python实现网络爬虫系统4.设计并实现用户自定义的抓取策略5.针对抓取效率和抓取质量进行优化改进四、研究方法本研究采用自下而上的设计方法,从系统的组成部分和运行过程入手,实现系统的高度可定制性和抓取效率。
具体研究方法包括:1.分析现有网络爬虫系统的不足之处,从用户需求和系统架构两个方面出发:2.设计高度可定制的网络爬虫系统架构,包括数据抓取、处理和存储三个部分:3.利用Python实现网络爬虫系统,为用户提供友好的使用界面:4.设计并实现用户自定义的抓取策略,增强系统的可定制性:5.针对抓取效率和抓取质量进行优化改进,提高系统的性能:五、预期成果本研究的预期成果是设计并实现一个高度可定制的网络爬虫系统,主要包括以下几个方面:1.系统具有可扩展性和高效性,满足不同应用场景下的需求2.用户可以自定义抓取策略,灵活选择需要抓取的数据源3.系统对于不同类型的网页能够提供优化的抓取效率和抓取质量4.系统具有良好的用户使用体验,对用户友好六、研究进度安排1.完成研究背景分析、选题意义和参考文献综述:3周2.研究现有网络爬虫系统的不足之处,设计高度可定制的网络爬虫系统架构:2周3.利用Python实现网络爬虫系统,并提供友好的使用界面:3周4.设计并实现用户自定义的抓取策略:2周5.针对抓取效率和抓取质量进行优化改进:2周7、结论本研究的目标是设计并实现一个高度可定制的网络爬虫系统,系统具有高度的可扩展性和高效性,满足不同应用场景下的需求。
基于爬虫技术的征信系统实现方案作者:余洋军来源:《科学与财富》2017年第24期摘要:建立大数据征信系统,能消除信息不对称,提供更快、更精准的信用决策。
可以通过对实时交易数据的大数据分析,分析用户是否有异常贷款、借新还旧、信用恶化等实时评估并进行预警。
根据人口属性、社会交往、行为偏好等信息构建用户消费画像。
为互金、大数据、支付、银行、保险、电商等各领域提供决策依据。
本文将介绍基于爬虫技术如何在征信系统中的应用和实现。
关键词:社会信用体系;信用平台系统;网络爬虫一、征信系统的现状与发展(一)社会信用体系建设的意义社会信用体系是一个庞大的系统,主要涉及三个方面:一是规范、约束信用行为的法律体系;二是促进企业自觉履行承诺的诚信体系;三是帮助债权方判别交易对象信用状况、违约风险、降低信用交易成本的征信体系。
建立和完善社会信用体系是我国社会主义市场经济不断走向成熟的重要标志之一。
信用是市场经济的通行证。
现代市场经济是建立在法制基础上的信用经济。
没有信用,就没有秩序,市场经济就不能健康发展。
在市场经济尚不完善的我国,虽然实现了经济的腾飞,但是相应的社会信用体系建设依然滞后。
当前,信用状况差是我国社会主义市场经济发展的一个薄弱环节,已成为影响和制约经济发展的突出因素。
由于缺乏足够的信用,直接导致不少企业陷入危机。
面对目前这种情况,建立健全现代市场经济的社会信用体系尤为迫切。
(二)征信系统现状近些年随着消费金融的不断深入发展,征信行业逐步得到大家的重视。
目前国内征信只是初步建立了完整产业体系,其在各个环节尚存在不同问题。
相比美国成熟征信市场来说,目前中国仍处于数据源争夺战中,各家征信机构仍将数据资源视为核心竞争力。
目前国内与“征信服务”相关的公司有2000多家,其中完成备案的企业征信机构约135家左右。
相对于企业征信较容易获取牌照,央行尚未完全放开个人征信牌照,目前仅以芝麻信用、前海征信、腾讯征信、拉卡拉征信、中智诚征信、中诚信征信、鹏元征信和华道征信等八家作为个人征信试点机构。
(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号 (43)申请公布日 (21)申请号 201610466951.7(22)申请日 2016.06.22(71)申请人 广东亿迅科技有限公司地址 510635 广东省广州市天河区中山大道109号1号楼13层(72)发明人 余虎 潘嘉朋 张郭强 徐少强 (51)Int.Cl.G06F 17/30(2006.01)(54)发明名称一种分布式爬虫系统及其实现方法(57)摘要本发明公开了一种分布式爬虫系统,该系统包括页面采集模块、目标url采集模块、调度监控模块和存储目标url队列模块。
该系统通过增加了一个调度节点,把爬取逻辑和监控逻辑分离,并对全局调控,一旦发现主爬虫节点出现异常,马上分配另一新节点取代为主节点。
另外,本发明把缓存目标url队列改为持久化存储目标url队列,同时增加一个已处理url队列,对于所有的爬取需求,url统一存放。
此外,本发明还提供了一种分布式爬虫系统的实现方法。
通过本发明能够适时地调控,增强系统的健壮性,同时也节省资源,增强爬虫的效率。
权利要求书1页 说明书4页 附图3页CN 106021608 A 2016.10.12C N 106021608A1.一种分布式爬虫系统,其特征在于,所述系统包括:页面采集模块、目标url采集模块、调度监控模块和存储目标url队列模块;页面采集模块,其通过从目标url队列提取信息,提取成功后目标url插入已处理url队列,采集到的信息存储到mongodb集群;目标url采集模块,通过主爬虫获取符合已定义规则的url,并把该url压入目标url队列;调度监控模块,贯穿整个系统,与每个模块都直接联系,并监控爬虫状态信息和集群状态信息;存储目标url队列模块,包括两个队列:目标url队列和已处理url队列。
2.根据权利要求1所述的系统,其特征在于,所述调度监控模块中的调度节点,把爬取逻辑和监控逻辑分离,并对全局调控,一定发现主爬虫节点出现异常,马上分配另一新节点取代为主节点。
基于网络爬虫的城市天气服务系统设计与实现基于网络爬虫的城市天气服务系统设计与实现摘要:随着人们对天气信息的需求不断增加,天气服务系统也逐渐成为城市生活中不可或缺的一部分。
本文基于网络爬虫技术,设计和实现了一套城市天气服务系统。
系统通过爬取多个天气网站的数据,提供准确、实时的天气信息,并具备多种功能,如天气预报、天气趋势分析、天气预警等,满足用户对天气信息的各种需求。
1. 引言随着城市化进程的不断加快,人们对天气信息的需求也越来越高。
无论是出门工作、出行旅游还是进行户外活动,都需要提前了解天气情况以做出合理安排。
传统的天气预报方式虽然可以提供基本的天气信息,但往往更新速度较慢,精确度不够高。
因此,设计一套快速、准确的城市天气服务系统势在必行。
2. 系统设计2.1 系统架构本系统采用微服务架构,包括爬取模块、数据处理模块、存储模块和前端展示模块。
爬取模块负责从多个天气网站上爬取天气数据,并进行数据清洗和整理。
数据处理模块负责对爬取得到的数据进行分析和处理,生成可视化的天气趋势分析和预警信息。
存储模块用于存储处理后的数据,以便提供快速的查询和展示。
前端展示模块负责将处理好的数据以直观、友好的方式呈现给用户。
2.2 爬取模块设计爬取模块使用网络爬虫技术,选择多个权威的天气网站作为数据源。
通过发送HTTP请求,获取网页数据,并使用正则表达式、XPath等方式提取所需的天气信息。
为了实现数据的实时更新,系统设定了定时任务,定期爬取相关网站上的天气数据,并根据需要的频率进行数据更新和清洗。
2.3 数据处理模块设计数据处理模块接收爬取模块传输的原始数据,并进行分析和处理。
通过分析历史数据,可以得到天气的趋势信息,如温度变化、降水量等。
同时,根据设定的预警规则,对特定天气现象进行预警,如台风、暴雨等。
处理后的数据可以存储到数据库中,以备查询和展示使用。
2.4 存储模块设计存储模块采用关系型数据库,将处理后的数据以表的形式保存。
爬虫项目计划书说明书一、项目概述随着网络信息的快速发展和大数据的兴起,网络爬虫技术越来越受到人们的关注和重视。
网络爬虫是一种程序,用于自动抓取网页上的信息并进行分析处理,为用户提供更加准确和有效的数据服务。
本项目旨在利用网络爬虫技术,构建一套高效、稳定、可靠的爬虫系统,用于抓取目标网站上的相关信息,为用户提供定制化的数据服务。
二、项目目标1. 构建一套高效稳定的爬虫系统,实现自动抓取目标网站上的相关信息。
2. 为用户提供定制化的数据服务,满足不同用户的需求。
3. 提升数据处理和分析的效率,为用户提供更加准确和有价值的数据。
4. 不断优化和改进爬虫系统,提高系统的性能和用户体验。
三、项目组成和功能1. 网络爬虫模块:负责抓取目标网站上的相关信息,包括文本、图片、视频等。
2. 数据处理模块:负责对抓取的数据进行处理和分析,提取关键信息并存储到数据库中。
3. 数据展示模块:负责展示处理后的数据,为用户提供可视化的数据分析和报告。
4. 系统管理模块:负责管理和维护整个爬虫系统,监控系统运行状态和日志记录。
四、项目实施计划1. 确定项目需求:明确项目目标和功能,确定所需技术和资源。
2. 系统设计和架构:根据项目需求,设计并搭建实现网络爬虫系统的架构。
3. 开发和测试:开发各个模块,并进行系统测试和调试。
4. 上线运行:将爬虫系统上线运行,并进行数据收集和分析。
5. 不断优化:根据用户反馈和系统运行情况,不断优化和改进系统性能。
6. 持续维护:定期对系统进行维护和升级,确保系统稳定运行。
五、项目风险分析1. 技术风险:由于网络爬虫技术较为复杂,存在一定的技术难点和挑战。
2. 安全风险:网站可能采取一些防爬虫措施,导致爬虫系统无法正常工作。
3. 法律风险:在抓取网站数据时需遵守相关法律法规,否则可能面临法律责任。
4. 数据风险:数据处理和存储过程中可能出现错误或丢失数据,影响系统的稳定性。
六、项目收益预期1. 提升数据处理和分析的效率,为用户提供更加准确和有价值的数据服务。
简述网络爬虫的系统实现
网络爬虫常常被人所忽略,特别是和搜索引擎的光环相比,它似乎有些暗淡无光。
我很少看见有详细介绍爬虫实现的文章或者文档。
然而,爬虫其实是非常重要的一个系统,特别是在今天这个数据为王的时代。
如果你是一个刚刚开始的公司或者项目,没有任何原始的数据积累,那么通过爬虫去Internet上找到那些有价值的数据再进行数据的清洗和整理,是一个可以快速得到数据的重要手段。
本文侧重于爬虫的系统设计和实现的部分细节,内容来源于两方面,一是我这一个多月做爬虫的心得体会,但我做的爬虫规模不至于太大,对于性能的要求达不到诸如百度那么高的要求,第二则是来源于阅读的几篇文献。
我找到的大部分关于爬虫的系统方面的文献都是2000年左右的,此后寥寥无几,说明关于爬虫的系统设计在10年前已经基本解决了(2000年不就是Baidu刚开始的时候么,说不定它家的爬虫也参考了这些文章^-^)。
此外,既然本文侧重于系统方面的问题,那么某些内容就不会涉及,比如如何抓取那些隐藏的web数据,如何抓取ajax的页面,如何动态调整抓取频率等等。
正文
一个正规的,完整的网络爬虫其实是一个很复杂的系统:首先,它是一个海量数据处理系统,因为它所要面对的是整个互联网的网页,即便是一个小型的,垂直类的爬虫,一般也需要抓取上十亿或者上百亿的网页;其次,它也是一个对性能要求很好的系统,可能需要同时下载成千上万的网页,快速的提取网页中的url,对海量的url进行去重,等等;最后,它确实是一个不面向终端用户的系统,所以,虽然也很需要稳定性,但偶然的当机并不会是灾难,而且,不会出现类似访问量激增这样的情况,同时,如果短暂的时间内出现性能的下滑也不算是个问题,从这一点来看,爬虫的系统设计在某些部分又变得简单了许多。
上图是一个爬虫的系统框架,它基本上包括了一个爬虫系统所需要的所有模块。
任何一个爬虫系统的设计图,会发现都有一个环路,这个环代表着爬虫大致的工作流程:根据URL将对应的网页下载下来,然后提取出网页中包含的URL,再根据这些新的URL 下载对应的网页,周而复始。
爬虫系统的子模块都位于这个环路中,并完成某项特定的功能。
这些子模块一般包括:
Fetcher:用于根据url下载对应的网页;
DNS Resolver:DNS的解析;
Content Seen:网页内容的去重;
Extractor:提取网页中的url或者其它的一些内容;
URL Filter:过滤掉不需要下载的url;
URL Seen:url的去重;
URL Set:存储所有的url;
URL Frontier:类似调度器,决定接下来哪些下载哪些url对应的网页;
Fetcher和DNS Resolver
这两个模块是两个非常简单的独立的服务:DNS Resolver负责域名的解析;Fetcher的输入是域名解析后的url,返回的则是该url对应的网页内容。
对于任何一次网页的抓取,它都需要调用这两个模块。
对一般的爬虫,两个模块可以做得非常的简单,甚至合并到一起。
但是对于性能要求很高的系统,它们可能成为潜在的性能瓶颈。
主要原因是无论是域名解析还是抓取,都是很耗时的工作。
比如抓取网页,一般的延迟都在百毫秒级别,如果遇上慢的网站,可能要几秒甚至十几秒,这导致工作线程会长时间的处于阻塞等待的状态。
如果希望Fetcher能够达到每秒几千个网页甚至更高的下载,就需要启动大量的工作线程。
因此,对于性能要求高的爬虫系统,一般会采用epoll或者类似的技术将两个模块改成异步机制。
另外,对于DNS的解析结果也会缓存下来,大大降低了DNS解析的操作。
Content Seen
Internet上的一些站点常常存在着镜像网站(mirror),即两个网站的内容一样但网页对应的域名不同。
这样会导致对同一份网页爬虫重复抓取多次。
为了避免这种情况,对于每一份抓取到的网页,它首先需要进入Content Seen模块。
该模块会判断网页的内容是否和已下载过的某个网页的内容一致,如果一致,则该网页不会再被送去进行下一步的处理。
这样的做法能够显著的降低爬虫需要下载的网页数。
至于如果判断两个网页的内容是否一致,一般的思路是这样的:并不会去直接比较两个网页的内容,而是将网页的内容经过计算生成FingerPrint(指纹),通常FingerPrint是一个固定长度的字符串,要比网页的正文短很多。
如果两个网页的FingerPrint一样,则认为它们内容完全相同。
Extractor和Url Filter
Extractor的工作是从下载的网页中将它包含的所有url提取出来。
这是个细致的工作,你需要考虑到所有可能的url的样式,比如网页中常常会包含相对路径的url,提取的时候需要将它转换成绝对路径。
Url Filter则是对提取出来的url再进行一次筛选。
不同的应用筛选的标准是不一样的,比如对于baidu/google的搜索,一般不进行筛选,但是对于垂直搜索或者定向抓取的应用,那么它可能只需要满足某个条件的url,比如不需要图片的url,比如只需要某个特定网站的url 等等。
Url Filter是一个和应用密切相关的模块。
Url Seen
Url Seen用来做url去重。
关于url去重之前已经写过一篇blog,这里就不再详谈了。
对于一个大的爬虫系统,它可能已经有百亿或者千亿的url,新来一个url如何能快速的判断url是否已经出现过非常关键。
因为大的爬虫系统可能一秒钟就会下载几千个网页,一个网页一般能够抽取出几十个url,而每个url都需要执行去重操作,可想每秒需要执行大量的去重操作。
因此Url Seen是整个爬虫系统中非常有技术含量的一个部分。
(Content Seen其实也存在这个问题)
Url Set
当url经过前面的一系列处理后就会被放入到Url Set中等待被调度抓取。
因为url的数量很大,所以只有一小部分可能被放在内存中,而大部分则会写入到硬盘。
一般Url Set的实现就是一些文件或者是数据库。
URL Frontier
Frontier(为什么叫这个名字我也不清楚)之所以放在最后,是因为它可以说是整个爬虫系统的引擎和驱动,组织和调用其它的模块。
当爬虫启动的时候,Froniter内部会有一些种子url,它先将种子url送入Fetcher进行抓取,然后将抓取下来的网页送入Extractor提取新的url,再将新的url去重后放入到Url Set中;而当Froniter内部的url都已经抓取完毕后,它又从Url Set中提取那些新的没有被抓取过的url,周而复始。
Frontier的调度实现有很多种,这里只介绍最常见的一种实现方法。
在此之前,需要先解释一点,尽管在介绍Fetcher的时候我们说,好的Fetcher每秒能够下载百千个网页,但是对于某个特定的目标网站,比如,爬虫系统对它的抓取是非常慢速的,十几秒才会抓取一次,这是为了保证目标网站不至于被爬虫给抓垮。
为了做到这一点,Frontier内部对于每个域名有一个对应的FIFO队列,这个队列保存了该域名下的url。
Frontier每次都会从某个队列中拿出一个url进行抓取。
队列会保存上一次被Frontier调用的时间,如果该时间距离现在已经超过了一定值,那么该队列才可以再次被调
用。
Frontier内部同时可能拥有成千上万个这样的队列,它会轮询的获取一个可以被调用的队列,然后从该队列中pull一个url进行抓取。
而一旦所有队列中的url被消耗到一定程度,Frontier又会从Url Set中提取一批新的url放入对应的队列。
分布式
当单机版的爬虫性能不能满足要求的时候,就应该考虑用多台机器组成分布式的爬虫系统。
分布式的爬虫架构其实要比想象的简单得多,一个朴素的做法是:假设有N台机器,每台机器上有运行了一个完整的爬虫系统,每台机器的爬虫在从Extractor模块获得新的url之后,根据url的域名进行hash然后取模N得到结果n,然后该url会被放入第n台机器的Url Set中。
这样,不同网站的url会被放在不同的机器上处理。
以上就是一个完整爬虫的系统实现。
当然,由于篇幅有限回避了一些细节。
比如爬虫抓取每个网站前需要先读取该网站的robots.txt来判断该网站是否允许被抓取(前段时间京东就在robots.txt中将一淘的爬虫屏蔽了,需要说明的是,robots.txt只是一个业内约定,它并不能从技术上强制的拒绝爬虫的抓取);再比如,一些网站提供了sitemap,这样可以直接从sitemap上获取该网站的所有url;等等。
Reference
Mercator: A scalable, extensible Web crawler, 1999
Design and Implementation of a High-Performance Distributed Web Crawler, 2002。