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

分享给朋友:

做过从网页抓取元素的基本练习后,我们现在要把数据抓取程序扩用到几百个网页,从其中每个网页上的表格抓取干净的数据。

  1. 先到上次大家用过的程序:

用Python抓取数据 1

运转此程序,产生的内容结尾部分应当如下:

用Python抓取数据 2

  1. find命令会找出符合你标明的标签, id 或class的第一个东西。findAll找到所有符合你要求的东西。它会产生一个清单,而不是单个的值。

这里我们要找到表格里所有的<tr>标签。tr的意思是“表格里的行”, 所以清单里每个内容都是一行数据。我们打印时在每行之间都加了横线,以使得打印结果更容易看。

用Python抓取数据 3

程序运转的结果应当如下:

用Python抓取数据 4

  1. 每行都有几个单元格,每个单元格都在一个<td>(意思是“表格数据”)标签里。我们可以对每行都用findAll来获得一个列出那行中单元格的清单,然后用方括号 [ ] 来标明该清单中的单个项。我们这样来获得每行里每个单元格的数据。

用Python抓取数据 5

用Python抓取数据 6

  1. 最后的一个程序出了错。要改正此错误,我们必须只处理那些实际包含有数据的行。幸运的是,这些行都以行数打头,而行数我们可以查看。我们可以用一个if句子和两个新功能 == None and isDigit 来查看行数。

用Python抓取数据 7

换一换此程序第一行中的a值:

   a = “999”

     a = “10”

     a = None

     a = “Nihao!”

看运转后结果怎样。

  1. 现在我们可以使用这一原则来只打印包含数据的行。

用Python抓取数据 8

结果应当如此:

用Python抓取数据 9

  1. 现在我们要打印同样的信息,但在每个内容之间添加逗号。这是很多程序都能阅读的CSV格式。

用Python抓取数据 10

注意你可以使用+号来把几个串合并为一。结果如下:

用Python抓取数据 11

 

 

 

  1. 现在我们可以从每一页都抓取数据。注意我们这页的URL以page=1结尾。我们可以改变此数字,以对每页数据进行计数。我们从一个没有页数的URL开始,见下:

urlBase = “http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?page=”

然后我们用一个for环针对每页来运转主编码部分一次。虽然页数是从1到 13, 我们得用  (1,14)这样一个范围,因为范围实际上数到比上限数小一。 (Python的设计是这样,使得(a,b)序列和(b,c)序列连接起来时数字没有重复或缺失)。

用Python抓取数据 12

这个程序会针对很多页进行运转,但有错误。

用Python抓取数据 13

  1. 错误信息意味着Python遇到了一个没有内容的城市名,日期,或空气质量指数,不知该如何打印。要解决此问题,我们使用str的功能,使得Python在找到一个没有内容的单元格时,会打印None。

用Python抓取数据 14

  1. 最后一步是将所有这些输出内容写入一个文件。要做到这一步,我们需要两个命令:OPEN告诉Python用什么文件名。w 意味着我们要写入该文件,encoding=”utf-8″告诉Python如何把中文写入该文件。然后我们再加一个包含 file = f 的print (打印)语句,来书写每行数据。

用Python抓取数据 15

程序运转完后,在你程序文件所在的同一个目录中寻找一个叫做output.csv 的文件。这个文件像别的CSV文件一样,可以在Excel中打开。


点击进入下一章节:如何学习更多编程知识
想回到目录请点击这里

作者简介

数据新闻工作坊

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