零基础简单爬虫制作(以wjyt-china企业黄页爬虫为例)(上)

零、前言 
本教程面向毫无编程基础的人群,讲述制作出爬虫所需要的最基本知识。目标是让你就算阅读代码如天书,凭借基本知识,复制代码以及使用搜索引擎也可以制作出可用的爬虫。 
同时,本教程也是对笔者本人凭借基本知识,复制代码以及使用搜索引擎制作出可用爬虫的快速学习经历的总结归纳。 
再同时,本教程也希望分享给读者三条快速学习哲学: 
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的这一步就算顺利完成了。 
(未完待续)

时间: 2024-11-01 23:20:02

零基础简单爬虫制作(以wjyt-china企业黄页爬虫为例)(上)的相关文章

零基础HTML5游戏制作教程 第6章 贪吃蛇的实现及代码

第6章 贪吃蛇的实现及代码 讲了不少东西了,老讲理论的东西没劲呀,我们不如先试着做一个小游戏吧. 作为我们的第一个游戏,当然是越简单越好.<贪吃蛇>大家应该都玩过吧?我觉得我玩过的游戏中,她应该算是最简单的一个了.好,就让我们从做<贪吃蛇>开始,享受自己做游戏的乐趣吧. 由于这个游戏是本教程的第一个实际的游戏例子,我会讲的比较详细一些.请大家重点注意编程的思路和实现的方法,这些远比代码本身要重要. 一,蛇身的制作 蛇身由一系列方格组成,初始我们设定蛇身的长度是4,以后每吃到一次食物

零基础HTML5游戏制作教程 第2章 简单图形的绘制

第二章 简单图形的绘制 HTML5支持使用Canvas和SVG等方式在网页直接绘制图形.其中SVG适合用来绘制高质量的矢量图形,不适合用来做游戏,所以我们做游戏一般使用Canvas. 由于本教程以简单为原则,所以在初学阶段请不要把注意力分散到美工.画质等细节,我们只需要掌握矩形.多边形.圆形等简单图形的绘制,并对这些图形编程,使之具有一定的运动能力和游戏效果. (如果你偷懒,你甚至可以跳过本章中多边形和圆形的绘制,只学矩形,然后直接去看下一章.) 一,矩形的绘制 命令的格式是context.fi

零基础HTML5游戏制作教程 第5章 碰撞检测

第5章 碰撞检测 几乎所有的游戏都需要碰撞检测.比如<贪吃蛇>,你需要检测蛇的前端是不是已经碰到了它的尾巴:比如<俄罗斯方块>,你需要检查方块是不是已经碰到了底部:比如<英雄联盟>,你需要判断adc的子弹或魔法是不是已经碰到了对方. 其实要做好碰撞检测是很难的,尤其是对于3d游戏或者图形复杂的2d游戏来说. 当然,对于简单图形来说,碰撞检测还是比较容易的,本章将分别介绍圆形的碰撞检测,矩形的碰撞检测,以及逻辑碰撞检测. 一,圆形碰撞检测 圆形间碰撞检测的原理是最简单的,

零基础HTML5游戏制作教程 第4章 移动的控制

第4章 移动的控制 一,捕获键盘击键的原理 有很多种方法可以控制游戏中图形的移动,常用的有键盘控制.鼠标控制以及屏幕上的按钮控制等.其中键盘控制比较简单,比较适合初学者,我们先来讲这种方法. 其实键盘上的每一个按键,在我们按下去的时候,会向电脑中传送一个编号.比如A的编号是65,B是66.在这一章里,我们只需要记住4个键就可以了,她们是光标的上下左右键.向上的编号是38,向下是40,向左是37,向右是39. 所以键盘捕获的原理其实很简单,就是读取键盘传到电脑中的编号,然后根据这个编号来判断哪个键

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

原文:Android零基础入门第60节:日历视图CalendarView和定时器Chronometer 上一期学习了AnalogClock.DigitalClock和TextClock时钟组件,本期继续来学习日历视图CalendarView和定时器Chronometer. 一.CalendarView 日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触 摸来滚动日历.如果希望监控该组件的日期改变,则可调用CalendarView的 setOnDateCha

零基础XAMPP for Linux虚拟机建站教(笔)程(记)

之所以写零基础是因为自己确实从零开始摸索.踩坑,严格意义上来说仅仅作为记录自己操作流程的一个笔记,并没有拔高到教程程度. XAMPP一般用作开发环境,或供学习之用:在Windows系统下使用比较简单,且网上教程很多,而Linux下的教程则很少或不全:这里只记录全新安装虚拟机Linux系统下的建站步骤,且不涉及前端代码与PHP方面. 用到的软件: 1)VMware workstation 12.0.0: 2)CentOS 6.4 镜像: 3)XAMPP for Linux: 4)XShell 4:

零基础写python爬虫之urllib2使用指南

零基础写python爬虫之urllib2使用指南 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: import urllib2   enable_proxy = True   proxy_handler = urllib2.Prox

零基础自学Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha

上一回, 我学会了 用伪代码写出爬虫的主要框架; 用Python的urllib.request库抓取指定url的页面; 用Python的urllib.parse库对普通字符串转符合url的字符串. 这一回, 开始用Python将伪代码中的所有部分实现. 由于文章的标题就是"零基础", 因此会先把用到的两种数据结构队列和集合介绍一下. 而对于"正则表达式"部分, 限于篇幅不能介绍, 但给出我比较喜欢的几个参考资料. Python的队列 在爬虫程序中, 用到了广度优先搜

javascript入门视频第一天 小案例制作 零基础开始学习javascript

JavaScript 是我们网页设计师必备的技能之一.我们主要用javascript来写的是网页特效.我们从零基础开始学习javascript入门. 但是,好的同学刚开始不知道怎么学习,接触js,因此,小强老师给大家写了这篇入门的javascript文章.从零基础开始学习js,使大家入门更简单,希望大家喜欢.JavaScript是一种脚本语言. 也是我们web网络中最为流行一种脚本语言.脚本语言:     1.不是独立存在的.需要依附.js就是依附在浏览器中.     2.脚本语言也是语言,也有