形象地讲,若把互联网比作一张巨网,网络爬虫便是在网上爬行的蜘蛛。网络蜘蛛可在互联网的各个网页节点间模拟访问,收集数据并保存,以此获取想要的内容。
爬虫的工作流程
网络爬虫是一个自动化程序,可以模拟人类的行为完成网页获取、信息提取和数据保存的过程。在需要快速获取大量数据的场景,使用爬虫将是最佳选择。健壮的爬虫能很好地处理各种异常、执行错误后重试,确保爬取持续高效地运行。
获取网页
获取网页,即获取网页源代码。对 Python 而言,发起请求、接收响应以获取网页的过程可由许多库协助完成,如 ullib、requests 等。
获取网页源码后才能继续解析网页的 body 部分。
提取信息
从网页源码提取信息的方式很多,如使用普适但复杂的正则表达式,或根据网页节点属性、CSS 选择器、XPath 选择器提取等,涉及到的库有 Beautiful Soup、pyquery、Ixml 等。
保存数据
提取信息并结构化后,一般会将数据保存以便下次使用。具体的形式有:将数据写入 TXT / JSON 文本文件,或保存到 MySQL 或 MongoDB 等数据库,或借助 SFTP 将数据保存至远程服务器等。
由 JavaScript 渲染的页面
越来越多的网页开始采用 Ajax、前端模块化工具完成构建,原始 HTML 文件不含有用的信息,而几乎整个网页都由 JavaScript 渲染,使得用 urlib 或 requests 抓取到的网页的源代码与浏览器中的源代码不同。如:
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>This is a Demo</title></head><body><div id="container"></div></body><script src="app.js"></script></html>
此实例的body节点仅含一个id为container的节点,且在body节点后引入了app.js参与整个网站的渲染。
- 用浏览器访问:加载 HTML 后将执行其中的 JavaScript 代码,依靠它改变 HTML 的节点层次与内容,最终呈现完整页面;
- 用爬虫的 urllib 或 requests 等库访问:只得到最初的 HTML 代码而不会继续加载并执行其中的 JavaScript 代码,网页不能完整呈现。
为了应对这种情形,需要分析源代码后台的 Ajax 接口,或使用 Selenium、Splash、Pyppeteer、Playwright 等库模拟 JavaScript 的渲染。
支持采集的数据类型
若能找到目标内容的 URL,基于 HTTP 或 HTTPS 协议,爬虫可以实现以下类型的数据采集:
- HTML 源代码;
- JSON 对象;
- 包括图片、视频、音频在内的各种二进制数据;
- CSS、JavaScript 等其他文件。
