当前位置: 首页 > news >正文

[网络爬虫] 动态网页抓取 — 概念引入

🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客

本章并不涉及实际的 “动态网页” 抓取技术,主要是做一个概念引入,让读者理解什么是 “动态网页” 什么是 “静态网页”,并简单介绍几个动态网页抓取技术。

0x01:静态 & 动态网页?

0x0101:静态网页

首先,我们先来了解一下啥是 “静态网页”,比如下面这个链接,指向的就是一个静态页面:

静态页面示例:学生常用系统 - 南方科技大学

上面这种网页,笔者一般称为 “静态” 或者 “死” 网页,因为里面的每个展现的数据都是固定死的,它不会随着时间变化而变化,如果想要改变内容,那么就只能重新写一个 HTML 文件了。

通过对上面网页的抓包分析,我们可以很明显看到,请求获取的 html 文件中就包含了该页面已有的所有数据,像这种一个 HTML 文件中就包含当前网页所有展示数据的网页,就是静态网页

0x0102:动态网页

接下来,我们先来了解一下啥是 “动态网页”,比如下面这个链接,指向的就是一个动态页面:

动态页面示例:淘宝 — 女装搜索

虽然明面上看与静态网页展示差不多,但其实眼尖的宝子应该在加载的时候就发现了端倪,它是先展示网页框架,至于具体内容,它其实是后面通过 JS 动态加载过来的:

这种网页就比 “静态网页” 强很多了,它里面数据可以实时更新,只需要去数据库里添加或者删除一些数据就可以了,不用像静态页面那样改网页源代码。

我们同样抓包分析一下,同样是 HTML ,这个 HTML 里面就没有页面中所展示的数据:

那么这个展示的数据在哪里拿来的呢?其实是通过前端 JS 构造请求从后端数据库中查询来的:

0x0103:动 & 静态网页小结

从上面的数据包分析中可以看出,针对静态网页,我们可以直接对 HTML 页面发起请求,所拿到的数据就是整个网页的数据,但是针对动态网页,我们只拿它的 HTML 是没有任何用的,因为里面没有任何数据,我们针对的应该是那种二次加载进来包含数据的请求包,比如上面那个 JSON 数据包。

找携带数据的 JSON 包容易,但是构造请求参数可是一个难事,需要 JS 逆向功底。不过,难道我不会 JS 我就不能抓了嘛,也不是,就是损失点效率。笔者后面介绍的 Selenium 就不需要这么麻烦,还得去看请求包,直接无脑抓它加载后的带有数据的整个网页即可。

0x02:动态网页抓取技术概述

0x0201:动态网页抓取 — 问题引入

早期的网站页面一般都是静态的,这种网页在浏览器中展示的内容都位于源代码中。随着主流网站中使用 JavaScript、AJAX 等技术展示的网页逐渐增多,很多动态网页的内容并不会直接显示在源代码中,而会随着用户操作、时间、环境等因素的不同而发生改变。之所以会出现上面这种情况,是因为这些动态页面可以通过 JavaScript 和后端数据库进行交互。

比如我们上面介绍的电商平台的商品数据,很可能就是采用 AJAX 技术请求的,不过呢。即使我们可以定位到这些数据包的真实 URL 地址,也无法批量抓取这些商品数据。原因在于该页面的请求中包含了很多加密参数,我们难以直接找出加密规律(加密是用 JS 加密的,这就需要高阶爬虫者对 JS 逆向有深刻了解):

为了解决上述问题,我们可以使用模拟浏览器运行的方式访问网页、这样做就可以不用管网页内部是如何使用 JavaScript 渲染页面的,也不用管 AJAX 请求中到底有没有加密参数。我们在浏览器中看到的是啥样,那么抓取的结果就是啥样。

Python 中提供了很多模拟浏览器运行的库,包括 Selenium、Splash、PyAutoGUI 等,其中 Selenium 比较常用,PyAutoGUI 可以控制你的鼠标键盘,至于 Splash 这里笔者其实没怎么用过。

0x0202:动态网页抓取技术 — Selenium

Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按键精灵,可按照预先设定的指令进行自动化操作。但不同的是,Selenium 支持与所有主流的浏览器(如 Chrome、Firefox、Edge、IE 等)配合使用,当然,也包括如 PhantomJS、Headless Chrome 等一些无界面的浏览器。

Selenium 可以直接运行在浏览器中,模拟用户使用浏览器完成一些动作,包括自动加载页面、输入文本、选择下拉列表框中的选项、单机按钮、单机超链接等。不过,Selenium 本身不带浏览器,它需要通过浏览器驱动程序 WebDriver 才能与所选浏览器进行交互。


笔者吐槽:Selenium 的缺点就在于这个浏览器驱动程序,它需要与你本机的浏览器做版本匹配,驱动程序版本过低是跑不起来的,这就导致,前不久写好的程序,你本机浏览器一更新,就用不了了。虽然有这种 Bug,但是仍不妨碍它的牛逼。笔者可以告诉你,只要你会用这玩意,所有浏览器数据就跟你后花园一样,随便爬,当然,就是效率比直接发包低很多。

0x0203:动态网页抓取技术 — Splash

Splash 用于 JacaScript 渲染服务,是一个带有 HTTP API 的轻量级 Web 浏览器,而且对接了 Twisted(事件驱动型网络引擎)和 Qt5(一个 GUI 开发库)。Splash 实现了以下几个功能:

  • 采用异步方式并行处理多个网页渲染过程。

  • 获取渲染后的页面的源代码或截图。 => 这一点很有搞头。

  • 通过关闭图像或使用 Adblock Plus 规则加快页面渲染速度。

  • 可执行特定的 JavaScript 脚本。

  • 可以通过 Lua 脚本控制页面的渲染过程。

  • 以 HAR(HTTP Archive)格式呈现获取渲染的详细过程。

0x0204:动态网页抓取技术 — PyAutoGUI

PyAutoGUI 是一个用于自动化测试的库,它可以使用 Python 程序控制鼠标和键盘自动的与其它应用程序交互,该库支持 Windows、MacOS、Linux 等平台。PyAutoGUI 具有以下一些特点:

  • 移动鼠标指针并在其他应用程序的窗口中单机或输入文本。

  • 向应用程序发送按键指令,如填写表格。

  • 截取屏幕局部并生成一张图像,还可以根据图像定位其在屏幕上的位置。

  • 定位应用程序的窗口,并移动、缩放、最大化、最小化或关闭该窗口(该功能目前仅适用于 Windows 平台)。


由于 Selenium 库在互联网中的文档比较丰富,社区比较活跃,因此笔者在后面的章节中主要是以该库为例来讲解如何进行动态网页抓取的。

值得注意的是,Selenium 本身是不带浏览器的,它需要与 WebDriver 配合才可以开发出一个功能强大的网络爬虫,实现抓取动态网页数据的功能。

相关文章:

  • 基于opencv的hsv色块检测
  • vue和easyui渲染问题
  • 代码随想录二刷|图论2
  • Java高频面试之集合-06
  • 深度链接技术解析:openinstall如何通过场景还原优化用户体验?
  • 如何利用Postman对比出新旧接口之间的差异(Diff)
  • dfs:五子棋对弈15蓝桥杯a组1题
  • 数据结构第八节:红黑树(初阶)
  • 【图灵商城项目-登录失败:密码不正确,问题已解决】
  • Python使用MyQR生成动态二维码
  • 【LangChain】理论及应用实战(2)
  • Git基础之基本操作
  • 【GPT入门】第2课 跑通第一openAI程序
  • 【C++】:STL详解 —— 红黑树封装map和set
  • 《C#上位机开发从门外到门内》1-2:上位机开发语言与工具、开发环境部署
  • 初识Bert
  • Javascript 原型和原型链
  • [项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键
  • 【Recon】Git源代码泄露题目解题方法
  • java项目之基于ssm的智能训练管理平台(源码+文档)
  • “80后”北京市东城区副区长王智勇获公示拟任区委常委
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试
  • 七部门:进一步增强资本市场对于科技创新企业的支持力度
  • 乌总统:若与普京会谈,全面停火和交换战俘是主要议题
  • 京东CEO许冉:外卖日单量接近2000万单,看到外卖对平台拉动和转化效应
  • AI观察|从万元到百万元,DeepSeek一体机江湖混战