小白学 Python 爬虫(9):爬虫基础

人生苦短,我用 Pythonhtml

前文传送门:前端

小白学 Python 爬虫(1):开篇正则表达式

小白学 Python 爬虫(2):前置准备(一)基本类库的安装sql

小白学 Python 爬虫(3):前置准备(二)Linux基础入门数据库

小白学 Python 爬虫(4):前置准备(三)Docker基础入门json

小白学 Python 爬虫(5):前置准备(四)数据库基础浏览器

小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装app

小白学 Python 爬虫(7):HTTP 基础框架

小白学 Python 爬虫(8):网页基础模块化

爬虫的核心

什么是爬虫,讲点通俗易懂的,爬虫就是爬取网页,从中按照必定规则提取信息,重复以上过程自动化重复完成的程序。

一只爬虫,第一件事情就是要爬取网页,这里主要是指获取网页的源代码。在网页的源代码里,会含有咱们所须要的信息,而咱们要作的事情就是从源代码中将这些信息提取出来。

咱们请求网页的时候, 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

若是个人文章对您有帮助,请扫码关注下做者的公众号:获取最新干货推送:)
相关文章
相关标签/搜索