线程阻塞

线程阻塞

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

采集交流优采云 发表了文章 • 0 个评论 • 324 次浏览 • 2020-05-09 08:02 • 来自相关话题

  
  分布式网路爬虫关键技术剖析与实现——分布式网路爬虫体系结构设计 分布式网路爬虫体系结构设计 分布式网路爬虫关键技术剖析与实现?一、 研究所属范围分布式网路爬虫包含多个爬虫, 每个爬虫须要完成的任务和单个的爬行器类似, 它们从互联 网上下载网页,并把网页保存在本地的c盘,从中抽取 URL 并顺着这种 URL 的指向继续爬 行。由于并行爬行器须要分割下载任务,可能爬虫会将自己抽取的 URL 发送给其他爬虫。 这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1、基于局域网分布式网路爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高 速的网路联接互相通讯。这些爬虫通过同一个网路去访问外部互联网,下载网页,所有的网 络负载都集中在她们所在的那种局域网的出口上。 由于局域网的带宽较高, 爬虫之间的通讯 的效率能否得到保证; 但是网路出口的总带宽上限是固定的, 爬虫的数目会遭到局域网出口 带宽的限制。 2、基于广域网分布式网路爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网路位置), 我们称这些并行爬行器为分布式爬行器。
  例如,分布式爬行器的爬虫可能坐落中国,日本, 和英国,分别负责下载这三地的网页;或者坐落 CHINANET,CERNET,CEINET,分别负责 下载这三个网路的中的网页。分布式爬行器的优势在于可以子在一定程度上分散网路流量, 减小网路出口的负载。如果爬虫分布在不同的地理位置(或网路位置),需要间隔多长时间 进行一次互相通讯就成为了一个值得考虑的问题。 爬虫之间的通信带宽可能是有限的, 通常 需要通过互联网进行通讯。 在实际应用中, 基于局域网分布式网路爬虫应用的更广一些, 而基于广域网的爬虫因为 实现复杂, 设计和实现成本偏高, 一般只有实力雄厚和采集任务较重的大公司才能使用这些 爬虫。本论文所设计的爬虫就是基于局域网分布式网路爬虫。二、分布式网路爬虫整体剖析分布式网路爬虫的整体设计重点应当在于爬虫怎样进行通讯。目前分布式网 络爬虫按通讯方法不同分布式网络爬虫可以分为主从模式、 自治模式与混和模式 三种。主从模式是指由一台主机作为控制节点负责所有运行网路爬虫的主机进行管理, 爬虫只 需要从控制节点哪里接收任务, 并把新生成任务递交给控制节点就可以了, 在这个过程中不 必与其他爬虫通讯,这种方法实现简单利于管理。
  而控制节点则须要与所有爬虫进行通讯, 它须要一个地址列表来保存系统中所有爬虫的信息。 当系统中的爬虫数目发生变化时, 协调 者须要更新地址列表里的数据, 这一过程对于系统中的爬虫是透明的。 但是随着爬虫网页数 量的降低。 控制节点会成为整个系统的困局而造成整个分布式网路爬虫系统性能增长。 主从 模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须互相通讯,比主从模式 下爬虫要复杂一些。自治模式的通讯方法可以使用全联接通讯或环型通讯。全连 接通讯是指所用爬虫都可以互相发送信息, 使用这些方法的每位网络爬虫会维护 一个地址列表,表中储存着整个系统中所有爬虫的位置,每次通讯时可以直接把 数据发送给须要此数据的爬虫。当系统中的爬虫数目发生变化时,每个爬虫的地 址列表都须要进行更新。环形通讯是指爬虫在逻辑上构成一个环形网,数据在环 上按顺时针或逆时针双向传输, 每个爬虫的地址列表中只保存其前驱和后继的信 息。爬虫接收到数据然后判定数据是否是发送给自己的,如果数据不是发送给自 己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。假设整个 系统中有 n 个爬虫, 当系统中的爬虫数目发生变化时, 系统中只有 n-1 个爬虫的 地址列表须要进行更新。
  混合模式是结合前面两种模式的特性的一种折中模式。该模式所有的爬虫都可以 相互通讯同时都具有任务分配功能。不过所有爬虫中有个特殊的爬虫,该爬虫主 要功能对早已经过爬虫任务分配后未能分配的任务进行集中分配。 使用这个方法 的每位网路爬虫只需维护自己采集范围的地址列表。 而特殊爬虫需不仅保存自己 采集范围的地址列表外还保存须要进行集中分配的地址列表。 混合模式的整体结 构图:三、大型分布式网路爬虫体系结构图: 大型分布式网路爬虫体系结构图:从这种图可以看出,分布式网路爬虫是一项非常复杂系统。需要考虑好多方面诱因。性 能可以说是它这重要的指标。当然硬件层面的资源也是必须的。不过不在本系列考虑范围。 从上篇开始, 我将从单机网路爬虫一步步介绍我们须要考虑的问题的解决方案。 如果你们有 更好的解决方案。欢迎指教。 吉日的一句话说的太有道理, 一个人一辈子只能做好几件事。 希望你们支持我的这个系 列。谈谈网路爬虫设计中的问题?网络蜘蛛现今开源的早已有好几个了,Larbin,Nutch,Heritrix 都各有用户之地,要做 一个自己的爬虫要解决很多个问题分词技术 爬虫,比如调度算法、更新策略、分布式存储等,我们来一一 看一下。
   一个爬虫要做的事主要有以下这种 1. 2. 3. 从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者 从一个 rss 源列表开始爬 rss; 获取每位页面的源码保存在c盘或则数据库里; 遍历抓出来的网页进行处理,比如提取正文,消重等;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 操作,抓网页的时侯须要通过网卡访问网路,抓到网页后要把内容 写到c盘或则数据库里。所以这两个部份要用异步 IO 操作,这样可以不用线程阻塞在那里 等待网页抓过来或则写完磁盘文件,网卡和硬碟都支持显存直接读取,大量的 IO 操作会在 硬件驱动的队列里排队,而不消耗任何 CPU。.net 的异步操作使用了线程池,不用自己频繁 的创建和销毁线程,减少了开支,所以线程模型不用考虑,IO 模型也不用考虑,.net 的异 步 IO 操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源分词技术 爬虫,除了数据库里的源页面,各管各的,而且也是每位线程分段处理,可 以实现无锁编程。 如何不采集重复的网页 去重可以使用 king 总监的布隆过滤器,每个线程使用一个 bitarray,里面保存本批源页面先前 抓取的页面的哈希值情况,抓取出来的源页面剖析链接后,去这个 bitarray 里判定曾经有没 有抓过这个页面,没有的话就抓出来,抓过的话就不管了。假设一个源页面有 30 个链接把, 一批 10W 个源页面, 300w 个链接的 bitarray 应该也不会占很大显存。
   所以有个五六个线程 同时处理也是没问题的。 抓出来的页面更快的保存保存到分布式文件系统还是保存在数据库里 如果保存到c盘, 可以每位域名创建一个文件夹, 凡是这个网站的页面都放在这个文件夹下, 只要文件名不一样,就不会出现冲突。如果把页面保存到c盘,数据库有自己的一套锁管理 机制,直接用 bulk copy 放数据库就行了。一般频繁的写c盘可能会导致 CPU 过高,而频繁 的写数据库 CPU 还好一些。而且 sqlserver2008 支持 filestream 类型的数组,在保存大文本字 段的时侯有挺好的性能,并且能够使用数据库的 API 来访问。所以我认为假如没有 GFS 那 样高效成熟的分布式文件系统的话还不如存 sqlserver 里面呢。 如何有效的依据网页的更新频度来调整爬虫的采集时间间隔 做爬虫要了解一些 HTTP 协议,如果要抓的网页支持 Last-Modified 或者 ETag 头,我们可以先 发个 head 请求来试探这个页面有没有变化来决定是否要重新抓取,但是很多网站根本就不 支持这个东西,所以使爬虫也太费力,让自己的网站也会损失更多的性能。这样我们就要自 己去标明每个源页面的更新时间间隔及权重,再依照这两个值去用一定的算法制订蜘蛛的更 新策略。
   采集下来的数据做什么用 可以抓取一个行业的网站,在本地进行动词和索引,做成垂直搜索引擎。可以用一定的训练 算法对抓取出来的页面进行自动分类,做成新闻门户。也可以用死小风行的文本相似度算法处理 后进行文本降维处理。 如何不影响对方网站的性能 现在很多网站都被爬虫爬怕了, 因为有些蜘蛛弄住一个网站可劲儿的爬, 爬的人家网站的正 常用户都未能访问了。所以很多站长想了很多办法来对付爬虫,所以我们写爬虫也要遵守机器 人合同,控制单位时间内对一个网站的访问量。 查看全部

  
  分布式网路爬虫关键技术剖析与实现——分布式网路爬虫体系结构设计 分布式网路爬虫体系结构设计 分布式网路爬虫关键技术剖析与实现?一、 研究所属范围分布式网路爬虫包含多个爬虫, 每个爬虫须要完成的任务和单个的爬行器类似, 它们从互联 网上下载网页,并把网页保存在本地的c盘,从中抽取 URL 并顺着这种 URL 的指向继续爬 行。由于并行爬行器须要分割下载任务,可能爬虫会将自己抽取的 URL 发送给其他爬虫。 这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1、基于局域网分布式网路爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高 速的网路联接互相通讯。这些爬虫通过同一个网路去访问外部互联网,下载网页,所有的网 络负载都集中在她们所在的那种局域网的出口上。 由于局域网的带宽较高, 爬虫之间的通讯 的效率能否得到保证; 但是网路出口的总带宽上限是固定的, 爬虫的数目会遭到局域网出口 带宽的限制。 2、基于广域网分布式网路爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网路位置), 我们称这些并行爬行器为分布式爬行器。
  例如,分布式爬行器的爬虫可能坐落中国,日本, 和英国,分别负责下载这三地的网页;或者坐落 CHINANET,CERNET,CEINET,分别负责 下载这三个网路的中的网页。分布式爬行器的优势在于可以子在一定程度上分散网路流量, 减小网路出口的负载。如果爬虫分布在不同的地理位置(或网路位置),需要间隔多长时间 进行一次互相通讯就成为了一个值得考虑的问题。 爬虫之间的通信带宽可能是有限的, 通常 需要通过互联网进行通讯。 在实际应用中, 基于局域网分布式网路爬虫应用的更广一些, 而基于广域网的爬虫因为 实现复杂, 设计和实现成本偏高, 一般只有实力雄厚和采集任务较重的大公司才能使用这些 爬虫。本论文所设计的爬虫就是基于局域网分布式网路爬虫。二、分布式网路爬虫整体剖析分布式网路爬虫的整体设计重点应当在于爬虫怎样进行通讯。目前分布式网 络爬虫按通讯方法不同分布式网络爬虫可以分为主从模式、 自治模式与混和模式 三种。主从模式是指由一台主机作为控制节点负责所有运行网路爬虫的主机进行管理, 爬虫只 需要从控制节点哪里接收任务, 并把新生成任务递交给控制节点就可以了, 在这个过程中不 必与其他爬虫通讯,这种方法实现简单利于管理。
  而控制节点则须要与所有爬虫进行通讯, 它须要一个地址列表来保存系统中所有爬虫的信息。 当系统中的爬虫数目发生变化时, 协调 者须要更新地址列表里的数据, 这一过程对于系统中的爬虫是透明的。 但是随着爬虫网页数 量的降低。 控制节点会成为整个系统的困局而造成整个分布式网路爬虫系统性能增长。 主从 模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须互相通讯,比主从模式 下爬虫要复杂一些。自治模式的通讯方法可以使用全联接通讯或环型通讯。全连 接通讯是指所用爬虫都可以互相发送信息, 使用这些方法的每位网络爬虫会维护 一个地址列表,表中储存着整个系统中所有爬虫的位置,每次通讯时可以直接把 数据发送给须要此数据的爬虫。当系统中的爬虫数目发生变化时,每个爬虫的地 址列表都须要进行更新。环形通讯是指爬虫在逻辑上构成一个环形网,数据在环 上按顺时针或逆时针双向传输, 每个爬虫的地址列表中只保存其前驱和后继的信 息。爬虫接收到数据然后判定数据是否是发送给自己的,如果数据不是发送给自 己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。假设整个 系统中有 n 个爬虫, 当系统中的爬虫数目发生变化时, 系统中只有 n-1 个爬虫的 地址列表须要进行更新。
  混合模式是结合前面两种模式的特性的一种折中模式。该模式所有的爬虫都可以 相互通讯同时都具有任务分配功能。不过所有爬虫中有个特殊的爬虫,该爬虫主 要功能对早已经过爬虫任务分配后未能分配的任务进行集中分配。 使用这个方法 的每位网路爬虫只需维护自己采集范围的地址列表。 而特殊爬虫需不仅保存自己 采集范围的地址列表外还保存须要进行集中分配的地址列表。 混合模式的整体结 构图:三、大型分布式网路爬虫体系结构图: 大型分布式网路爬虫体系结构图:从这种图可以看出,分布式网路爬虫是一项非常复杂系统。需要考虑好多方面诱因。性 能可以说是它这重要的指标。当然硬件层面的资源也是必须的。不过不在本系列考虑范围。 从上篇开始, 我将从单机网路爬虫一步步介绍我们须要考虑的问题的解决方案。 如果你们有 更好的解决方案。欢迎指教。 吉日的一句话说的太有道理, 一个人一辈子只能做好几件事。 希望你们支持我的这个系 列。谈谈网路爬虫设计中的问题?网络蜘蛛现今开源的早已有好几个了,Larbin,Nutch,Heritrix 都各有用户之地,要做 一个自己的爬虫要解决很多个问题分词技术 爬虫,比如调度算法、更新策略、分布式存储等,我们来一一 看一下。
   一个爬虫要做的事主要有以下这种 1. 2. 3. 从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者 从一个 rss 源列表开始爬 rss; 获取每位页面的源码保存在c盘或则数据库里; 遍历抓出来的网页进行处理,比如提取正文,消重等;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 操作,抓网页的时侯须要通过网卡访问网路,抓到网页后要把内容 写到c盘或则数据库里。所以这两个部份要用异步 IO 操作,这样可以不用线程阻塞在那里 等待网页抓过来或则写完磁盘文件,网卡和硬碟都支持显存直接读取,大量的 IO 操作会在 硬件驱动的队列里排队,而不消耗任何 CPU。.net 的异步操作使用了线程池,不用自己频繁 的创建和销毁线程,减少了开支,所以线程模型不用考虑,IO 模型也不用考虑,.net 的异 步 IO 操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源分词技术 爬虫,除了数据库里的源页面,各管各的,而且也是每位线程分段处理,可 以实现无锁编程。 如何不采集重复的网页 去重可以使用 king 总监的布隆过滤器,每个线程使用一个 bitarray,里面保存本批源页面先前 抓取的页面的哈希值情况,抓取出来的源页面剖析链接后,去这个 bitarray 里判定曾经有没 有抓过这个页面,没有的话就抓出来,抓过的话就不管了。假设一个源页面有 30 个链接把, 一批 10W 个源页面, 300w 个链接的 bitarray 应该也不会占很大显存。
   所以有个五六个线程 同时处理也是没问题的。 抓出来的页面更快的保存保存到分布式文件系统还是保存在数据库里 如果保存到c盘, 可以每位域名创建一个文件夹, 凡是这个网站的页面都放在这个文件夹下, 只要文件名不一样,就不会出现冲突。如果把页面保存到c盘,数据库有自己的一套锁管理 机制,直接用 bulk copy 放数据库就行了。一般频繁的写c盘可能会导致 CPU 过高,而频繁 的写数据库 CPU 还好一些。而且 sqlserver2008 支持 filestream 类型的数组,在保存大文本字 段的时侯有挺好的性能,并且能够使用数据库的 API 来访问。所以我认为假如没有 GFS 那 样高效成熟的分布式文件系统的话还不如存 sqlserver 里面呢。 如何有效的依据网页的更新频度来调整爬虫的采集时间间隔 做爬虫要了解一些 HTTP 协议,如果要抓的网页支持 Last-Modified 或者 ETag 头,我们可以先 发个 head 请求来试探这个页面有没有变化来决定是否要重新抓取,但是很多网站根本就不 支持这个东西,所以使爬虫也太费力,让自己的网站也会损失更多的性能。这样我们就要自 己去标明每个源页面的更新时间间隔及权重,再依照这两个值去用一定的算法制订蜘蛛的更 新策略。
   采集下来的数据做什么用 可以抓取一个行业的网站,在本地进行动词和索引,做成垂直搜索引擎。可以用一定的训练 算法对抓取出来的页面进行自动分类,做成新闻门户。也可以用死小风行的文本相似度算法处理 后进行文本降维处理。 如何不影响对方网站的性能 现在很多网站都被爬虫爬怕了, 因为有些蜘蛛弄住一个网站可劲儿的爬, 爬的人家网站的正 常用户都未能访问了。所以很多站长想了很多办法来对付爬虫,所以我们写爬虫也要遵守机器 人合同,控制单位时间内对一个网站的访问量。

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

采集交流优采云 发表了文章 • 0 个评论 • 324 次浏览 • 2020-05-09 08:02 • 来自相关话题

  
  分布式网路爬虫关键技术剖析与实现——分布式网路爬虫体系结构设计 分布式网路爬虫体系结构设计 分布式网路爬虫关键技术剖析与实现?一、 研究所属范围分布式网路爬虫包含多个爬虫, 每个爬虫须要完成的任务和单个的爬行器类似, 它们从互联 网上下载网页,并把网页保存在本地的c盘,从中抽取 URL 并顺着这种 URL 的指向继续爬 行。由于并行爬行器须要分割下载任务,可能爬虫会将自己抽取的 URL 发送给其他爬虫。 这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1、基于局域网分布式网路爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高 速的网路联接互相通讯。这些爬虫通过同一个网路去访问外部互联网,下载网页,所有的网 络负载都集中在她们所在的那种局域网的出口上。 由于局域网的带宽较高, 爬虫之间的通讯 的效率能否得到保证; 但是网路出口的总带宽上限是固定的, 爬虫的数目会遭到局域网出口 带宽的限制。 2、基于广域网分布式网路爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网路位置), 我们称这些并行爬行器为分布式爬行器。
  例如,分布式爬行器的爬虫可能坐落中国,日本, 和英国,分别负责下载这三地的网页;或者坐落 CHINANET,CERNET,CEINET,分别负责 下载这三个网路的中的网页。分布式爬行器的优势在于可以子在一定程度上分散网路流量, 减小网路出口的负载。如果爬虫分布在不同的地理位置(或网路位置),需要间隔多长时间 进行一次互相通讯就成为了一个值得考虑的问题。 爬虫之间的通信带宽可能是有限的, 通常 需要通过互联网进行通讯。 在实际应用中, 基于局域网分布式网路爬虫应用的更广一些, 而基于广域网的爬虫因为 实现复杂, 设计和实现成本偏高, 一般只有实力雄厚和采集任务较重的大公司才能使用这些 爬虫。本论文所设计的爬虫就是基于局域网分布式网路爬虫。二、分布式网路爬虫整体剖析分布式网路爬虫的整体设计重点应当在于爬虫怎样进行通讯。目前分布式网 络爬虫按通讯方法不同分布式网络爬虫可以分为主从模式、 自治模式与混和模式 三种。主从模式是指由一台主机作为控制节点负责所有运行网路爬虫的主机进行管理, 爬虫只 需要从控制节点哪里接收任务, 并把新生成任务递交给控制节点就可以了, 在这个过程中不 必与其他爬虫通讯,这种方法实现简单利于管理。
  而控制节点则须要与所有爬虫进行通讯, 它须要一个地址列表来保存系统中所有爬虫的信息。 当系统中的爬虫数目发生变化时, 协调 者须要更新地址列表里的数据, 这一过程对于系统中的爬虫是透明的。 但是随着爬虫网页数 量的降低。 控制节点会成为整个系统的困局而造成整个分布式网路爬虫系统性能增长。 主从 模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须互相通讯,比主从模式 下爬虫要复杂一些。自治模式的通讯方法可以使用全联接通讯或环型通讯。全连 接通讯是指所用爬虫都可以互相发送信息, 使用这些方法的每位网络爬虫会维护 一个地址列表,表中储存着整个系统中所有爬虫的位置,每次通讯时可以直接把 数据发送给须要此数据的爬虫。当系统中的爬虫数目发生变化时,每个爬虫的地 址列表都须要进行更新。环形通讯是指爬虫在逻辑上构成一个环形网,数据在环 上按顺时针或逆时针双向传输, 每个爬虫的地址列表中只保存其前驱和后继的信 息。爬虫接收到数据然后判定数据是否是发送给自己的,如果数据不是发送给自 己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。假设整个 系统中有 n 个爬虫, 当系统中的爬虫数目发生变化时, 系统中只有 n-1 个爬虫的 地址列表须要进行更新。
  混合模式是结合前面两种模式的特性的一种折中模式。该模式所有的爬虫都可以 相互通讯同时都具有任务分配功能。不过所有爬虫中有个特殊的爬虫,该爬虫主 要功能对早已经过爬虫任务分配后未能分配的任务进行集中分配。 使用这个方法 的每位网路爬虫只需维护自己采集范围的地址列表。 而特殊爬虫需不仅保存自己 采集范围的地址列表外还保存须要进行集中分配的地址列表。 混合模式的整体结 构图:三、大型分布式网路爬虫体系结构图: 大型分布式网路爬虫体系结构图:从这种图可以看出,分布式网路爬虫是一项非常复杂系统。需要考虑好多方面诱因。性 能可以说是它这重要的指标。当然硬件层面的资源也是必须的。不过不在本系列考虑范围。 从上篇开始, 我将从单机网路爬虫一步步介绍我们须要考虑的问题的解决方案。 如果你们有 更好的解决方案。欢迎指教。 吉日的一句话说的太有道理, 一个人一辈子只能做好几件事。 希望你们支持我的这个系 列。谈谈网路爬虫设计中的问题?网络蜘蛛现今开源的早已有好几个了,Larbin,Nutch,Heritrix 都各有用户之地,要做 一个自己的爬虫要解决很多个问题分词技术 爬虫,比如调度算法、更新策略、分布式存储等,我们来一一 看一下。
   一个爬虫要做的事主要有以下这种 1. 2. 3. 从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者 从一个 rss 源列表开始爬 rss; 获取每位页面的源码保存在c盘或则数据库里; 遍历抓出来的网页进行处理,比如提取正文,消重等;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 操作,抓网页的时侯须要通过网卡访问网路,抓到网页后要把内容 写到c盘或则数据库里。所以这两个部份要用异步 IO 操作,这样可以不用线程阻塞在那里 等待网页抓过来或则写完磁盘文件,网卡和硬碟都支持显存直接读取,大量的 IO 操作会在 硬件驱动的队列里排队,而不消耗任何 CPU。.net 的异步操作使用了线程池,不用自己频繁 的创建和销毁线程,减少了开支,所以线程模型不用考虑,IO 模型也不用考虑,.net 的异 步 IO 操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源分词技术 爬虫,除了数据库里的源页面,各管各的,而且也是每位线程分段处理,可 以实现无锁编程。 如何不采集重复的网页 去重可以使用 king 总监的布隆过滤器,每个线程使用一个 bitarray,里面保存本批源页面先前 抓取的页面的哈希值情况,抓取出来的源页面剖析链接后,去这个 bitarray 里判定曾经有没 有抓过这个页面,没有的话就抓出来,抓过的话就不管了。假设一个源页面有 30 个链接把, 一批 10W 个源页面, 300w 个链接的 bitarray 应该也不会占很大显存。
   所以有个五六个线程 同时处理也是没问题的。 抓出来的页面更快的保存保存到分布式文件系统还是保存在数据库里 如果保存到c盘, 可以每位域名创建一个文件夹, 凡是这个网站的页面都放在这个文件夹下, 只要文件名不一样,就不会出现冲突。如果把页面保存到c盘,数据库有自己的一套锁管理 机制,直接用 bulk copy 放数据库就行了。一般频繁的写c盘可能会导致 CPU 过高,而频繁 的写数据库 CPU 还好一些。而且 sqlserver2008 支持 filestream 类型的数组,在保存大文本字 段的时侯有挺好的性能,并且能够使用数据库的 API 来访问。所以我认为假如没有 GFS 那 样高效成熟的分布式文件系统的话还不如存 sqlserver 里面呢。 如何有效的依据网页的更新频度来调整爬虫的采集时间间隔 做爬虫要了解一些 HTTP 协议,如果要抓的网页支持 Last-Modified 或者 ETag 头,我们可以先 发个 head 请求来试探这个页面有没有变化来决定是否要重新抓取,但是很多网站根本就不 支持这个东西,所以使爬虫也太费力,让自己的网站也会损失更多的性能。这样我们就要自 己去标明每个源页面的更新时间间隔及权重,再依照这两个值去用一定的算法制订蜘蛛的更 新策略。
   采集下来的数据做什么用 可以抓取一个行业的网站,在本地进行动词和索引,做成垂直搜索引擎。可以用一定的训练 算法对抓取出来的页面进行自动分类,做成新闻门户。也可以用死小风行的文本相似度算法处理 后进行文本降维处理。 如何不影响对方网站的性能 现在很多网站都被爬虫爬怕了, 因为有些蜘蛛弄住一个网站可劲儿的爬, 爬的人家网站的正 常用户都未能访问了。所以很多站长想了很多办法来对付爬虫,所以我们写爬虫也要遵守机器 人合同,控制单位时间内对一个网站的访问量。 查看全部

  
  分布式网路爬虫关键技术剖析与实现——分布式网路爬虫体系结构设计 分布式网路爬虫体系结构设计 分布式网路爬虫关键技术剖析与实现?一、 研究所属范围分布式网路爬虫包含多个爬虫, 每个爬虫须要完成的任务和单个的爬行器类似, 它们从互联 网上下载网页,并把网页保存在本地的c盘,从中抽取 URL 并顺着这种 URL 的指向继续爬 行。由于并行爬行器须要分割下载任务,可能爬虫会将自己抽取的 URL 发送给其他爬虫。 这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1、基于局域网分布式网路爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高 速的网路联接互相通讯。这些爬虫通过同一个网路去访问外部互联网,下载网页,所有的网 络负载都集中在她们所在的那种局域网的出口上。 由于局域网的带宽较高, 爬虫之间的通讯 的效率能否得到保证; 但是网路出口的总带宽上限是固定的, 爬虫的数目会遭到局域网出口 带宽的限制。 2、基于广域网分布式网路爬虫:当并行爬行器的爬虫分别运行在不同地理位置(或网路位置), 我们称这些并行爬行器为分布式爬行器。
  例如,分布式爬行器的爬虫可能坐落中国,日本, 和英国,分别负责下载这三地的网页;或者坐落 CHINANET,CERNET,CEINET,分别负责 下载这三个网路的中的网页。分布式爬行器的优势在于可以子在一定程度上分散网路流量, 减小网路出口的负载。如果爬虫分布在不同的地理位置(或网路位置),需要间隔多长时间 进行一次互相通讯就成为了一个值得考虑的问题。 爬虫之间的通信带宽可能是有限的, 通常 需要通过互联网进行通讯。 在实际应用中, 基于局域网分布式网路爬虫应用的更广一些, 而基于广域网的爬虫因为 实现复杂, 设计和实现成本偏高, 一般只有实力雄厚和采集任务较重的大公司才能使用这些 爬虫。本论文所设计的爬虫就是基于局域网分布式网路爬虫。二、分布式网路爬虫整体剖析分布式网路爬虫的整体设计重点应当在于爬虫怎样进行通讯。目前分布式网 络爬虫按通讯方法不同分布式网络爬虫可以分为主从模式、 自治模式与混和模式 三种。主从模式是指由一台主机作为控制节点负责所有运行网路爬虫的主机进行管理, 爬虫只 需要从控制节点哪里接收任务, 并把新生成任务递交给控制节点就可以了, 在这个过程中不 必与其他爬虫通讯,这种方法实现简单利于管理。
  而控制节点则须要与所有爬虫进行通讯, 它须要一个地址列表来保存系统中所有爬虫的信息。 当系统中的爬虫数目发生变化时, 协调 者须要更新地址列表里的数据, 这一过程对于系统中的爬虫是透明的。 但是随着爬虫网页数 量的降低。 控制节点会成为整个系统的困局而造成整个分布式网路爬虫系统性能增长。 主从 模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须互相通讯,比主从模式 下爬虫要复杂一些。自治模式的通讯方法可以使用全联接通讯或环型通讯。全连 接通讯是指所用爬虫都可以互相发送信息, 使用这些方法的每位网络爬虫会维护 一个地址列表,表中储存着整个系统中所有爬虫的位置,每次通讯时可以直接把 数据发送给须要此数据的爬虫。当系统中的爬虫数目发生变化时,每个爬虫的地 址列表都须要进行更新。环形通讯是指爬虫在逻辑上构成一个环形网,数据在环 上按顺时针或逆时针双向传输, 每个爬虫的地址列表中只保存其前驱和后继的信 息。爬虫接收到数据然后判定数据是否是发送给自己的,如果数据不是发送给自 己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。假设整个 系统中有 n 个爬虫, 当系统中的爬虫数目发生变化时, 系统中只有 n-1 个爬虫的 地址列表须要进行更新。
  混合模式是结合前面两种模式的特性的一种折中模式。该模式所有的爬虫都可以 相互通讯同时都具有任务分配功能。不过所有爬虫中有个特殊的爬虫,该爬虫主 要功能对早已经过爬虫任务分配后未能分配的任务进行集中分配。 使用这个方法 的每位网路爬虫只需维护自己采集范围的地址列表。 而特殊爬虫需不仅保存自己 采集范围的地址列表外还保存须要进行集中分配的地址列表。 混合模式的整体结 构图:三、大型分布式网路爬虫体系结构图: 大型分布式网路爬虫体系结构图:从这种图可以看出,分布式网路爬虫是一项非常复杂系统。需要考虑好多方面诱因。性 能可以说是它这重要的指标。当然硬件层面的资源也是必须的。不过不在本系列考虑范围。 从上篇开始, 我将从单机网路爬虫一步步介绍我们须要考虑的问题的解决方案。 如果你们有 更好的解决方案。欢迎指教。 吉日的一句话说的太有道理, 一个人一辈子只能做好几件事。 希望你们支持我的这个系 列。谈谈网路爬虫设计中的问题?网络蜘蛛现今开源的早已有好几个了,Larbin,Nutch,Heritrix 都各有用户之地,要做 一个自己的爬虫要解决很多个问题分词技术 爬虫,比如调度算法、更新策略、分布式存储等,我们来一一 看一下。
   一个爬虫要做的事主要有以下这种 1. 2. 3. 从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者 从一个 rss 源列表开始爬 rss; 获取每位页面的源码保存在c盘或则数据库里; 遍历抓出来的网页进行处理,比如提取正文,消重等;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 操作,抓网页的时侯须要通过网卡访问网路,抓到网页后要把内容 写到c盘或则数据库里。所以这两个部份要用异步 IO 操作,这样可以不用线程阻塞在那里 等待网页抓过来或则写完磁盘文件,网卡和硬碟都支持显存直接读取,大量的 IO 操作会在 硬件驱动的队列里排队,而不消耗任何 CPU。.net 的异步操作使用了线程池,不用自己频繁 的创建和销毁线程,减少了开支,所以线程模型不用考虑,IO 模型也不用考虑,.net 的异 步 IO 操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源分词技术 爬虫,除了数据库里的源页面,各管各的,而且也是每位线程分段处理,可 以实现无锁编程。 如何不采集重复的网页 去重可以使用 king 总监的布隆过滤器,每个线程使用一个 bitarray,里面保存本批源页面先前 抓取的页面的哈希值情况,抓取出来的源页面剖析链接后,去这个 bitarray 里判定曾经有没 有抓过这个页面,没有的话就抓出来,抓过的话就不管了。假设一个源页面有 30 个链接把, 一批 10W 个源页面, 300w 个链接的 bitarray 应该也不会占很大显存。
   所以有个五六个线程 同时处理也是没问题的。 抓出来的页面更快的保存保存到分布式文件系统还是保存在数据库里 如果保存到c盘, 可以每位域名创建一个文件夹, 凡是这个网站的页面都放在这个文件夹下, 只要文件名不一样,就不会出现冲突。如果把页面保存到c盘,数据库有自己的一套锁管理 机制,直接用 bulk copy 放数据库就行了。一般频繁的写c盘可能会导致 CPU 过高,而频繁 的写数据库 CPU 还好一些。而且 sqlserver2008 支持 filestream 类型的数组,在保存大文本字 段的时侯有挺好的性能,并且能够使用数据库的 API 来访问。所以我认为假如没有 GFS 那 样高效成熟的分布式文件系统的话还不如存 sqlserver 里面呢。 如何有效的依据网页的更新频度来调整爬虫的采集时间间隔 做爬虫要了解一些 HTTP 协议,如果要抓的网页支持 Last-Modified 或者 ETag 头,我们可以先 发个 head 请求来试探这个页面有没有变化来决定是否要重新抓取,但是很多网站根本就不 支持这个东西,所以使爬虫也太费力,让自己的网站也会损失更多的性能。这样我们就要自 己去标明每个源页面的更新时间间隔及权重,再依照这两个值去用一定的算法制订蜘蛛的更 新策略。
   采集下来的数据做什么用 可以抓取一个行业的网站,在本地进行动词和索引,做成垂直搜索引擎。可以用一定的训练 算法对抓取出来的页面进行自动分类,做成新闻门户。也可以用死小风行的文本相似度算法处理 后进行文本降维处理。 如何不影响对方网站的性能 现在很多网站都被爬虫爬怕了, 因为有些蜘蛛弄住一个网站可劲儿的爬, 爬的人家网站的正 常用户都未能访问了。所以很多站长想了很多办法来对付爬虫,所以我们写爬虫也要遵守机器 人合同,控制单位时间内对一个网站的访问量。

官方客服QQ群

微信人工客服

QQ人工客服


线