中国数据新闻工作坊培训手册第五章 – 实操:用Python抓取数据(一)(视频)

分享给朋友:

大多数人先学创建网页,然后才学拆解网页,但数据新闻工作者却恰好相反。在本练习中,你将学习如何确定一个网页的内部结构,并通过Python 来抓取其中数据。

  1. 我们将使用来自环境保护部的一个页面。 使用FireFox到这个URL: http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?page=1

这页上面有一个表格,我们要抽取表格信息。其实,这儿有几百个页面,我们想获得所有这些页面中的数据,所以我们要做数据抓取。

用Python抓取数据 - 11

对电脑来说,每个网页不过是一些HTML代码。要看到这些代码,在Firefox菜单里选择Tools 工具 -> Web Developer 开发者 -> Page Source 页面源代码,你就会得到如下窗口:

用Python抓取数据 - 12

任何网页这样的源代码你都可以看到。每页由很多放在尖括号中的标签组成,比如<html> 和<div>。这些标签通常都是成对的:一个是开头标签,一个是结尾标签,中间是一些内容,如下:

<table>

  …

</table>

每个页面包含三种不同类型的代码。<script>标签中是Javascript代码,标明你和网页互动时网页做什么; <style>标签中是CSS代码,标明网页的外观,包括颜色,字体和每个部分的位置。其它的代码都是HTML代码,包含网页的实际内容。

  1. 但我们不要编写网页程序,而是要寻找和表格条目相对的HTML代码。为此我们要使用Inspect Element 查看元素 命令。右击页面上任何一处,此命令就会出现。

用Python抓取数据 - 13

点击此命令,查看器就会打开。该窗口与页面源代码显示的文本内容一样,不过内容更有组织。HTML是由元素和分元素组成的,查看器会自动打开到你点击的元素部分。

用Python抓取数据 - 14

<td> 标签的意思是”表格数据“。一个表格中的每个单元格起始标签为<td>,结尾标签为 </td>。每行的起始标签为<tr> (意思是表格行),结尾标签为 </tr> 。

点击<td> 旁边的小三角形,就可以看到标签中是什么 :是该单元格中的实际数据。

用Python抓取数据 - 15

 

每次你指向查看器中的一个元素, Firefox 就会显示该元素在原始页面中的位置。

用Python抓取数据 - 16

 

注意出现在开始<td>标签中的文字 class=”report1_2” 。这部分内容用户永远看不到。一个Class是程序员用来指出页面上不同元素的内部名称。另外一个给元素起名的方法是使用id(identifier的缩写)。很多元素都可以使用同样的class,但每个 id只能有一个元素。

你想抓取页面上的元素时,将使用class和id名字来指它们。

  1. 自己动手。使用查看器来找到包围整个表格的<table> 标签。该表格的id是什么?
  1. 下来我们需要安装一个叫做BeautifulSoup的Python模块, 该模块帮助我们使用HTML代码。

要做到这一点,我们必须从命令行来执行几个命令。要在Windows打开命令行,点击start(开始)菜单,寻找这样一个标志:

用Python抓取数据 - 17

你也可以通过寻找cmd来找到它。一旦有了以上命令(command)提示,你需要输入以下两行,而且在输入每行后按回车键:

cd \Python34\Scripts

pip install BeautifulSoup4

要是一切顺利,你会看到以下内容:

用Python抓取数据 - 18

到这儿你就可以关闭命令(command) 提示了。

5.现在我们换用Python来开始抓取该页数据。首先我们需要告诉Python阅读一个网页的内容。打开叫做IDLE(Python3.4 GUI)的Python编程环境。在File(文件)菜单选择New File (新文件),创设一个新程序,并输入以下代码:

用Python抓取数据 - 19

import 告诉Python 使用一个叫做urllib2的命令库。一个命令库是延伸基础Python语言的命令收藏。urllib2是用来下载网页的命令库。

上面图片中地址被切断了,但我们要抓取数据的页面完整地址是:

http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?page=1

在该行结尾URI后你必须要有一个引号来结束这个字串。

把此文件存为scraper.py。

如果一切顺利的话, 你的程序应当打印出该页的源代码, 即和你以前在Firefox中选择页面源代码时看到的完全相同的文字。

用Python抓取数据 - 20

  1. 现在我们将用 BeautifulSoup把页面上我们不感兴趣的所有部分剔除, 而只打印表格。 我们可以通过使用 BeautifulSoup的find 命令来找到只有一个特定class或id的特定类型的元素。将程序变为如下:

用Python抓取数据 - 21

(该图片是放大的图像, 所以URL被切断了, 但跟以前的url相同)。该程序的关键是以下这行:

table = soup.find(“table”, { “id” : “report1” })

它告诉Python 找到具有一个 <table> 标签 和report1 id的元素。程序运转成功后, 你会看到如下结果:

用Python抓取数据 - 22

  1. 独立练习: 现在我们在不同的一个页面试一下

http://www.stats.gov.cn/tjsj/zxfb/201412/t20141204_648022.html

修改scraper.py程序来打印该页上表格内容。使用查看器来找到表格的名字。别忘了class和id都可以用来定义内容。


点击进入下一章节:用Python抓取数据(二)
想回到目录请点击这里

作者简介

数据新闻工作坊

数据新闻网以引介全球范围内最顶尖的数据新闻实践为初衷,以推动数据开放及媒体革新为宗旨,面向中国的新闻从业者、媒体管理者、新传教育者以及对传媒感兴趣的设计师、程序员,提供线上信息平台与线下交流机会。