小白学 Python 爬虫(9):爬虫基础
人生苦短,我用 Python
前文传送门:
小白学 Python 爬虫(2):前置准备(一)基本类库的安装
小白学 Python 爬虫(3):前置准备(二)Linux基础入门
小白学 Python 爬虫(4):前置准备(三)Docker基础入门
小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装
爬虫的核心
什么是爬虫,讲点通俗易懂的,爬虫就是爬取网页,从中按照一定规则提取信息,重复以上过程自动化重复完成的程序。
一只爬虫,第一件事情就是要爬取网页,这里主要是指获取网页的源代码。在网页的源代码里,会含有我们所需要的信息,而我们要做的事情就是从源代码中将这些信息提取出来。
我们请求网页的时候, Python 为我们提供了很多库来做这件事情,比如官方提供的 urllib ,以及第三方提供的 requests 、 Aiohttp 等。
我们可以使用这些库来发送 HTTP 请求,获取响应的数据,得到响应之后,我们只需要解析其中 body 部分的数据,就可以获得网页的源代码。
获取到源代码以后,我们接下来的工作就是解析源代码,从中提取出我们需要的数据。
提取数据最基础也是最常用的是使用正则表达式的方式的,但是这种方式比较复杂,也比较容易出错,不过不得不说,一个正则表达式写的非常厉害的人,完全用不着下面的这些解析类库,这是一个万能的方法。
悄悄的说一句,小编的正则表达式写的也不好,才会使用到这些由第三方提供的类库。
用于提取数据的类库有 Beautiful Soup 、 pyquery 、 lxml 等等。使用这些库,我们可以高效快速地从 HTML 中提取网页信息,如节点的属性、文本值等。
从源代码中提取到数据以后,我们会对数据进行保存,这里的保存形式多种多样,可以直接保存成 txt 、 json 、 Excel 文件等等,也可以保存至数据库,如 Mysql 、 Oracle 、 SQLServer 、 MongoDB 等等。
抓取的数据格式
一般而言,我们抓取到的都是 HTML 的网页源代码,这个是我们看得到的、常规的、直观的网页信息。
但是有些信息,并不是直接和 HTML 一起返回至网页的,会存在各种各样的 API 接口,这种接口返回的数据现在大多数是 JSON 的格式,也有一些会返回 XML 的数据格式,还会有一些个别的奇葩的接口直接返回程序猿自定义的字符串。这种 API 数据接口就需要具体问题具体分析了。
还有一些信息,比如各大图片站、视频站(如抖音、 B站),我们想要爬取的信息是图片或者视频,这些信息是已二进制的形式存在的,我们需要将这些二进制的数据爬取下来再进行转储。
此外,我们还能抓取到一些资源文件,如 CSS 、 JavaScript 等脚本资源,有的还会有一些 woff 等字体信息。这些信息是一个网页组成不可或缺的元素,只要浏览器能访问到的,我们都可以将其爬取下来。
现代前端页面爬取
今天核心内容来了!!!
很多时候,我们使用 HTTP 请求库爬取网页源代码时,爬取到的信息和我们在网页上看到的信息完全不一样,只有短短的几行。
这是因为最近这几年,前端技术突飞猛进,大量的采用前端模块化工具来构建前端页面,比较常用的框架有 Vue 、 React 等等。
导致我们获取到的网页只有一个空壳子,例如这种:
<!DOCTYPE html>
<html lang="en" style="background-color: #26282A; height: 100%">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>演示项目</title>
</head>
<style>
html,
body,
#app {
height: 100%
}
</style>
<body>
<noscript>
<strong>We're sorry but xxxxxx doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src=/js/chunk-vendors.84ee7bec.js></script>
<script src=/js/app.4170317d.js></script>
</body>
</html>
代码来源是博主平时做的一些小东西,其中博主已经省略大量引入的 JavaScript。
body 节点里面只有一个 id 为 app 的节点,但是需要注意在 body 节点的最后引入了 JavaScript 文件,它们负责整个网页的渲染。
在浏览器打开这个页面后,首先会加载这个 HTML 的内容,接着会发现有 JavaScript 的脚本文件加载,获取到这些脚本文件后,开始执行其中的代码,而 JavaScript 脚本文件则会修改整个页面的 HTML 代码,向其中添加节点,从而完成整个页面的渲染。
但是当我们使用请求库去请求这个页面的时候,只能获得当前的 HTML 的内容,它并不会去帮我们获取这个 JavaScript 脚本文件并且帮我们执行这个脚本文件渲染整个 HTML DOM 节点,我们当然也就看不到浏览器当中看到的内容。
这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。
当然,遇到这种情况也不要慌,我们还可以使用Selenium、Splash这样的库来实现模拟浏览器中的 JavaScript 渲染。
后面,我们会慢慢聊这些内容,本文主要先帮各位同学对爬虫有一个基础的了解,方便后续的学习。
参考:
https://cuiqingcai.com/5484.html
小白学 Python 爬虫(9):爬虫基础的更多相关文章
- 小白学 Python 爬虫(3):前置准备(二)Linux基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 Linux 基础 CentOS 官网: https: ...
- 小白学 Python 爬虫(4):前置准备(三)Docker基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(5):前置准备(四)数据库基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(7):HTTP 基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(8):网页基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(11):urllib 基础使用(一)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(12):urllib 基础使用(二)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(13):urllib 基础使用(三)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(14):urllib 基础使用(四)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
随机推荐
- iOS11 SDK 新特性 CoreML 及swift 小demo
github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo.完整代码附上: https://github.com/Liuyubao/LYBC ...
- Unity5-ABSystem(二):AssetBundle导出
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lodypig/article/detai ...
- 在虚拟机上的关于Apache(阿帕奇)(3)基于IP访问网站
这篇随笔是基于IP访问网站,和后面两篇文章基于域名和基于端口一起练习效果更好 基于IP(记得下载httpd服务) 首先使用nmtui命令为网卡添加多个ip地址 输入命令:nmtui 进入下面这个界 ...
- 在虚拟机上的关于Apache(阿帕奇)(2)开启个人用户主页功能
首先下载httpd服务 在这里我们主要谈一谈个人主页功能分为不加密和加密两种 不加密 我们先来建立几个用户,使用命令:useradd longshisan 使用命令: Passwd longs ...
- python中小整数对象池及intern机制
小整数对象池: Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁 Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收,所有位于这个范围 ...
- C++学习笔记11_STL
STL又叫标准模板库,提供各种容器. STL是C++一部分,不休要额外安装什么,它被内建在编译器之内. STL重要特点是,数据结构和实现分离. *所谓迭代器,类似一个游标,使用++指向下一个元素,使用 ...
- [考试反思]1031csp-s模拟测试95:优势
假的三首杀.因为交文件所以他们都不往OJ上交. 假装是三首杀吧.嗯. 然而昨天还是没有AK.好像说是按照64位评测机的评测结果为准. 但是联赛省选的机子好像都是32位的?也就是和我们正在用的一致. 所 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- 使用Typescript重构axios(四)——实现基础功能:处理post请求参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 游戏辅助外gua篇:如何Dump内存获得游戏的辅助
转载请标明出处: https://dujinyang.blog.csdn.net/article/category/9267855 本文出自:[奥特曼超人的博客] 本篇邀请了 "阿七&quo ...