ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-03 09:03:29  阅读:240  来源: 互联网

标签:网页 Python JavaScript 爬虫 小白学 源代码


人生苦短,我用 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

标签:网页,Python,JavaScript,爬虫,小白学,源代码
来源: https://www.cnblogs.com/babycomeon/p/11974612.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有