介绍
从网络中抓取数据的必要性和重要性不言而喻。每隔几周,我都会发现自己有从互联网中挖掘数据的需要。例如,上周我们想创建一个指标,该指标是关于网络上各种可用的数据科学课程的热度和观点。这不仅要求我们找出新的课程,还要从网络上挖掘出他们的观点,然后把这些总结成几项指标。这个问题(或者说产品)的功效更取决于网络挖掘和信息抓取(数据采集),而不是汇总数据的技能。
从网页中挖掘信息的方法
从网络中抓取信息的方法有很多。使用API(应用程序编程接口)或许是从网站上抓取数据的最好方法。几乎所有的大型网站,像Twitter、 Facebook、Google、StackOverflow都使用API来使得他们的数据更加结构化。如果你能通过一种API来获取所需,那这会比网络挖掘更加便捷。因为,如果你能够从提供者那里获得结构化的数据,又何必自创一个引擎去抓取相同的信息?
遗憾的是,并非所有的网站都会提供API。因为有的网站不希望浏览者从中获得大量的结构化信息。而其他网站不提供API,是因为他们缺少相应的技能知识。在这些情况下,你会怎么做呢?因此,我们需要挖掘网站来获取信息。
或许会有像RSS Feeds的其他一些方法,但是这些方法在使用上受限制,因此我在此就不讨论了。
什么是网页数据挖掘?
网页数据挖掘是一种从网站上抓取信息的计算机软件技术。这种技术主要集中在将网络上的非结构化数据(HTML格式)转换为结构化数据(数据库或电子表格)。
网页信息挖掘的方法有很多种,包括在任何编程语言下使用Google Docs(谷歌办公套件)。我选择使用Python语言,因为它十分便捷而且有丰富的生态环境。它有一个名为“BeautifulSoup”的库,可以用来完成本文中的网页数据挖掘任务。本文将告诉你,学习使用Python来完成网络挖掘的最简单方法。
对于那些需要以非编程方式从网页上抓取信息的人,可以查看import.io这个网站,它提供了一个图形用户界面驱动的接口,来执行所有基本的网页抓取操作。黑客们,请继续阅读本文吧!
网页数据挖据所需的库
众所周知,Python是开源的编程语言。你可以找到很多库来执行一个函数。因此,寻找到高效的库是很有必要的。我更偏爱BeautifulSoup(Python库)。因为它操作简单且直观。确切地说,我要用两个Python模块抓取数据:
- Urllib2: 是一个Python模块,可用于获取URL。它定义了函数和类来帮助URL行为(基本和摘要的身份验证,重定向,信息记录等)。更详细的参考文档。
- BeautifulSoup:是一个从网页上获取信息十分好用的工具。你可以使用它来提取表格,列表,段落,你也可以使用过滤器来从网页中提取信息。在这篇文章中,我们将使用最新版本BeautifulSoup 4。安装说明请见参考文档。
BeautifulSoup 并不能为我们获取网页地址,因此我们要把Urllib2库和BeautifulSoup库结合使用。
除了BeautifulSoup之外,Python还有其他一些选择可用来抓取HTML信息,例如:
- Mechanize
- Scrapemark
- Scrapy
基础技能——熟悉HTML标签
在进行网络挖掘时,我们需要处理很多HTML标签,因此我们必须很好地理解这些标签。如果你已经熟悉了HTML基础,可以跳过此部分。下面是HTML的基本语法:
此语法的各种标签解释如下:
- <!DOCTYPE html> :HTML文件开头必须有一个声明文档;
- HTML文件部分被包含在<html>和</html>之间;
- HTML的可见部分被含在<body>和</body>之间;
- HTML 标题的字体由<h1>到<h6>标签定义;
- HTML的段落由<p>标签定义。
其他一些有用的HTML标签:
- HTML的超链接用<a>标签定义,例如:“<a href=“http://www.test.com”>This is a link for test.com</a>”
- HTML中的表格用<table>定义。行用<tr>表示,而行中的单元格用<td>表示
3.HTML的列表用<ul>(无序)和<ol>(有序)定义,列表的每个项子目用<li>表示
如果你第一次接触这些HTML标签,我建议你参考W3CSchool上面的HTML教程,上面关于HTML标签的解释说明十分通俗易懂。
使用BeautifulSoup进行网络挖掘
现在,我正在从维基百科上挖据数据,我们的最终目的是从这个维基百科网页上获取印度各邦、联邦的首都信息,和一些基本的细节信息,像建立的时间、前首都以及其他一些信息等。接下来让我们一步一步学习这个项目:
- 导入必要的库:
- 使用“prettify”函数,查看嵌套的HTML结构:
从上图中,你可以看到HTML标签的结构。这将帮助您了解不同类型的可用标签,以及如何使用这些标签来抓取信息。
3.使用HTML 标签
a.soup.<tap>:返回开始和结束标签之间的内容,包括标签本身。
b.soup.<tag>.string:返回制定标签中的字符串
c.找到网页中所有的超链接<a>标签:我们都知道可以使用<a>标签来标记一个超链接,因此,我们用soup.a标签,就会返回网页中所有可用的超链接,让我们试一试吧:
以上,你会发现我们只有一个输出结果。现在,我们可以用<a>标签获取所以的超链接,我们将用到“find_all()”函数。
上图中,显示了所有的超链接,包括了标题、链接地址和其他一些信息。下面,只显示链接,我们需要用“href”标签的“get”属性,遍历每一个标签,然后返回链接地址。
4.找到正确的表格:当我们正在寻找一个表来挖掘有关国家首都的信息时,我们应该首先识别正确的表。现在我们写命令,来抓取所有“table”标签中的信息。
现在要确定正确的表格,我们将使用表格的属性“类”,并用它来选择正确的表格。在Chrome浏览器中,你可以通过右键点击网页上的所需的表的名称-检查元素-复制的类名称或通过上述命令的输出查找右表的类名称。
5.从数据集中抓取信息:在这里,我们需要遍历每一行<tr>然后将行的每个元素<td>赋给一个变量,并将它添加到列表。让我们先看看HTML的表格结构(我不会抓取表格的标题<th>信息):
上图中,你会发现<tr>的子元素被包含在<th>标签而不是<td>中,因此我们处理时要十分注意。现在给每个元素赋值,我们将对每个元素使用“find(text=True)”选项。让我们看看代码:
最后,我们得到数据集中的数据:
同样的,你可以借助“BeautifulSoup”库来挖掘其他类型的网页,这会提高你进行网络挖掘的效率。你也可以使用标签名称查看其他一些属性,比如parent、contents、descendants、.next_slbling、.prev_sibling以及利用各种属性进行导航。这会帮助你有效地进行网络挖掘。
为什么不能用正则表达式实现这个功能呢?
如果你了解正则表达式的话,也许你会想要使用正则表达式来实现相同的功能。我的确想过这个问题,在我使用BeautifulSoup库和正则表达式来做同一个项目时,有以下发现:
- 用BeautifulSoup来写代码要比正则表达式更具鲁棒性(所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。)。用正则表达式写代码时,网页中的任何变化,都需要改变。即使一些情况下,使用BeautifulSoup也需要做出改动,但是相对会更好的。
- 正则表达式的运行速度要比BeautifulSoup快得多,通常得出相同的结果只需花百分之一。
因此,将其归结为代码的速度和鲁棒性对比,并不能得出哪个使用效果最好。如果能用更简单的正则表达式语句来获取所需的信息,那或无疑问你应该使用它。但是对于几乎大多数复杂的网络挖掘工作,我通常建议更多使用BeautifulSoup。
结束语
本文中,我们学习了基于Python“BeautifulSoup”和“urllib2”的网络挖据方法,同时也学习了一些HTML的基本语法,并一步一步演示了如何去挖掘一个网站。但是我建议你们可以对照这篇文章多加练习,用上面的方法从不同的网页上抓取信息。
本文由 翻译小组 翻译发布,英文链接:,转载或内容合作请联系我们,未经允许谢绝转载,本文链接:https://www.afenxi.com/38255.html 。