网络蜘蛛现在开源的已经有好几个了,Larbin,Nutch,Heritrix都各有用户之地,要做一个自己的爬虫要解决好多个问题,比如调度算法、更新策略、分布式存储等,我们来一一看一下。
一个爬虫要做的事主要有以下这些
- 从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者从一个rss源列表开始爬rss;
- 获取每个页面的源码保存在磁盘或者数据库里;
- 遍历抓下来的网页进行处理,比如提取正文,消重等;
- 根据用途把处理后的文本进行索引、分类、聚类等操作。
以上是个人理解哦,呵呵。这些过程中,大约有如下问题
如何获取网页源或者RSS源?
如果是一般的爬虫的话,就是给几个入口页面,然后顺着超链接以遍历图的算法一个页面一个页面的爬,这种情况网页源很少,可以选择从hao123等网址大全的网站为入口开始爬。如果做垂直搜索的话就人工去收集一些这个行业的网站,形成一个列表,从这个列表开始爬。如果是爬RSS的话,需要先收集RSS源,现在大的门户的新闻频道和主流的博客系统都有rss的功能,可以先爬一遍网站,找出rss的链接,要获取每个链接的内容,分析是否是rss格式,如果是就把这个链接保存到rss源数据库里,以后就专门爬这个rss源的rss。还有一种就是人工来整理,一般blog的rss都是有规律的,主域名跟一个用户名后面再跟上一个rss的固定页面,比如http://www.abc.com/user1/rss.xml,这样就弄一个用户字典,拼接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支持filestream类型的字段,在保存大文本字段的时候有很好的性能,并且还能使用数据库的API来访问。所以我觉得如果没有GFS那样高效成熟的分布式文件系统的话还不如存sqlserver里面呢。
如何有效的根据网页的更新频率来调整爬虫的采集时间间隔?
做爬虫要了解一些HTTP协议,如果要抓的网页支持Last-Modified或者ETag头,我们可以先发个head请求来试探这个页面有没有变化来决定是否要重新抓取,但是好多网站根本就不支持这个东西,所以让爬虫也很费劲,让自己的网站也会损失更多的性能。这样我们就要自己去标注每个源页面的更新时间间隔及权重,再根据这两个值去用一定的算法制定蜘蛛的更新策略。
采集下来的数据做什么用?
可以抓取一个行业的网站,在本地进行分词和索引,做成垂直搜索引擎。可以用一定的训练算法对抓取下来的页面进行自动分类,做成新闻门户。也可以用死小风行的文本相似度算法处理后进行文本聚类处理。
如何不影响对方网站的性能?
现在好多网站都被爬虫爬怕了,因为有些蜘蛛弄住一个网站可劲儿的爬,爬的人家网站的正常用户都无法访问了。所以好多站长想了好多办法来对付爬虫,所以我们写爬虫也要遵循机器人协议,控制单位时间内对一个网站的访问量。
其它问题:
http://notes.zhourenjian.com/whizznotes/xhtml/4308.html
来自:http://www.bt285.cn
分享到:
相关推荐
JS爬虫是利用JavaScript语言编写的一种网络爬虫,主要用于抓取网页上的动态内容。JavaScript因其广泛应用于前端开发,许多网站的交互和数据加载都依赖于它。在本项目中,JS爬虫可能采用诸如Puppeteer或Node.js的...
在本项目中,"python爬虫数据可视化分析大作业.zip" 是一个综合性的学习资源,主要涉及了Python编程中的两个重要领域:网络爬虫(Web Scraping)和数据可视化(Data Visualization)。通过这个作业,我们可以深入...
首先,我们来谈谈**网络爬虫**。在该项目中,爬虫被用来自动收集音乐相关的数据。爬虫是Python编程中的一个重要领域,常用于从互联网上抓取大量信息。开发者可能使用了Python的requests库来发送HTTP请求,获取网页...
- **定义**:网络爬虫是一种自动化的程序或脚本,用于遍历互联网上的网页并抓取所需数据。它通常遵循预设的规则,通过解析网页内容来提取有用信息。 - **作用**: - 数据收集:为数据分析提供原始数据源。 - 搜索...
爬虫,也称为网络爬虫或网页蜘蛛,是一种自动抓取互联网信息的程序。它们通过模拟用户浏览行为,遍历网站,抓取网页内容,并存储在本地或者数据库中,常用于数据分析、搜索引擎索引等场景。 WebMagic的核心组件包括...
在IT领域,域名、爬虫和VC6.0是三个重要的概念,它们在软件开发,尤其是网络数据抓取和分析中扮演着关键角色。本文将深入探讨这些知识点,并结合"GetWebDomain"项目来阐述其具体应用。 首先,让我们了解什么是域名...
Python是网络爬虫的常用语言,因其语法简洁且拥有丰富的库支持而受到欢迎。在本教程中,你将学习如何使用requests库发送HTTP请求,获取网页HTML内容;接着,BeautifulSoup库会教你如何解析HTML文档,提取所需信息。...
综上所述,ASP源码—淡蓝色77Y8电影爬虫程序v2.1是一个基于ASP技术的网络爬虫应用,它利用ASP的服务器端能力来抓取电影网站的信息,并可能将数据存储在数据库中。要深入了解这个程序的工作原理,需要查看并分析源...
总结来说,这个压缩包内容涵盖了软件开发初期的重要步骤,包括需求分析、技术选型、网络爬虫的实现以及数据模型的设计。这些都是IT专业人员必备的技能,尤其是在数据分析、Web开发等领域。通过学习和实践这些内容,...
而Scrapy与Twisted的结合则使得网络爬虫能够高效地处理大量的网页抓取任务,避免了因为网络延迟而导致的效率低下。 为了更好地利用Twisted,你需要掌握以下几个关键概念: 1. **Protocol**: 表示特定网络协议的类...
"网络爬虫"在这里可能不太直接相关,但如果游戏需要获取在线数据,比如排行榜或天气信息,Python的网络爬虫技术就派上用场了。例如,通过requests和BeautifulSoup库获取并解析网页数据,然后将其集成到游戏中。 ...
总的来说,这个压缩包中的Python源码示例涵盖了数据自动化处理、分析、可视化以及可能的游戏开发和网络爬虫相关知识。通过学习和理解这些代码,无论是初学者还是有经验的开发者,都能提升在这些领域的技能。
在这个标签中,我们可以看到关键词“下载”、“源代码”、“源码”、“自助链接类”和“资料”,这些都是与软件开发、网络爬虫和资源获取紧密相关的知识点。 首先,我们来谈谈“下载”技术。下载是互联网中的一项...
源代码中包含了网络通信模块、用户界面模块、消息解析模块等多个关键部分,每一部分都是实现QQ功能不可或缺的元素。深入学习这些模块,对于理解网络应用的架构设计和编程实践具有重要意义。 接下来,我们来谈谈...
此外,图算法也是重要的一部分,如深度优先搜索(DFS)和广度优先搜索(BFS),常用于路径查找、网络爬虫等领域。Dijkstra算法和A*搜索则用于找到图中两点之间的最短路径。 总之,掌握数据结构与算法对于任何IT专业...
总的来说,"ItemDemo.rar"这个压缩包提供了一个基础的Scrapy项目,帮助初学者了解如何使用Item对象来定义数据结构,以及如何通过Scrapy框架实现网络爬虫。通过学习和实践这个实例,你可以掌握Scrapy的基本用法,为...
图是由节点和边构成的抽象结构,可以表示复杂的关联关系,如图搜索算法就广泛应用于网络爬虫、推荐系统等领域。 在《Java数据结构上机实践指导教程》中,你将学习到如何在Java中实现这些数据结构,包括构造、插入、...
这个项目充分利用了网络爬虫技术和CSS样式设计,为求职者提供了一种便捷的方式,将他们在LinkedIn上的个人信息转化成专业且具有吸引力的简历文档。 首先,我们来了解一下网络爬虫技术。网络爬虫是一种自动遍历网络...
后续章节将涵盖运算符与表达式、流程控制语句、列表与元组、字典与集合、字符串处理、正则表达式、函数、面向对象编程、模块、异常处理、文件操作、数据库操作、GUI编程、网络爬虫、进程线程、网络编程、Web编程、...
《PyPI官网下载 | autoextract-0.0.1.tar.gz——Python自动化提取库解析》 ...同时,通过深入研究源代码,可以提升对Zookeeper、分布式概念以及云原生设计原则的理解,对于提升个人的IT技能和解决实际问题大有裨益。