概述:有了前面的基础,本篇就来看看爬虫的基本原理吧!html
虫子有不少种,为何咱们把爬虫看作蜘蛛呢?由于咱们能够把网页看作网的节点,把网页之间的连接关系看作节点之间的连线。这样是否是很像蜘蛛网?爬虫爬过一个节点后,又能够顺着节点连线爬到下一个节点(经过连接获取其余网页),周而复始,就能爬到全部节点。前端
简单来讲,爬虫就是获取网页,从中提取信息、保存数据的自动化程序。正则表达式
咱们说的“获取网页”,就是指获取网页的源代码。数据库
咱们前面讲过,向网站服务器发送一个请求,返回的响应体就是网页源代码。那么这部分的关键就是,如何构建一个请求并发给服务器,而后接收并解析响应。浏览器
咱们能够利用 Python 提供的库(如 urllib、requests 等)来实现 HTTP 请求操做,请求和响应均可以用类库提供的数据结构来表示,获得相应以后,咱们只须要解析数据结构中的 Body 部分便可(这就是源代码)。服务器
拿到源代码后,就要分析源代码,从中提取有用数据。经常使用方法有两种:数据结构
提取到有用信息后,须要保存数据,以供后续使用。一般作法有如下三种:并发
爬虫能够自动在抓取过程当中进行异常处理、错误重试等操做,自动化程度高,尤为适用于数据量大、对速度要求高的使用场景。app
只要是基于 HTTP 或 HTTPS 协议,具备对应的 URL 的数据,都可以抓取模块化
最多见的常规网页对应 HTML 代码,这也是咱们最常抓取的内容。
有些网页返回的不是 HTML 代码,而是 JSON 字符串。API 接口大多采用这样的形式。
如图片、音频、视频等。
如 CSS、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 渲染。