零、前言
本教程面向毫无编程基础的人群,讲述制作出爬虫所需要的最基本知识。目标是让你就算阅读代码如天书,凭借基本知识,复制代码以及使用搜索引擎也可以制作出可用的爬虫。
同时,本教程也是对笔者本人凭借基本知识,复制代码以及使用搜索引擎制作出可用爬虫的快速学习经历的总结归纳。
再同时,本教程也希望分享给读者三条快速学习哲学:
1、寻找趣味,保持专注。兴趣是最好的老师,发掘兴趣是最强的能力。
2、容忍无知,聚焦实用。在缺乏系统性知识的情况下,要快速涉猎不熟悉的领域并做出成果,需要控制知识与无知的平衡,抑制无知带来的焦虑和恐惧。容忍无知,即用为主,研究为辅。
3、合理抽象,善用搜索。你所遇到的问题几乎总已经被其他人遇到过了。抽象出正确的关键字,选择合适的搜索引擎(不论是百度,谷歌或者是知乎),问题常常可以迎刃而解。
本教程教学用例
爬取对象:中国玩具和婴童用品协会企业黄页
http://www.wjyt-china.org/pagecontrol.do?action=mygslist&object=ToyCompanyYellowAction
爬取任务:遍历企业黄页上的全部企业,进入每个企业的“公司介绍”页面,在公司介绍文本中搜索“研发”或“研制”字样。统计爬取公司总数,所有公司的名称,含有目标字样公司的数目及名称。
一、概述
网络爬虫(Web Crawler)简称爬虫。据百度百科定义,爬虫是按照一定的规则,自动地抓取万维网信息的程序或者脚本。
这个定义准确地抓住了三个关键点。第一,爬虫的目的是抓取网络上的信息,我们可以通过这个工具进行自动的信息爬取。第二,爬虫的本质是程序或脚本,我们需要一个程序或脚本的编辑器来制造它。第三、爬虫的行为是按规则进行的,我们需要为一个并不拥有“智慧”的机器人程序设计严格而严谨地行为规范。总的来说,当我们需要从网络上自动爬取信息,我们就通过程序编辑器,通过设定一系列的行为规范制造出一个机器人程序。这个程序就是爬虫。
爬虫作为机器人程序,具有能够快速且无休无止地爬取大量数据的优点。
二、知识结构
在能够亲手制作出理想的爬虫之前,我们首先需要学习爬虫技术及其前置知识。制作一个简单爬虫需要以下知识:HTML,JavaScript,Python,Python语言的urllib2库。
我们为什么需要这些知识呢?
首先,我们需要了解我们爬取的对象——网页。我们希望爬取网页中的信息,就需要首先了解信息在网页中是如何储存的。绝大多数情况下,网页以HTML为骨架,JavaScript为肌肉,CSS为皮肤。这个比喻是说,HTML制造网页的结构,JavaScript负责网页的动态内容,而CSS对网页进行装饰。我们的目的是爬取网页上的文字或图片等信息。因此,我们并不关心网页如何被排版或修饰,我们感兴趣的是写在HTML骨架中的信息,或者通过JavaScript动态地加载进网页的信息。这就是我们为什么需要学习HTML和JavaScript。
然后,我们需要了解我们爬取的工具——爬虫。通常,爬虫基于Python语言。Python语言简单明了,易于上手,是良好的脚本语言,非常适合进行爬虫的编写。urllib2库是Python官方内置的库(库相当于一个工具包,提供现成的工具)。我们可以通过它制作爬虫。这个库容易使用而且功能强大,只需要短短几行代码,我们就能造出不错的爬虫来。这就是我们为什么需要学习Python语言及其urllib2库。
制作一个爬虫来爬取数据的流程大致如下:
1、分析网页的HTML与JavaScript,了解想要的信息在网页源代码中的位置,或者如何通过源代码中记载的信息在其他地方找到。
2、通过爬虫抓取网页源代码。
3、通过Python处理源代码,获取所需信息。
这些知识易于上手,难于精通,内涵深邃,外延广泛,在这里不可能一一详述。我将会提供和爬虫制作相关的一些基本知识,并给出进一步学习的渠道。
三、HTML
在“菜鸟教程”或“w3school在线教程”可进行完整地入门学习。
网页是什么?网页不像是一个文件。他不需要被下载到我们的电脑上,通过双击打开。如果让我们描述网页,我们会说网页是浏览器的附属,我们总要通过浏览器浏览网页。网页上有多彩的文字图片,网页上有音频视频,网页上有转跳链接……我们熟悉网页,却也对他陌生。我们每天都与他相处,却从来不知道他为何物。
其实,网页是一个文件。网页是一个HTML文件。
HTML文件是一种我们不能直接读懂的文件。右键单机我们正在浏览的网页,点击“查看网页源代码”,我们就看到了HTML文件形式的网页。这种形态的网页充满了神秘的代码,除了能够看透真理序列的程序员强者,没人能够理解。但是浏览器可以解析HTML文件。浏览器将HTML文件翻译成我们能够理解的视觉语言——这里写上一些文字,那里放上一张图片……在浏览器的界面中,我们才能看到熟悉的网页。
HTML(HyperText Markup Language,超文本标记语言)是一种用于创建网页的标准标记语言。
HTML中,网页的各种组件,从不可见的作者信息,默认设置,到可见的文本,图片,超链接,都采取了统一的形式进行标记。这种形式就是:<标签>内容</标签>
。即用以尖括号括起的标签包裹在组件内容的两侧。这样就说明了组件内容的类型。网页就是由各个组件层层包裹,级级嵌套而成的。以我们要爬取的目标网页为例。
tips:右键点击网页,选择“查看网页源代码”可以查看网页完整代码。按F12或(以chrome浏览器为例)点击右上角省略号图标,选择“更多工具”-“开发者工具”可以打开开发者工具。开发者工具将源代码清晰地分层,并提供了许多强大的工具。例如,点击开发者工具左上角的箭头工具,并将鼠标移至网页内容上,网页内容相应的代码会自动在开发者工具中弹出。
可以看到,目标网页的整体源代码是一个HTML文件,被包裹在<html>...</html>
中(在本例中第一个html标签后接有补充信息,事实上,第一个标签中常常加入补充信息)。网页的第一个组件是头文件,这部分是不可见的,通常含有各种设置和框架,被包裹在<head>...</head>
中。第二个组件是被包裹在<body>...</body>
中的体文件,网页中文本、图片、超链接等各种可见元素都在其中。我们也可以在开发者工具中继续展开这些标签,查询其包裹的元素。
标签,也即元素的类型有很多种,例如<p>
引导一个段落,<a href="default.htm">
代表一个超链接,<div>
形成文档中的块级元素,<img src="URL" height="42" width="42">
是一个图片等等。HTML标签的含义是容易查询到的,我们不必刻意记忆。我们只需要知道,我们希望爬取的信息就是以这种方式记录在某个标签处。
在了解了这些基础知识之后,让我们着眼于本次的目标网页。
我们需要爬取黄页上各个公司的名称,并访问这些公司的介绍页面。可以看到,黄页上面就有公司的名称,他们在源代码的哪里呢?使用开发者工具的箭头工具点击“汕头市澄海区繁盛塑料厂”所在的区域,弹出的源码如下:
这说明在HTML中,一个公司的区域是一个由<div>
包裹的块级结构,这个结构具有class关键字,且class值为”neir_neir”。我们并不完全理解这些代码的含义。但是我们知道,通过这些独特的关键字,我们能够在源代码中寻找到这个位置,并进一步定位所需信息。展开<div>
结构,我们看到了如下源码:
惊喜!我们还没有找到显示在网页上的公司名称,就在<div>
标签之后发现了一段注释(不被浏览器解析,仅供人阅读,格式为<!--注释内容-->
)。这段注释中储存着公司名称。可以猜到,href(此关键字之后引导着一个URL——universal resource locator,统一资源定位符,即俗称的网址)后引导的必然是该公司页面的
URL。访问该URL(http://www.wjyt-china.org后加上图示URL,合成为http://www.wjyt-china.org/jsp/toy/usershop/companyindex.jsp?shopname=FS)之后发现果然如此,我们来到了公司页面的首页。
我们想要进一步访问公司的介绍页面。点击公司介绍,我们转跳至介绍页面,发现公司介绍页面网址为http://www.wjyt-china.org/cnshopcenter/FS/introduction。刚刚URL中恰好有一项shopname=FS。这样,我们看出了公司介绍页面URL的命名规律。公司介绍页面的URL是http://www.wjyt-china.org/cnshopcenter/公司代号/introduction,而公司代号就是就是注释中URL里shopname关键字之后引导的内容。
当然,就算没有这段注释,我们依然可以找到所需的资源。我们既然在网页上看到了公司的名称,并且可以通过点击超链接转跳进公司页面,就说明公司名称以及公司页面URL必然记录在某处。因为注释中的内容不被浏览器解析,我们在网页中接触到的不可能是注释中的内容。
阅读源码,发现这些信息就储存注释下方的<span>
内联元素(专有名词无需细究)之中的<a>
超链接中。href给出了公司页面URL,汉字字样显然就是公司名称。我们所需的信息储存在两个不同的位置,我们可以任选一处供爬虫爬取。
我们已经到达公司介绍页面,通过箭头工具,我们能够定位上图所示的公司介绍文本在源代码之中的位置。分析HTML中的信息总是如此,非常简单。定位如下:
介绍信息被包裹在<p>
之中。(这里有一个坑,之后的公司介绍信息并非均是这种形式,也有直接包裹在<div>
中的。这需要我们根据情况debug。)
这样,我们彻底完成了黄页中第一个公司名称的定位和介绍信息的定位。观察之后的公司,发现各个公司具有相同的HTML结构。这是容易想到的,各个公司在网页上看起来结构一致,源码必然也具有规律性。这样,我们弄懂了如何找到一个公司的名称与介绍页面,寻找其他公司的信息也不在话下了。
最终,就算我们毫无编程基础,阅读HTML源码如天书,我们也可以通过开发者工具的箭头工具定位网页元素在源码中的位置,并阅读源码找到我们想要的信息字样。确定了这些信息的位置,寻找到我们要爬取的信息的储存规律,分析HTML的这一步就算顺利完成了。
(未完待续)