前言

对那些没有学过编程的人来说,计算机编程看着就像变魔术。如果编程是魔术(magic),那么网络数据采集(Web scraping)就是巫术(wizardry);也就是运用“魔术”来实现精彩实用却又不费吹灰之力的“壮举”。

说句实话,在我的软件工程师职业生涯中,我几乎没有发现像网络数据采集这样的编程实践,可以同时吸引程序员和门外汉的注意。虽然写一个简单的网络爬虫并不难,就是先收集数据,再显示到命令行或者存储到数据库里,但是无论你之前已经做过多少次了,这件事永远会让你感到兴奋,同时又有新的可能。

不过遗憾的是,当和别的程序员提起网络数据采集时,我听到了很多关于这件事的误解与困惑。有些人不确定它是不是合法的(其实合法),有人不明白怎么处理那些到处都是 JavaScript、多媒体和 cookie 的新式网站,还有人对 API 和网络爬虫的区别感到困惑。

这本书的初衷是要解决人们对网络数据采集的诸多问题与误解,并对常见的网络数据采集任务提供全面的指导。

从第 1 章开始,我将不断地提供代码示例来演示书中内容。这些代码示例是开源的,无论注明出处与否都可以免费使用(但若注明会让作者感激不尽)。 

什么是网络数据采集

在互联网上进行自动数据采集这件事和互联网存在的时间差不多一样长。虽然网络数据采集并不是新术语,但是多年以来,这件事更常见的称谓是网页抓屏(screen scraping)、数据挖掘(data mining)、网络收割(Web harvesting)或其他类似的版本。今天大众好像更倾向于用“网络数据采集”,因此我在本书中使用这个术语,不过有时会把网络数据采集程序称为网络机器人(bots)。

理论上,网络数据采集是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表单或其他网页文件),然后对数据进行解析,提取需要的信息。

实践中,网络数据采集涉及非常广泛的编程技术和手段,比如数据分析、信息安全等。本书将在第一部分介绍关于网络数据采集和网络爬行(crawling)的基础知识,一些高级主题放在第二部分介绍。

为什么要做网络数据采集

如果你上网的唯一方式就是用浏览器,那么你其实失去了很多种可能。虽然浏览器可以更方便地执行 JavaScript,显示图片,并且可以把数据展示成更适合人类阅读的形式,但是网络爬虫收集和处理大量数据的能力更为卓越。不像狭窄的显示器窗口一次只能让你看一个网页,网络爬虫可以让你一次查看几千甚至几百万个网页。

另外,网络爬虫可以完成传统搜索引擎不能做的事情。用 Google 搜索“飞往波士顿最便宜的航班”,看到的是大量的广告和主流的航班搜索网站。Google只知道这些网站的网页会显示什么内容,却不知道在航班搜索应用中输入的各种查询的准确结果。但是,设计较好的网络爬虫可以通过采集大量的网站数据,做出飞往波士顿航班价格随时间变化的图表,告诉你买机票的最佳时间。

你可能会问:“数据不是可以通过 API 获取吗?”(如果你不熟悉 API,请阅读第 4 章。)确实,如果你能找到一个可以解决你的问题的 API,那会非常给力。它们可以非常方便地向用户提供服务器里格式完好的数据。当你使用像 Twitter 或维基百科的 API 时,会发现一个 API 同时提供了不同的数据类型。通常,如果有 API 可用,API 确实会比写一个网络爬虫程序来获取数据更加方便。但是,很多时候你需要的 API 并不存在,这是因为:

  • 你要收集的数据来自不同的网站,没有一个综合多个网站数据的 API;
  • 你想要的数据非常小众,网站不会为你单独做一个 API;
  • 一些网站没有基础设施或技术能力去建立 API。

即使 API 已经存在,可能还会有请求内容和次数限制,API 能够提供的数据类型或者数据格式可能也无法满足你的需求。

这时网络数据采集就派上用场了。你在浏览器上看到的内容,大部分都可以通过编写 Python 程序来获取。如果你可以通过程序获取数据,那么就可以把数据存储到数据库里。如果你可以把数据存储到数据库里,自然也就可以将这些数据可视化。

显然,大量的应用场景都会需要这种几乎可以毫无阻碍地获取数据的手段:市场预测、机器语言翻译,甚至医疗诊断领域,通过对新闻网站、文章以及健康论坛中的数据进行采集和分析,也可以获得很多好处。

甚至在艺术领域,网络数据采集也为艺术创作开辟了新方向。由 Jonathan Harris 和 Sep Kamvar 在 2006 年发起的“我们感觉挺好”(We Feel Fine,http://wefeelfine.org/)项目,从大量英文博客中抓取许多以“I feel”和“I am feeling”开头的短句,最终做成了一个很受大众欢迎的数据可视图,描述了这个世界每天、每分钟的感觉。

无论你现在处于哪个领域,网络数据采集都可以让你的工作更高效,帮你提升生产力,甚至开创一个全新的领域。

关于本书

本书不仅介绍了网络数据采集,也为采集新式网络中的各种数据类型提供了全面的指导。虽然本书用的是 Python 编程语言,里面涉及 Python 的许多基础知识,但这并不是一本 Python 入门图书。

如果你不太懂编程,也完全不了解 Python,那么这本书看起来可能有点儿费劲。但是,如果你懂编程,那么书中的内容可以很快上手。附录 A 介绍了 Python 3.x 版本的安装和使用方法,全书将使用这个版本的 Python。如果你的电脑里只装了 Python 2.x 版本,可能需要先看看附录 A。

1 是本非常好的教材,只是书有点儿厚。如果不想看书,Jessica McKellar 的教学视频 Introduction to Python(http://shop.oreilly.com/product/110000448.do)也非常不错。

1中文版已经由人民邮电出版社出版。——编者注

附录 C 介绍并分析了几个商业案例以及犯罪事件,可以帮助你了解如何在美国合法地运行网络爬虫并使用数据。

技术书通常都是介绍一种语言或技术,而网络数据采集是一个比较综合的主题,涉及数据库、网络服务器、HTTP 协议、HTML 语言、网络安全、图像处理、数据科学等内容。本书尝试涵盖网络数据采集的所有内容。

第一部分深入讲解网络数据采集和网络爬行相关内容,并重点介绍全书都要用到的几个 Python 库。这部分内容可以看成这些库和技术的综合参考(对于一些特殊情形,后面会提供其他参考资料)。

第二部分介绍读者在动手编写网络爬虫的过程中可能会涉及的一些主题。不过,这些主题的范围特别广泛,这部分内容也不足以道尽玄机。因此,文中提供了许多常用的参考资料来补充更多的信息。

本书结构组织灵活,便于你直接跳到感兴趣的章节中阅读相应的网络数据采集技术。如果一个概念或一段代码在之前的章节中出现过,那么我会明确标注出具体的位置。

排版约定

本书使用了下列排版约定。

  • 楷体
    表示新术语。

constant width


  • 表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
  • 加粗等宽字体(constant width bold
    表示应该由用户输入的命令或其他文本。
  • 斜体等宽字体(constant width italic
    表示应该替换成用户输入的值,或根据上下文替换的值。


python 485 网络信号采集与控制_python

 该图标表示提示或建议。

python 485 网络信号采集与控制_Python_02

  该图标表示一般性说明。

python 485 网络信号采集与控制_数据采集_03

 该图标表示警告或警示。