从网页抓取数据(总不能手工去网页源码吧?担心,Python提供了许多库来帮助)
优采云 发布时间: 2022-04-06 16:16从网页抓取数据(总不能手工去网页源码吧?担心,Python提供了许多库来帮助)
大家好,我是悦创。
我们可以把互联网比作一个大的网络,爬虫(即网络爬虫)是在网络上爬行的蜘蛛。如果把网络的节点比作网页,爬虫爬取就相当于访问页面并获取其信息。节点之间的连接可以比作网页和网页之间的链接关系,这样蜘蛛经过一个节点后,可以继续沿着节点连接爬行到达下一个节点,即继续通过一个网页获取后续网页,使得整个网页的节点都可以被蜘蛛爬取,并且可以抓取到网站的数据。
1. 爬虫概述
简而言之,爬虫是一种自动程序,可以获取网页并提取和保存信息,如下所述。
1.1 获取网页
爬虫要做的第一个工作就是获取网页,这里是网页的源代码。
源代码中收录了网页的一些有用信息,所以只要得到源代码,就可以从中提取出想要的信息。
前面讨论了请求和响应的概念。向网站的服务器发送请求,返回的响应体就是网页的源代码。那么,最关键的部分就是构造一个请求并发送给服务器,然后接收响应并解析出来,那么这个过程如何实现呢?你不能手动截取网页的源代码,对吧?
不用担心,Python 提供了很多库来帮助我们做到这一点,比如 urllib、requests 等。我们可以使用这些库来帮助我们实现 HTTP 请求操作。请求和响应都可以用类库提供的数据结构来表示。得到响应后,我们只需要解析数据结构的Body部分,即获取网页的源代码。这样,我们就可以使用程序来实现获取网页的过程了。
1.2 提取信息
得到网页的源代码后,接下来就是分析网页的源代码,从中提取出我们想要的数据。首先,最常用的方法是使用正则表达式提取,这是一种通用的方法,但是在构造正则表达式时比较复杂且容易出错。
另外,因为网页的结构有一定的规则,所以也有一些库是根据网页节点属性、CSS选择器或者XPath来提取网页信息的,比如Beautiful Soup、pyquery、lxml等。使用这些库,我们可以高效、快速地提取网页信息,如节点属性、文本值等。
提取信息是爬虫非常重要的一个环节,它可以把杂乱的数据整理好,方便我们后期对数据进行处理和分析。
1.3 保存数据
提取信息后,我们一般将提取的数据保存在某处以备后用。这里的保存有多种形式,比如简单的保存为TXT文本或者JSON文本,或者保存到数据库,比如MySQL和MongoDB,或者保存到远程服务器,比如使用SFTP操作。
1.4 自动化程序
说到自动化程序,我的意思是爬虫可以代替人类执行这些操作。首先,我们当然可以手动提取这些信息,但是如果当量特别大或者想要快速获取大量数据,还是得使用程序。爬虫是代表我们完成爬取工作的自动化程序。可以在爬取过程中进行各种异常处理、错误重试等操作,保证爬取持续高效运行。
2. 我可以捕获什么样的数据
我们可以在网页中看到各种各样的信息,最常见的是常规网页,它们对应的是HTML代码,而最常见的爬取就是HTML源代码。
此外,有些网页可能会返回 JSON 字符串而不是 HTML 代码(大多数 API 接口使用这种形式)。这种格式的数据易于传输和解析。它们也可以被捕获,并且数据提取更方便。
此外,我们还可以看到图片、视频、音频等各种二进制数据。使用爬虫,我们可以抓取这些二进制数据,并保存为对应的文件名。
此外,您还可以看到具有各种扩展名的文件,例如 CSS、JavaScript 和配置文件。这些实际上是最常见的文件。只要它们可以在浏览器中访问,您就可以抓取它们。
上面的内容其实是对应了它们各自的URL,是基于HTTP或者HTTPS协议的。只要是这种数据,爬虫就可以爬取。
3. JavaScript 渲染页面
有时候,当我们用 urllib 或 requests 爬取网页时,得到的源代码实际上与我们在浏览器中看到的不同。
这是一个非常普遍的问题。如今,越来越多的网页使用 Ajax 和前端模块化工具构建。整个网页可能会被 JavaScript 渲染,这意味着原创的 HTML 代码只是一个空壳,例如:
body节点中只有一个id为container的节点,但是需要注意的是在body节点之后引入了app.js,负责渲染整个网站。
在浏览器中打开页面时,会先加载HTML内容,然后浏览器会发现其中引入了一个app.js文件,然后再去请求该文件。获取文件后,会执行 JavaScript 代码,JavaScript 改变 HTML 中的节点,添加内容,最终得到一个完整的页面。
但是当用 urllib 或 requests 等库请求当前页面时,我们得到的只是这段 HTML 代码,它不会帮助我们继续加载这个 JavaScript 文件,所以我们在浏览器中看不到内容。
这也解释了为什么有时我们得到的源代码与我们在浏览器中看到的不同。
因此,使用基本的HTTP请求库得到的源代码可能与浏览器中的页面源代码不一样。对于这样的情况,我们可以分析它的后台Ajax接口,或者使用Selenium、Splash等库来模拟JavaScript渲染。
稍后,我们将详细介绍如何采集 JavaScript 渲染网页。本节介绍爬虫的一些基本原理,可以帮助我们以后编写爬虫时更加得心应手。