若是把互联网比作一张大网,爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网中的节点比作一个个网页,那么蜘蛛爬到一个节点处就相当于爬虫访问了一个页面,获取了其信息。可以把网页与网页之间的链接关系比作节点间的连线,蜘蛛通过一个节点后,顺着节点连线继续爬行,到达下一个节点,意味着爬虫可以通过网页之间的链接关系继续获取后续的网页,当整个网站涉及的页面全部被爬虫访问到后,网站的数据就被抓取下来了。
爬虫概述
简单点讲,爬虫就是获取网页并提取和保存信息的自动化程序,下面概要介绍一下。
-
获取网页
爬虫的工作首先是获取网页,这里就是获取网页的源代码。源代码里包含网页的部分有用信息所以只要获取源代码,就可以从中提取想要的信息了。
这篇博客讲了请求和响应的概念,向网站的服务器发送一个请求,服务器返回的响应体便是网页源代码。所以最关键的部分是构造一个请求并发送给服务器,然后接收到响应并对其进行解析,这个流程如何实现呢?总不能手动截取网页源码吧?不用担心,Python提供了许多库,可以帮助我们实现这个流程,如urllib、requests等,我们可以用这些库完成 HTTP请求操作。除此之外,请求和响应都可以用类库提供的数据结构来表示,因此得到响应之后只需要解析数据结构中的 body 部分,即可得到网页的源代码,这样我们便可以用程序来实现获取网页的过程了。
-
提取信息
获取网页的源代码后,接下来就是分析源代码,从中提取我们想要的数据。首先,最通用的提取方法是采用正则表达式,这是一个万能的方法,注意构造正则表达式的过程比较复杂且容易出错。另外,由于网页结构具有一定的规则,所以还有一些库是根据网页节点属性、CSS 选择器或 XPath来提取网页信息的,如 Beautiful Soup、pyquery、lxml 等。使用这些库,可以高效地从源代码中提取网页信息,如节点的属性、文本值等。
提取信息是爬虫非常重要的一个工作,它可以使杂乱的数据变得条理清晰,以便后续处理和分析数据。
-
保存数据
提取信息后,我们一般会将提取到的数据保存到某处以便后续使用。保存数据的形式多种多样,可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySOL和 MongoDB 等,还可保存至远程服务器,如借助 SFTP 进行操作等。
-
自动化程序
自动化程序的意思是爬虫可以代替人来完成上述操作。我们当然可以手动提取网页中的信息,但是当量特别大或者想快速获取大量数据的时候,肯定还是借助程序快。爬虫就是代替我们完成爬取工作的自动化程序,它可以在爬取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行。
能爬怎样的数据
网页中存在各种各样的信息,最常见的便是常规网页,这些网页对应着 HTML代码,而最常抓取的便是 HTML 源代码。
另外,可能有些网页返回的不是HTML代码,而是一个JSON字符串(其中 API接口大多采用这样的形式 ),这种格式的数据方便传输和解析。爬虫同样可以抓取这些数据,而且数据提取会更加方便
网页中还包含各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。
除了上述数据,网页中还有各种扩展名文件 ,如 CSS、JavaScript 和配置文件等。这些文件其实最普通,只要在浏览器里面可以访问到,就可以抓取下来。
上述内容其实都有各自对应的 URL,URL基于 HTTP 或 HTTPS 协议,只要是这种数据,爬虫都可以抓取。
JavaScript 渲染的页面
有时候,我们在用 urllib 或requests 抓取网页时,得到的源代码和在浏览器中实际看到的不一样。
这是一个非常常见的问题。现在有越来越多的网页是采用 Ajax、前端模块化工具构建的,可能整个网页都是由 JavaScript 渲染出来的,也就是说原始的 HTML代码就是一个空壳,例如:
.html
<!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 节点后引人了appjs,它负责整个网站的渲染。
在浏览器中打开这个页面时,首先会加载这个 HTML内容,接着浏览器会发现其中引人了一个app.js文件,便去请求这个文件。获取该文件后,执行其中的JavaScript代码,JavaScript会改变 HTML中的节点,向其中添加内容,最后得到完整的页面。
在用 urllib 或 requests 等库请求当前页面时,我们得到的只是 HTML 代码,它不会继续加载JavaScript 文件,我们也就无法看到完整的页面内容。
这也解释了为什么有时我们得到的源代码和在浏览器中看到的不一样。
对于这样的情况,我们可以分析源代码后台 Ajax 接口 ,也可使用 Selenium、Splash、Pyppeteer、Playwright 这样的库来模拟 JavaScript 渲染。
后面,我会详细介绍如何采集 JavaScript 渲染出来的网页。
总结
本节介绍了爬虫的一些基本原理,熟知这些原理可以使我们在后面编写爬虫时更加得心应手。
遇到js渲染的页面的两种处理方式:
-
分析源代码后台Ajax接口
说白了就是找接口中返回的Json字符串,然后直接解析Json。
-
利用模拟js渲染的各种库
这种就不需要找Json数据了,模拟渲染后就可以直接解析数据了。