分布式网络爬虫关键技术分析与实现

合集下载

分布式网络爬虫关键技术分析与实现

分布式网络爬虫关键技术分析与实现

分布式网络爬虫关键技术分析与实现——分布式网络爬虫体系结构设计一、研究所属范围分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行。

由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫。

这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。

根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类:1、基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高速的网络连接相互通信。

这些爬虫通过同一个网络去访问外部互联网,下载网页,所有的网络负载都集中在他们所在的那个局域网的出口上。

由于局域网的带宽较高,爬虫之间的通信的效率能够得到保证;但是网络出口的总带宽上限是固定的,爬虫的数量会受到局域网出口带宽的限制。

2、基于广域网分布式网络爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网络位置),我们称这种并行爬行器为分布式爬行器。

例如,分布式爬行器的爬虫可能位于中国,日本,和美国,分别负责下载这三地的网页;或者位于CHINANET,CERNET,CEINET,分别负责下载这三个网络的中的网页。

分布式爬行器的优势在于可以子在一定程度上分散网络流量,减小网络出口的负载。

如果爬虫分布在不同的地理位置(或网络位置),需要间隔多长时间进行一次相互通信就成为了一个值得考虑的问题。

爬虫之间的通讯带宽可能是有限的,通常需要通过互联网进行通信。

在实际应用中,基于局域网分布式网络爬虫应用的更广一些,而基于广域网的爬虫由于实现复杂,设计和实现成本过高,一般只有实力雄厚和采集任务较重的大公司才会使用这种爬虫。

本论文所设计的爬虫就是基于局域网分布式网络爬虫。

二、分布式网络爬虫整体分析分布式网络爬虫的整体设计重点应该在于爬虫如何进行通信。

目前分布式网络爬虫按通信方式不同分布式网路爬虫可以分为主从模式、自治模式与混合模式三种。

Scrapy框架中的分布式爬虫实现

Scrapy框架中的分布式爬虫实现

Scrapy框架中的分布式爬虫实现随着互联网的发展,数据已经成为了一种重要的资源。

为了获取对应的数据,并对其进行进一步的分析和处理,网络爬虫已经成为了一个必不可少的工具。

Scrapy框架是一个Python爬虫框架,旨在通过简化爬虫的开发过程,使开发者可以更加专注于业务的实现。

本篇文章将着重介绍Scrapy框架中的分布式爬虫实现,为读者提供更多的技术理解和实践指导。

一、Scrapy框架简介Scrapy框架是由纽约时报公司开发的Python爬虫框架,主要用于数据抓取、数据处理和数据存储等工作。

它具有高度的可定制化和可扩展性,能够满足不同场景下的需求。

与其他爬虫框架相比,Scrapy最大的优势在于其基于Twisted异步网络框架的特性,可以实现高效的爬虫操作。

Scrapy框架由以下几个组件构成:1.引擎(Engine):负责控制各个组件之间的协作和调度。

2.调度器(Scheduler):负责接收引擎发送过来的请求,并安排请求的优化顺序。

3.下载器(Downloader):负责将请求的网页内容获取并下载到本地。

4.解析器(Spiders):负责解析下载器下载下来的网页内容。

5.项目管道(Pipeline):负责处理解析器解析出的数据,包括存储、清洗、去重等。

6.下载器中间件(Downloader Middleware):负责控制下载器的行为,可以设置代理、用户代理等。

7.解析器中间件(Spider Middleware):负责控制解析器的行为,可以对解析出的数据进行处理。

二、在某些场景下,单机爬虫已经无法满足需求。

针对这种情况,Scrapy框架提供了分布式爬虫实现。

通过分布式爬虫,可以将数据获取的效率提升到一个新的高度。

Scrapy框架中的分布式爬虫实现主要根据调度器来进行改进。

调度器是Scrapy框架中的一个核心组件,其主要任务是将需要抓取的URL添加到队列中,然后按照优先级逐一从队列中获取URL,并将其交给下载器进行处理。

分布式聚焦网络爬虫系统的设计与实现的开题报告

分布式聚焦网络爬虫系统的设计与实现的开题报告

分布式聚焦网络爬虫系统的设计与实现的开题报告一、选题背景随着互联网信息的爆炸式增长,信息检索和挖掘技术的需求也越来越迫切。

在大量的数据来源中,网络编程不仅是面对数据源最常见的方式,也是最有效的方式之一。

因此,网络爬虫技术应运而生,具有自动化地抓取、处理、存储网络上的大量数据的特点。

同时,随着云计算、虚拟化、分布式系统等大数据相关技术的发展,将数据爬取、处理任务分布到多台计算机上处理,也成为提高爬虫系统性能的关键。

二、研究目的本文旨在研究并实现一个基于分布式聚焦网络爬虫技术设计的Web爬虫系统,该系统可实现爬取全网或指定部分网址内容,解析HTML、XML等相关结构体文档,对爬取到的数据进行抽取、清洗、存储,并以分布式处理数据的方式来使其更高效和灵活。

三、研究内容1. 针对目标站点和数据抓取需求进行系统需求分析。

2. 设计并实现分布式聚焦网络爬虫系统的整体架构。

3. 实现分布式任务调度与管理。

4. 实现数据爬取、解析、抽取、清洗,并存储相关数据。

5. 解决分布式聚焦网络爬虫系统中的反爬机制问题。

四、预期成果1. 具有高效灵活的爬虫系统,具有高效的采集、抽取、清洗、存储能力,并具有良好的可拓展性和可维护性。

2. 支持自适应反爬策略,能够自行识别并规避页面反爬虫,保证系统的正常运行。

五、研究意义1. 提高数据采集、抽取、清洗、存储的效率和精确度,同时降低了人力成本和时间成本。

2. 提高Web应用程序性能和用户体验,利于商业应用的发展。

3. 对分布式计算、数据挖掘和大数据分析等领域的研究具有重要的借鉴作用。

四、研究方法1. 整理相关技术文献,对分布式聚焦网络爬虫系统的技术架构和实现方法进行综合研究。

2. 使用Python语言开发实验平台,对系统进行实现与测试。

3. 对系统进行性能测试,并根据测试结果进行优化和改进。

五、进度安排1. 第一阶段:文献综述、需求分析、系统设计和技术选型。

2. 第二阶段:基于Python语言开发分布式聚焦网络爬虫系统的实验平台,完成基础功能测试。

Web搜索引擎中的分布式爬虫系统设计与实现

Web搜索引擎中的分布式爬虫系统设计与实现

Web搜索引擎中的分布式爬虫系统设计与实现简介:Web搜索引擎是我们日常互联网使用的重要工具,而一个优秀的搜索引擎离不开高效可靠的分布式爬虫系统。

本文将介绍分布式爬虫系统的设计与实现,重点关注系统的架构、爬虫调度算法、数据抓取和处理、容错机制等方面。

一、系统架构分布式爬虫系统的核心是一个分布式网络爬虫集群,其中每个节点都有自己的任务调度器、爬虫和存储模块。

系统架构分为以下几个关键组件:1. 主节点(Master):负责整个爬虫系统的任务调度和资源分配。

主节点会监控每个子节点的状态,根据实时情况动态调整任务分配策略,并保存全局状态信息。

2. 子节点(Slave):负责实际的数据抓取和处理工作。

子节点通过与主节点的通信获取任务分配,定期向主节点提交抓取结果和状态信息。

3. URL调度器(URL Scheduler):负责管理爬虫系统中待抓取的URL队列。

URL调度器负责URL去重、控制爬虫抓取速度、调度URL分发给子节点等关键任务。

4. 爬虫(Crawler):负责从互联网中抓取网页数据。

爬虫根据URL调度器的指令,从互联网中获取网页,提取其中的链接和信息,并将结果发送给数据处理模块。

5. 数据处理(Data Processor):负责对爬虫抓取的数据进行清洗、解析和存储。

数据处理模块根据需求进行过滤、提取、转换和归档,将数据存储到相应的数据库或文件系统中。

二、爬虫调度算法针对大规模的互联网数据抓取,高效地调度和分配爬虫任务是非常重要的。

以下是一些常用的爬虫调度算法:1. 广度优先算法(BFS):按照页面的深度进行任务调度。

从种子URL开始逐层抓取,直到达到最大深度。

广度优先算法适合于整站抓取和数据完整性的需求。

2. 优先级队列算法(Priority Queue):根据每个URL的优先级进行任务分配。

通过指定URL的相关属性(如权重、时效性等),可以根据需求对不同URL进行优先级排列。

3. 随机算法(Random):随机选择待抓取的URL。

基于scrapy的分布式爬虫系统的设计与实现

基于scrapy的分布式爬虫系统的设计与实现

【基于scrapy的分布式爬虫系统的设计与实现】1. 介绍在当今信息爆炸的时代,互联网上的数据量正呈现爆发式增长。

而要从这些海量数据中获取有价值的信息,爬虫成为了不可或缺的工具。

而基于scrapy的分布式爬虫系统的设计与实现,则是针对大规模数据采集和处理的需求而提出的解决方案。

2. 分布式爬虫系统的优势传统的单机爬虫系统存在着性能瓶颈和可扩展性差的问题。

而使用分布式爬虫系统,可以将任务分布到多台机器上,提高了爬取的效率和稳定性。

也更加适合应对大规模数据的采集和处理。

3. 基于scrapy的设计与实现scrapy是一个功能强大、灵活且可扩展的爬虫框架,提供了高效的数据抓取和处理功能。

而基于scrapy的分布式爬虫系统,则是在其基础上进行扩展和优化,实现了更高效的数据采集和处理。

3.1. 架构设计基于scrapy的分布式爬虫系统通常由调度器、爬虫节点、数据存储和任务队列等组件构成。

其中,调度器负责管理任务分发和调度,爬虫节点负责实际的数据抓取,数据存储负责将抓取的数据进行存储,任务队列则用于任务的管理和分发。

3.2. 通信机制在分布式爬虫系统中,不同组件之间需要进行高效的通信,以确保任务的顺利执行。

基于scrapy的分布式爬虫系统通常会使用消息队列来实现组件之间的通信,提高了系统的稳定性和可扩展性。

3.3. 数据处理在大规模数据采集的情况下,数据处理也显得尤为重要。

基于scrapy 的分布式爬虫系统通常会配合使用分布式存储和处理框架,如Hadoop和Spark,来进行数据的处理和分析。

4. 个人观点基于scrapy的分布式爬虫系统的设计与实现,对于大规模数据采集和处理具有重要意义。

通过合理的架构设计和高效的通信机制,可以提高爬取的效率和稳定性,同时也更加适合应对海量数据的处理需求。

5. 总结基于scrapy的分布式爬虫系统的设计与实现,是针对大规模数据采集和处理的需求而提出的解决方案。

通过合理的架构设计、高效的通信机制和适当的数据处理,可以实现高效的数据采集和处理,从而为数据挖掘和分析提供可靠的支持。

分布式网络爬虫技术研究与实现

分布式网络爬虫技术研究与实现

分布式网络爬虫技术研究与实现随着互联网的快速发展,网络爬虫作为一种自动获取网页信息的工具,越来越受到人们的。

传统的单线程爬虫方式已经无法满足大规模网页数据的获取需求。

因此,分布式网络爬虫技术应运而生,其通过将任务分配给多个节点并行处理,大大提高了网页的爬取效率。

本文将对分布式网络爬虫技术的研究与实现进行探讨。

首先需要确定需要爬取的网站和页面,根据需求制定合理的爬取策略。

通过网络爬虫解析目标网站的页面结构,提取出需要的数据。

对于不同的网站,可能需要采用不同的解析方法。

例如,可以使用正则表达式、 XPath、BeautifuISoup等解析HTML页面,对于需要登录才能访问的网站,则需要进行模拟登录操作。

根据爬取任务的需求,将爬虫任务分配到不同的节点上进行处理。

可以借助Docker等工具实现快速部署,提高节点管理的效率。

将爬取到的数据进行清洗、去重、存储等操作。

常用的数据存储方式包括关系型数据库(例如MySQL、PostgreSQL)和非关系型数据库(例如MongoDB、Cassandra)。

为了避免部分节点过载,需要实现负载均衡策略,将任务分配给多个节点进行处理。

可以使用轮询、随机、Hash等算法实现负载均衡。

为了提高任务处理的效率,需要合理地安排任务处理的顺序和优先级。

可以使用基于优先级队列(例如Python中的heapq模块)或遗传算法等实现任务调度。

为了避免重复抓取相同的页面和数据,需要在节点之间建立去重机制。

可以使用哈希表、布隆过滤器等算法实现数据去重。

异常处理遇到异常情况时,需要进行容错处理,避免因为个别节点的问题导致整个爬虫任务的失败。

可以使用try-except语句或Python 中的异常处理机制进行异常处理。

针对目标网站可能采取的反爬虫策略,如限制IP访问频率、检测和封锁异常行为等,研究相应的应对措施,如模拟人类访问行为、使用代理IP等,以提高分布式网络爬虫的鲁棒性和可靠性。

在分布式网络爬虫中引入多线程并行处理技术,可以进一步提高网页的爬取效率。

基于Hadoop的分布式爬虫及其实现

基于Hadoop的分布式爬虫及其实现

基于Hadoop的分布式爬虫及其实现引言随着互联网的快速发展和信息的爆炸式增长,大数据时代已经来临。

海量的数据涌入网络,并形成了一个巨大的信息资源库。

如何有效地从这个海洋中提取有价值的信息,成为了当今互联网领域面临的重要挑战之一。

为了应对这一挑战,分布式爬虫技术应运而生。

本文将介绍基于Hadoop的分布式爬虫的实现过程及其优势。

一、分布式爬虫的背景与意义1.1 现有的爬虫技术传统的爬虫技术主要是基于单机环境下的串行爬虫,即一个爬虫程序在一个机器上运行,通过遍历链接、下载网页并解析的方式进行信息抓取。

然而,在处理大规模的数据量时,单机环境面临着许多挑战,如性能瓶颈、系统崩溃等。

1.2 分布式爬虫的优势与应用分布式爬虫依赖于分布式计算框架,如Hadoop,将爬取任务进行拆分,通过多个爬虫节点并行执行,大大提高了爬取效率。

同时,分布式爬虫还能够充分利用多个计算节点的存储资源,提高数据的采集速度和处理能力。

因此,分布式爬虫在大规模数据挖掘、搜索引擎优化等领域具有广泛的应用前景。

二、基于Hadoop的分布式爬虫的实现步骤2.1 爬虫任务的拆解与调度在分布式爬虫中,首先需要将爬取任务进行拆分,分配给多个爬虫节点。

如何进行任务的拆解与调度是整个分布式爬虫实现的重要环节。

Hadoop的MapReduce框架提供了良好的任务调度机制,可以将爬取任务拆解成独立的Map任务,再通过Reduce任务进行合并和处理。

2.2 爬虫节点的配置与管理在分布式爬虫中,每个爬虫节点都需要配置相应的设备和环境。

常见的配置包括网络代理、数据存储路径、爬取深度等。

此外,还需要对爬虫节点进行管理和监控,确保节点的正常工作和性能优化。

2.3 数据的采集与清洗数据的采集是分布式爬虫的核心步骤之一。

在分布式爬虫中,不同的爬虫节点负责采集不同的数据片段,并将采集结果通过消息队列等方式传递给中心节点。

中心节点进行数据的合并和清洗,去除重复数据和无效信息,得到最终的爬取结果。

基于Hadoop的分布式爬虫及其实现

基于Hadoop的分布式爬虫及其实现

基于Hadoop的分布式爬虫及其实现随着互联网的飞速发展,网络数据量急速增长,并且呈现出多样化和复杂化的特点。

对于许多应用程序和研究领域来说,获取网络数据是非常重要的一项任务。

爬虫技术就是一种从互联网中采集数据的技术手段,可以自动化地获取和整理网络数据。

然而,随着互联网规模的不断扩大,传统的单机爬虫已经难以应对数据量的挑战。

为了解决这个问题,分布式爬虫应运而生。

分布式爬虫可以通过将任务分发给多台机器来提高数据爬取的效率和速度。

在分布式爬虫中,Hadoop是一个非常重要的组件。

Hadoop是一个开源的分布式计算框架,用于存储和处理大规模数据集。

它的核心是分布式文件系统(Hadoop Distributed File System,简称HDFS)和分布式计算框架(MapReduce)。

Hadoop的分布式计算能力能够有效地并行处理大规模的爬取任务。

基于Hadoop的分布式爬虫可以分为三个主要步骤:URL管理、数据获取和数据处理。

首先,URL管理是分布式爬虫的一个关键环节。

URL管理模块负责维护待爬取的URL队列,确保每个URL只被爬取一次。

在Hadoop中,可以使用HBase或者Zookeeper等工具来实现URL管理模块。

这些工具可以提供高可用性和可扩展性,确保分布式爬虫的稳定运行。

其次,数据获取是分布式爬虫的核心任务。

数据获取模块负责从互联网中获取数据。

在Hadoop中,可以使用MapReduce框架来并行处理多个URL,提高数据获取的效率。

每个URL都会被分配到一个任务节点上进行数据获取和存储。

数据获取模块还可以利用Hadoop的数据局部性原则,将爬取任务调度到离目标数据所在位置最近的节点上,减少网络传输的开销。

最后,数据处理是分布式爬虫的后续处理环节。

数据处理模块负责对爬取的数据进行清洗、过滤、分析等操作。

在Hadoop中,可以使用MapReduce框架来并行处理爬取的数据。

通过编写自定义的Map和Reduce函数,可以实现对数据的灵活处理和分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分布式网络爬虫关键技术分析与实现——分布式网络爬虫体系结构设计•一、研究所属范围分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行。

由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫。

这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。

根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类:1、基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高速的网络连接相互通信。

这些爬虫通过同一个网络去访问外部互联网,下载网页,所有的网络负载都集中在他们所在的那个局域网的出口上。

由于局域网的带宽较高,爬虫之间的通信的效率能够得到保证;但是网络出口的总带宽上限是固定的,爬虫的数量会受到局域网出口带宽的限制。

2、基于广域网分布式网络爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网络位置),我们称这种并行爬行器为分布式爬行器。

例如,分布式爬行器的爬虫可能位于中国,日本,和美国,分别负责下载这三地的网页;或者位于CHINANET,CERNET,CEINET,分别负责下载这三个网络的中的网页。

分布式爬行器的优势在于可以子在一定程度上分散网络流量,减小网络出口的负载。

如果爬虫分布在不同的地理位置(或网络位置),需要间隔多长时间进行一次相互通信就成为了一个值得考虑的问题。

爬虫之间的通讯带宽可能是有限的,通常需要通过互联网进行通信。

在实际应用中,基于局域网分布式网络爬虫应用的更广一些,而基于广域网的爬虫由于实现复杂,设计和实现成本过高,一般只有实力雄厚和采集任务较重的大公司才会使用这种爬虫。

本论文所设计的爬虫就是基于局域网分布式网络爬虫。

二、分布式网络爬虫整体分析分布式网络爬虫的整体设计重点应该在于爬虫如何进行通信。

目前分布式网络爬虫按通信方式不同分布式网路爬虫可以分为主从模式、自治模式与混合模式三种。

主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个过程中不必与其他爬虫通信,这种方式实现简单利于管理。

而控制节点则需要与所有爬虫进行通信,它需要一个地址列表来保存系统中所有爬虫的信息。

当系统中的爬虫数量发生变化时,协调者需要更新地址列表里的数据,这一过程对于系统中的爬虫是透明的。

但是随着爬虫网页数量的增加。

控制节点会成为整个系统的瓶颈而导致整个分布式网络爬虫系统性能下降。

主从模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须相互通信,比主从模式下爬虫要复杂一些。

自治模式的通信方式可以使用全连接通信或环形通信。

全连接通信是指所用爬虫都可以相互发送信息,使用这种方式的每个网络爬虫会维护一个地址列表,表中存储着整个系统中所有爬虫的位置,每次通信时可以直接把数据发送给需要此数据的爬虫。

当系统中的爬虫数量发生变化时,每个爬虫的地址列表都需要进行更新。

环形通信是指爬虫在逻辑上构成一个环形网,数据在环上按顺时针或逆时针单向传输,每个爬虫的地址列表中只保存其前驱和后继的信息。

爬虫接收到数据之后判断数据是否是发送给自己的,如果数据不是发送给自己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。

假设整个系统中有n个爬虫,当系统中的爬虫数量发生变化时,系统中只有n-1个爬虫的地址列表需要进行更新。

混合模式是结合上面两种模式的特点的一种折中模式。

该模式所有的爬虫都可以相互通信同时都具有任务分配功能。

不过所有爬虫中有个特殊的爬虫,该爬虫主要功能对已经经过爬虫任务分配后无法分配的任务进行集中分配。

使用这个方式的每个网络爬虫只需维护自己采集范围的地址列表。

而特殊爬虫需除了保存自己采集范围的地址列表外还保存需要进行集中分配的地址列表。

混合模式的整体结构图:三、大型分布式网络爬虫体系结构图:从这些图可以看出,分布式网络爬虫是一项十分复杂系统。

需要考虑很多方面因素。

性能可以说是它这重要的指标。

当然硬件层面的资源也是必须的。

不过不在本系列考虑范围。

从下篇开始,我将从单机网络爬虫一步步介绍我们需要考虑的问题的解决方案。

如果大家有更好的解决方案。

欢迎指教。

吉日的一句话说的很有道理,一个人一辈子只能做好几件事。

希望大家支持我的这个系列。

谈谈网络爬虫设计中的问题•网络蜘蛛现在开源的已经有好几个了,Larbin,Nutch,Heritrix都各有用户之地,要做一个自己的爬虫要解决好多个问题,比如调度算法、更新策略、分布式存储等,我们来一一看一下。

一个爬虫要做的事主要有以下这些1.从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者从一个rss源列表开始爬rss;2.获取每个页面的源码保存在磁盘或者数据库里;3.遍历抓下来的网页进行处理,比如提取正文,消重等;4.根据用途把处理后的文本进行索引、分类、聚类等操作。

以上是个人理解哦,呵呵。

这些过程中,大约有如下问题如何获取网页源或者RSS源如果是一般的爬虫的话,就是给几个入口页面,然后顺着超链接以遍历图的算法一个页面一个页面的爬,这种情况网页源很少,可以选择从hao123等网址大全的网站为入口开始爬。

如果做垂直搜索的话就人工去收集一些这个行业的网站,形成一个列表,从这个列表开始爬。

如果是爬RSS的话,需要先收集RSS源,现在大的门户的新闻频道和主流的博客系统都有rss的功能,可以先爬一遍网站,找出rss的链接,要获取每个链接的内容,分析是否是rss 格式,如果是就把这个链接保存到rss源数据库里,以后就专门爬这个rss源的rss。

还有一种就是人工来整理,一般blog的rss都是有规律的,主域名跟一个用户名后面再跟上一个rss的固定页面,比如,这样就弄一个用户字典,拼接rss地址,然后用程序去探测是否有这个页面来整理出每个网站的rss源。

整理出rss源后再人工设置rss源的权重及刷新时间间隔等。

如果源页面很多,如何用多线程去有效的调度处理,而不会互相等待或者重复处理如果现在有500万个页面要去爬,肯定要用多线程或者分布式多进程去处理了。

可以把页面进行水平分割,每个线程处理一段儿,这样每个线程之间不需要同步,各自处理各自的就行了。

比如给这500W个页面分配一个自增ID,2个线程的话就让第一个线程去爬1,3,5的网页,第二个线程去爬2,4,6的网页,这样做多个线程间基本上能均衡,而且不会相互等待,而且不会重复处理,也不会拉掉网页。

每个线程一次取出1w个页面,并记录最高的源页面ID号,处理完这一批后再从数据库里提取大于这个源页面ID号的下1W个页面,直到抓取完本线程要处理的所有页面。

1w这个值根据机器的内存可做适当的调整。

为了防止抓了半截儿死机,所以要支持断点续抓,要为每个线程的处理进度保存状态,每取一批网页都要记录本线程最大的网页ID,记录到数据库里,进程重启后可以读取这个ID,接着抓后面的页面。

如何尽量的利用CPU,尽量的不让线程处于等待、休眠、阻塞等空闲状态而且要尽量用少的线程以减少上下文切换。

爬虫有两个地方需要IO操作,抓网页的时候需要通过网卡访问网络,抓到网页后要把内容写到磁盘或者数据库里。

所以这两个部分要用异步IO操作,这样可以不用线程阻塞在那里等待网页抓过来或者写完磁盘文件,网卡和硬盘都支持内存直接读取,大量的IO操作会在硬件驱动的队列里排队,而不消耗任何CPU。

.net的异步操作使用了线程池,不用自己频繁的创建和销毁线程,减少了开销,所以线程模型不用考虑,IO模型也不用考虑,.net的异步IO操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源,除了数据库里的源页面,各管各的,而且也是每个线程分段处理,可以实现无锁编程。

如何不采集重复的网页去重可以使用king总监的布隆过滤器,每个线程使用一个bitarray,里面保存本批源页面上次抓取的页面的哈希值情况,抓取下来的源页面分析链接后,去这个bitarray里判断以前有没有抓过这个页面,没有的话就抓下来,抓过的话就不管了。

假设一个源页面有30个链接把,一批10W个源页面,300w个链接的bitarray应该也不会占太大内存。

所以有个五六个线程同时处理也是没问题的。

抓下来的页面更快的保存保存到分布式文件系统还是保存在数据库里如果保存到磁盘,可以每个域名创建一个文件夹,凡是这个网站的页面都放到这个文件夹下,只要文件名不一样,就不会出现冲突。

如果把页面保存到磁盘,数据库有自己的一套锁管理机制,直接用bulk copy放数据库就行了。

一般频繁的写磁盘可能会引起CPU过高,而频繁的写数据库CPU还好一些。

而且sqlserver2008支持类型的字段,在保存大文本字段的时候有很好的性能,并且还能使用数据库的API来访问。

所以我觉得如果没有GFS那样高效成熟的分布式文件系统的话还不如存sqlserver里面呢。

如何有效的根据网页的更新频率来调整爬虫的采集时间间隔做爬虫要了解一些HTTP协议,如果要抓的网页支持Last-Modified或者ETag头,我们可以先发个head请求来试探这个页面有没有变化来决定是否要重新抓取,但是好多网站根本就不支持这个东西,所以让爬虫也很费劲,让自己的网站也会损失更多的性能。

这样我们就要自己去标注每个源页面的更新时间间隔及权重,再根据这两个值去用一定的算法制定蜘蛛的更新策略。

采集下来的数据做什么用可以抓取一个行业的网站,在本地进行分词和索引,做成垂直搜索引擎。

可以用一定的训练算法对抓取下来的页面进行自动分类,做成新闻门户。

也可以用死小风行的文本相似度算法处理后进行文本聚类处理。

如何不影响对方网站的性能现在好多网站都被爬虫爬怕了,因为有些蜘蛛弄住一个网站可劲儿的爬,爬的人家网站的正常用户都无法访问了。

所以好多站长想了好多办法来对付爬虫,所以我们写爬虫也要遵循机器人协议,控制单位时间内对一个网站的访问量。

相关文档
最新文档