zoukankan      html  css  js  c++  java
  • 小白学 Python 爬虫(9):爬虫基础

    人生苦短,我用 Python

    前文传送门:

    小白学 Python 爬虫(1):开篇

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

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

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

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

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

    小白学 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

  • 相关阅读:
    25个完美的Opencart模板,让顾客无法抗拒!
    来自极客标签10款最新设计素材-系列十
    Creating Contextual Menus创建上下文菜单
    java解惑之常常忘记的事
    java 泛型实例详解(普通泛型、 通配符、 泛型接口)
    Java 泛型、通配符? 解惑
    Java中public,private,protected,和默认的区别
    windows 环境下dos 命令符下进D盘(非c盘系统盘)根目录
    I/O流之--转换流:InputStreamReader 和InputStreamWriter
    java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)
  • 原文地址:https://www.cnblogs.com/babycomeon/p/11974612.html
Copyright © 2011-2022 走看看