一、爬虫爬取网页的基本思路
1、获取网页:
通过 urllib、requests等库完成 HTTP 的请求操作,得到响应之后我们只需要解析数据结构中的 Body 部分即可。
2、提取信息:
-
正则表达式提取:
通用方法,但是遇到正则表达式比较复杂的时候,提取的过程中容易出错。
-
运用 CSS 选择器和 XPath 进行提取:
运用如:Beautiful、soup、pyquery、lxml 等库,我们可以快速提取网页信息,如:节点属性、文本值等。
3、保存数据:
- 可以将提取出来的数据保存到 TXT 文本或者 JSON 文本中;
- 也可以保存到数据库中,例如:MySQL 和 MongoDB 等;
- 。0或者保存到远程服务器中,如:借助 SFTP 进行操作;
4、自动化程序:
将爬虫程序自动化,使其可以自动爬取我们需要的信息,并能进行对各种异常的处理、错误重试的操作等,确保爬虫能持续、高效的运行。
二、常见的爬取到数据
- 最常见的常规网页返回的就是 HTML 源代码;
- 有些网站返回的可能是一个JSON字符串(其中 API 接口大多采用这样的形式),这类数据更容易抓取,而且更容易进行保存;
- 我们还有可能会看到各种二进制数据,如:图片、视频和音频等,我们可以将这类数据爬取下来,然后保存成对应的文件名;
- 另外我们还能看到各种扩展名的文件,如:CSS、JavaScript 和配置文件等;
三、JavaScript 渲染页面
在抓取信息时,时常能看到抓取到的信息可能和实际在浏览器中看到的源码不一样。这是因为现在的网页越来越多的采用 Ajax、前端模块化工具来构建,整个网页可能都是由 JavaScript 渲染出来的,即原始的 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 节点后引入了 app.js ,它负责渲染整个网站。
渲染过程:
浏览器打开这个网页时:
- 先加载 HTML 内容,然后引入 app.js 文件并对这个文件进行请求;
- 获得该文件之后,执行其中的 JavaScript 代码;
- JavaScript 代码则会改变 HTML 中的节点,向其中添加内容,
但是爬虫用 urllib 或 requests 库请求页面是,只能得到 HTML 代码,并不会继续加载 JavaScript 文件,爬虫也就得不到真正的源代码。对于这样的情况,我们可以分析后台的 Ajax 接口,也可以使用 Selenium、Splash 这样的库来实现模拟 JavaScript 渲染。