最近在写一个程序,去爬热门事件和热门关键词网站上的数据。在这里介绍一下网络爬虫的种种。
基本组件
网络爬虫也叫做网络蜘蛛,是一种互联网机器人,把需要的网页撷取下来,组织成适当格式存储。它是搜索引擎的重要组成部分,虽然从技术实现上来说,它的难度往往要小于对于得到的网页信息的处理。
上面这张图来自维基百科,scheduler调度多个多线程的下载器下载网页,并把信息和元数据存储起来。而通过解析下载网页的数据,找到链接,又把链接加入到工作队列中去准备下载。这看起来是一个迭代的过程。
网络爬虫相关的几项重要策略:
- 选择策略:哪些网页是需要被抓取的;
- 重访问策略:怎样的方式去检测网页是否被修改过;
- 礼貌性策略:抓取网页的时候,需要方式网站过载;
- 并行化策略:怎样组织分布式的网络爬虫。
选择策略
限定跟随链接。通常只需要html文本信息,所以根据MIME类型,如果不是文本信息,会被丢弃掉。所以,如果URL无法得知资源的二进制类型,爬虫可能会先发起一个head请求获知目标是不是文本,如果是的话,才发送一个get请求获取页面。
URL标准化。它用来避免多次爬到相同的页面。有些URL包含“../”这样的相对路径信息,这也需要爬虫处理使之成为完整正确的URL,而有些URL则需要在最后面加上斜杠。
路径升序。有些爬虫想尽可能爬多的信息,资源是有层级关系的,比如http://llama.org/hamster/monkey/page.html这样一个链接,它会尝试爬“/hamster/monkey/”、“/hamster/”和“/”这几个页面。
学术网页爬虫。专注于学术领域,比如Google Scholar等等。
重访问策略
网页总是在动态变化的,爬完整一个网站可能会花掉数周甚至一个月的时间,在爬完一个网页之后,网页可能就不在了,或者更新了。什么时候再爬这个网站呢?通常对于经常变化的网页,这个间隔时间应该短一些。
新鲜度:在一定时间t内,页面是否有变化。
Age: 本地网页拷贝有多么过时。
有一种常见的重访问策略是,先以一个默认的频度访问页面,如果发现页面持续不更新,就逐步降低这个频度;反之亦然。
礼貌性策略
爬虫当然可以尽可能快地爬取数据,但是我们需要考虑网站的性能压力,已经对网络资源的消耗。
有一个robots exclusion协议,指定了爬虫应该怎样访问网站的资源,哪些可以访问,哪些不可以访问。这个协议并不是强制的,但是已经是事实上的标准。比如,Crawl-delay参数,就可以定义每连续两次的请求,至少需要间隔多少秒。
以本网站的robots.txt为例:
User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
其中的User-agent表示对爬虫类型没有限制,Disallow两行指定了哪些URL是不允许搜索引擎抓取的;Sitemap则是一个xml格式的网站地图:
1
2
3
4
5
6
7
8
9
10
11
12
|
< url >
< lastmod >2013-05-25T16:32:13+00:00</ lastmod >
< changefreq >daily</ changefreq >
< priority >1.0</ priority >
</ url >
< url >
< lastmod >2013-05-19T14:46:19+00:00</ lastmod >
< changefreq >monthly</ changefreq >
< priority >0.2</ priority >
</ url >
|
指定了网站有哪些页面,更新频率和权重各是多少。如果有些页面没有明显的直接链接抵达,通过sitemap的形式可以告知爬虫去抓取。如果你很讨厌某个搜索引擎,你可以这样指定(我只是举例而已,百度除了假药假广告侵权信息管制主观性过滤以外也是做了一些好事的 -_-~):
User-agent: Baiduspider
Disallow: /
网页深度
通常,越是深的链接,重要性越低,数量也越大。对于爬虫来说,越深的链接往往价值越小。在大多数情况下,我们不需要所有的信息,这时候需要控制合理的网页深度,价值高的网站可以深度适当大一些。
互联网即数据库
以前我曾经介绍过YQL,一种像SQL查询数据库一样查询互联网网页数据的语言,你也可以在这个YQL控制台自己试试:
1
|
select * from flickr.photos.search where text= "Cat" and api_key= "your key here" limit 10
|
这是一个“get 10 flickr “cat” photos”的例子。
再比如:
1
|
select * from html where url= "http://finance.yahoo.com/q?s=yhoo" and xpath= '//div[@id="yfi_headlines"]/div[2]/ul/li/a'
|
如果你看得懂XPATH表达式的话,这一定很清楚。它可以以普通HTTP API的方式暴露出来:
1
|
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22http%3A%2F%2Ffinance.yahoo.com%2Fq%3Fs%3Dyhoo%22%20and%20xpath%3D'%2F%2Fdiv%5B%40id%3D%22yfi_headlines%22%5D%2Fdiv%5B2%5D%2Ful%2Fli%2Fa'&format=json&diagnostics=true&callback=cbfunc |
在很多情况下,我们需要的并不是宽泛的信息,而是明确地知道自己需要什么信息,譬如某网站总是显示自己关心的信息,那么就可以借用它来定时爬取特定的页面(比如我以前干过这样的事:一场NBA比赛结束了,我没有看,但是我很想尽快地看到比赛录像,于是每隔几分钟就去爬取一个论坛比赛下载的帖子汇总页面,当“马刺”那个关键词出现的时候,我就去看一下是不是有比赛下载了。当然,你可以做得更好,写一个脚本让整个下载过程自动化完成,这样你就可以安心上班了,等回到家的时候,比赛已经下载完毕等你去看了)。现在这样的事情可以通过上面的HTTP API链接更方便地完成了。
完成整个过程以后,你一定会有这样的体会,互联网其实就是一个硕大的数据库(不管URI的定义是否符合RESTful风格,它最多只能说是数据是不是能够以符合某种统一格式的方式来获取)。
- HTML、RSS、PDF……这些只是不同的数据格式而已,和内容无关,获取这些不同格式不同地址数据的组件可以叫做requester;
- XPATH、CSSPath……这些是针对不同数据,去解析这些数据,指定有用信息的路径表达式,解析这些数据的组件被称为parser;
- 存储每一内容条目使用哪个requester和哪个parser的配置,汇总在一个configuration的组件内;
- 现在,还需要一个调度器scheduler管理若干个线程(或进程)根据configuration去爬取数据了;
- 数据爬取完成后持久化到存储组件storage中。
有了上面这5个组件,一个特定信息的爬取程序就完成了,和一个传统意义上的网络爬虫相比,它更加简单,也不需要解析HTML链接含义的过程。
另外,值得注意的是,有时候网站会做反爬虫机制,与其去猜它反爬虫的规则,还不如通过脚本启动一个浏览器去请求页面。还有,页面之间的关联关系有时并不能够从<a href=”xxx”>这样的链接中发现,有时是通过JavaScript的Ajax请求等等实现,这种情况下的链接关系对网络爬虫并不友好,也可以通过启动一个真实的浏览器请求去获取。
Java有名的开源网络爬虫包括Heritrix和Nutch,后续我再详细介绍一下。
转载出自《四火的唠叨》
相关推荐
在IT领域,网络爬虫是一项重要的技术,尤其对于数据挖掘、数据分析和自动化信息获取来说更是不可或缺。本主题围绕“网络爬虫作业练习”,主要涉及Python编程语言和相关的爬虫技术,我们将深入探讨这些知识点。 首先...
Python网络爬虫与数据采集是一门技术课程,主要内容包括网络爬虫的基础知识、网络爬虫请求的基本处理、使用Python相关库进行网络请求、理解HTTP协议及其相关技术,以及如何应对常见的反爬虫策略等。 网络爬虫基础...
本篇文章《Python入门网络爬虫之精华版》主要介绍了Python网络爬虫的基础知识,从抓取、分析到存储的三个主要方面,以及如何应对一些常见的反爬虫机制。此外,还提及了Scrapy这一流行的爬虫框架,并提供了一个参考...
《Python网络爬虫技术案例教程》PPT课件(共10单元)七单元爬取APP和PC客户端数据.pdf《Python网络爬虫技术案例教程》PPT课件(共10单元)七单元爬取APP和PC客户端数据.pdf《Python网络爬虫技术案例教程》PPT课件(共10...
本书从Python的安装开始,详细讲解了Python从简单程序延伸到Python网络爬虫的全过程。本书从实战出发,根据不同的需求选取不同的爬虫,有针对性地讲解了几种Python网络爬虫。本书共8章,涵盖的内容有Python语言的...
网络爬虫是一种自动获取网页信息的技术,它模拟人类浏览网页的行为,通过编程方式遍历互联网上的页面,收集所需数据。在网络爬虫的论文答辩PPT中,主要涉及以下几个知识点: 1. **网络爬虫的基本原理**:网络爬虫...
解析Python网络爬虫_复习大纲.docx 本文档是关于Python网络爬虫的复习大纲,涵盖了爬虫的基本概念、实现原理、技术、网页请求原理、抓取网页数据、数据解析、并发下载、抓取动态内容、图像识别与文字处理、存储爬虫...
《基于网络爬虫技术的网络新闻分析》是一个涵盖了多种信息技术的综合应用,主要涉及网络爬虫、中文分词、中文相似度判定、数据结构化存储和数据可视化等关键环节。以下将详细介绍这些知识点: 1. **网络爬虫**:...
【Python网络爬虫代码】是基于Python3编程语言实现的一款数据抓取工具,主要用于从互联网上,特别是百度百科这类网站,自动获取指定网页中的信息。爬虫技术在信息技术领域扮演着重要角色,它能帮助我们高效地提取...
Python网络爬虫技术是当前IT领域中非常热门的一个分支,尤其在大数据分析和人工智能应用中起着关键作用。本资源“Python网络爬虫技术_习题答案.rar”看似是一个教学资料,包含了一些图像文件和章节内容,我们可以从...
在IT领域,网络爬虫是一种自动化程序,用于遍历互联网并抓取网页内容。本教程将专注于使用C#编程语言构建一个完整的网络爬虫。C#作为.NET框架的主要语言,提供了丰富的库和工具来实现这一目标。以下是关于“基于C#的...
Python网络爬虫是一种用于自动化获取网页内容的技术,广泛应用于数据挖掘、信息监控、自动化测试等领域。在本实习报告中,我们将深入探讨Python网络爬虫的相关知识,并通过实例演示如何使用Python爬虫框架来爬取豆瓣...
网络爬虫是一种能够自动收集网页数据的程序,通常也被称为网络蠕虫或网页蜘蛛。由于网络爬虫的活动目前主要受制于“君子协定”——robots.txt协议,因此它在法律上并未有明确的限制,这使得网络爬虫在“大数据”背景...
根据给出的文件内容,下面详细说明关于基于Python的网络爬虫技术研究的相关知识点。 ### 1. 网络爬虫系统需求的分析和设计 在研究网络爬虫技术时,首先需要对爬虫系统进行需求分析和设计。根据文件内容描述,一个...
在本课程设计中,基于Python的网络爬虫设计旨在让学生掌握网络爬虫的基本原理、实现方法以及在实际中的应用。通过该项目,学生能够学习到如何利用Python语言和相关库进行网页抓取、数据解析,并对抓取的数据进行有效...
《Python网络爬虫技术》教学大纲详细解析 Python网络爬虫技术是一门针对大数据技术类专业的必修课程,旨在培养学生利用Python语言进行网络数据抓取的能力。课程总学时为32学时,包括14学时的理论教学和18学时的实验...
网络爬虫和搜索引擎是互联网数据挖掘与信息处理的两个重要技术。它们在现代信息技术中扮演着不可或缺的角色,尤其是在大数据分析、市场研究、竞争对手分析、内容推荐系统等方面。 网络爬虫,也称为网络蜘蛛或Web...
网络爬虫论文答辩,网络爬虫论文答辩课件,网络爬虫论文答辩PPT
Python网络爬虫是一种用于自动化网页数据抓取的技术,它能够高效地从互联网上获取大量信息。本套教学资料深入解析了Python爬虫的核心技术、Scrapy框架以及分布式爬虫的实现,旨在帮助学习者掌握这一领域的核心技能。...