04-爬虫的基本原理
概述:有了前面的基础,本篇就来看看爬虫的基本原理吧!
虫子有很多种,为什么我们把爬虫看做蜘蛛呢?因为我们可以把网页看做网的节点,把网页之间的链接关系看做节点之间的连线。这样是不是很像蜘蛛网?爬虫爬过一个节点后,又可以顺着节点连线爬到下一个节点(通过链接获取其他网页),周而复始,就能爬到所有节点。
一、爬虫的基本概念
简单来说,爬虫就是获取网页,从中提取信息、保存数据的自动化程序。
1. 获取网页
我们说的“获取网页”,就是指获取网页的源代码。
我们前面讲过,向网站服务器发送一个请求,返回的响应体就是网页源代码。那么这部分的关键就是,如何构建一个请求并发给服务器,然后接收并解析响应。
我们可以利用 Python 提供的库(如 urllib、requests 等)来实现 HTTP 请求操作,请求和响应都可以用类库提供的数据结构来表示,得到相应之后,我们只需要解析数据结构中的 Body 部分即可(这就是源代码)。
2. 提取信息
拿到源代码后,就要分析源代码,从中提取有用数据。常用方法有两种:
- 正则表达式:万能方法,但比较复杂,容易出错。
- 使用库文件:有些库文件可以根据网页节点属性、CSS 选择器或 XPath 来提取网页信息(如 Beautiful Soup、pyquery、lxml 等)。这些库可以高效快速地提取数据。
3. 保存数据
提取到有用信息后,需要保存数据,以供后续使用。通常做法有以下三种:
- 保存为 txt 或 JSON 文本
- 保存到 MySQL、MongoDB 等数据库
- 保存至远程服务器(借助 SFTP 等)
4. 自动化
爬虫可以自动在抓取过程中进行异常处理、错误重试等操作,自动化程度高,尤其适用于数据量大、对速度要求高的使用场景。
二、爬虫能抓什么数据
只要是基于 HTTP 或 HTTPS 协议,具有对应的 URL 的数据,都能够抓取
1. HTML 代码
最常见的常规网页对应 HTML 代码,这也是我们最常抓取的内容。
2. JSON 字符串
有些网页返回的不是 HTML 代码,而是 JSON 字符串。API 接口大多采用这样的形式。
3. 二进制数据
如图片、音频、视频等。
4. 各种扩展名的文件
如 CSS、JavaScript、配置文件等。
三、JavaScript 渲染页面
有时我们使用 urllib 或 requests 抓取到的网页源代码和实际在浏览器中看到的不一样。这是因为现在的网页越来越多地采用 Ajax 和前端模块化工具来狗圈,网页可能是由 JavaScript 渲染出来的,原始的 HTML 代码只是一个空壳。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8”> 5 <title>This is a Oemo</title> 6 </head> 7 <body> 8 <div id=”container” > 9 </div> 10 </body> 11 <script src=”app.js ”></script> 12 </html>
以上代码的 body 中,只有一个 id 为 container 的节点,但是 body 后饮用了 app.js,它负责整个网站的渲染。浏览器打开这个页面时,首先加载 HTML 内容,接下来浏览器发现引入了 app.js 文件,于是继续请求这个文件。获取到文件后,执行其中的 JavaScript 代码,由此改变 HTML 的节点,向其中添加内容,得到完整界面。
使用 urllib 或 requests 库请求页面时,只能得到 HTML 代码,不会继续加载 JavaScript 文件,自然也就无法看到浏览器中的内容了。
由于使用基本 HTTP 请求库得到的源代码和浏览器中的页面源代码不一致,我们可以分析其后台 Ajax 接口,也可以使用 Selenium、Splash 等库来实现模拟 JavaScript 渲染。