形象地讲,若把互联网比作一张巨网,网络爬虫便是在网上爬行的蜘蛛。网络蜘蛛可在互联网的各个网页节点间模拟访问,收集数据并保存,以此获取想要的内容。

爬虫的工作流程

网络爬虫是一个自动化程序,可以模拟人类的行为完成网页获取、信息提取和数据保存的过程。在需要快速获取大量数据的场景,使用爬虫将是最佳选择。健壮的爬虫能很好地处理各种异常、执行错误后重试,确保爬取持续高效地运行。

获取网页

获取网页,即获取网页源代码。对 Python 而言,发起请求、接收响应以获取网页的过程可由许多库协助完成,如 ullib、requests 等。

获取网页源码后才能继续解析网页的 body 部分。

提取信息

从网页源码提取信息的方式很多,如使用普适但复杂的正则表达式,或根据网页节点属性、CSS 选择器、XPath 选择器提取等,涉及到的库有 Beautiful Soup、pyquery、Ixml 等。

保存数据

提取信息并结构化后,一般会将数据保存以便下次使用。具体的形式有:将数据写入 TXT / JSON 文本文件,或保存到 MySQL 或 MongoDB 等数据库,或借助 SFTP 将数据保存至远程服务器等。

由 JavaScript 渲染的页面

越来越多的网页开始采用 Ajax、前端模块化工具完成构建,原始 HTML 文件不含有用的信息,而几乎整个网页都由 JavaScript 渲染,使得用 urlib 或 requests 抓取到的网页的源代码与浏览器中的源代码不同。如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>This is a Demo</title>
  6. </head>
  7. <body>
  8. <div id="container"></div>
  9. </body>
  10. <script src="app.js"></script>
  11. </html>

此实例的body节点仅含一个idcontainer的节点,且在body节点后引入了app.js参与整个网站的渲染。

  • 用浏览器访问:加载 HTML 后将执行其中的 JavaScript 代码,依靠它改变 HTML 的节点层次与内容,最终呈现完整页面;
  • 用爬虫的 urllib 或 requests 等库访问:只得到最初的 HTML 代码而不会继续加载并执行其中的 JavaScript 代码,网页不能完整呈现。

为了应对这种情形,需要分析源代码后台的 Ajax 接口,或使用 Selenium、Splash、Pyppeteer、Playwright 等库模拟 JavaScript 的渲染。

支持采集的数据类型

若能找到目标内容的 URL,基于 HTTP 或 HTTPS 协议,爬虫可以实现以下类型的数据采集:

  1. HTML 源代码;
  2. JSON 对象;
  3. 包括图片、视频、音频在内的各种二进制数据;
  4. CSS、JavaScript 等其他文件。