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

Python爬虫解析动态网页:从渲染到数据提取

一、动态网页与静态网页的区别

在开始之前,我们需要理解动态网页与静态网页的区别。静态网页的内容在服务器端是固定的,每次请求都会返回相同的结果,通常以HTML文件的形式存储。而动态网页则不同,其内容是通过JavaScript在客户端动态生成的,服务器返回的HTML代码可能只包含一些基础的框架,而真正的数据则需要通过JavaScript代码执行后才能显示出来。

例如,许多现代的新闻网站、社交媒体平台和电商平台都大量使用动态加载技术。当我们打开一个动态网页时,浏览器会首先加载一个基本的HTML框架,然后通过JavaScript代码向服务器请求数据,并将其渲染到页面上。这就使得传统的基于HTML解析的爬虫技术无法直接获取到完整的数据。

二、Python爬虫解析动态网页的工具

为了应对动态网页的挑战,我们需要借助一些特殊的工具和技术。Python提供了多种强大的库,可以帮助我们实现动态网页的解析和数据提取。

(一)Selenium

Selenium是一个自动化测试工具,但它也可以用于爬虫项目。它能够模拟浏览器的行为,加载完整的动态网页,执行JavaScript代码,并获取最终渲染后的页面内容。Selenium支持多种浏览器,如Chrome、Firefox等,通过安装相应的浏览器驱动程序,可以实现对网页的完全控制。

(二)Pyppeteer

Pyppeteer是基于Chromium浏览器的无头浏览器工具,它是Puppeteer的Python实现。与Selenium类似,Pyppeteer可以模拟浏览器的行为,加载动态网页并执行JavaScript代码。它具有轻量级、高性能的特点,适合处理复杂的动态网页。

(三)Requests + BeautifulSoup

虽然Requests和BeautifulSoup主要用于静态网页的解析,但在某些情况下,也可以通过分析动态网页的网络请求,直接获取数据。这种方法需要我们仔细分析网页的网络请求,找到数据的来源,然后通过Requests发送请求并使用BeautifulSoup解析返回的数据。

三、使用Selenium解析动态网页

(一)安装Selenium和浏览器驱动

在开始之前,我们需要安装Selenium库和相应的浏览器驱动程序。以Chrome为例,可以通过以下命令安

然后,需要下载Chrome浏览器的驱动程序(ChromeDriver),并将其路径添加到系统的环境变量中。ChromeDriver的版本需要与浏览器的版本相匹配。

(二)代码实现

以下是一个使用Selenium解析动态网页的示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time# 初始化浏览器驱动
driver = webdriver.Chrome()# 打开目标网页
driver.get("https://example.com")# 等待页面加载完成
time.sleep(3)  # 等待3秒,确保页面渲染完成# 查找页面元素并提取数据
try:# 假设我们要提取页面中的某个元素的文本内容element = driver.find_element(By.ID, "target_element_id")data = element.textprint("提取到的数据:", data)
except Exception as e:print("提取数据时发生错误:", e)# 关闭浏览器
driver.quit()

(三)代码解析

  1. 初始化浏览器驱动:通过<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">webdriver.Chrome()</font>创建一个Chrome浏览器实例。
  2. 打开目标网页:使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">driver.get()</font>方法打开目标网页。
  3. 等待页面加载完成:由于动态网页需要时间来加载和渲染,因此需要等待一定的时间。这里使用了<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">time.sleep()</font>方法,但在实际应用中,可以使用Selenium提供的等待机制,如<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">WebDriverWait</font>,以更智能地等待页面元素加载完成。
  4. 查找页面元素并提取数据:通过<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">driver.find_element()</font>方法查找页面中的目标元素,并提取其文本内容或其他属性。
  5. 关闭浏览器:完成数据提取后,使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">driver.quit()</font>方法关闭浏览器。

四、使用Pyppeteer解析动态网页

(一)安装Pyppeteer

首先,需要安装Pyppeteer库。可以通过以下命令进行安装:

(二)代码实现

以下是一个使用Pyppeteer解析动态网页的示例代码:

import asyncio
from pyppeteer import launchasync def main():# 启动浏览器browser = await launch(headless=False)  # 设置为非无头模式,方便观察page = await browser.newPage()  # 打开一个新页面# 打开目标网页await page.goto("https://example.com")# 等待页面加载完成await page.waitForNavigation()# 查找页面元素并提取数据try:# 假设我们要提取页面中的某个元素的文本内容element = await page.querySelector("#target_element_id")data = await page.evaluate('(element) => element.textContent', element)print("提取到的数据:", data)except Exception as e:print("提取数据时发生错误:", e)# 关闭浏览器await browser.close()# 运行异步主函数
asyncio.run(main())

(三)代码解析

  1. 启动浏览器:通过<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">launch()</font>方法启动浏览器,<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">headless=False</font>表示以非无头模式运行,方便观察浏览器的行为。
  2. 打开目标网页:使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">page.goto()</font>方法打开目标网页。
  3. 等待页面加载完成<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">page.waitForNavigation()</font>方法用于等待页面加载完成。
  4. 查找页面元素并提取数据:通过<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">page.querySelector()</font>方法查找页面中的目标元素,并使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">page.evaluate()</font>方法提取其文本内容。
  5. 关闭浏览器:完成数据提取后,使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">browser.close()</font>方法关闭浏览器。

五、分析网络请求提取数据

在某些情况下,动态网页的数据是通过JavaScript代码向服务器发送请求并获取的。我们可以通过分析网页的网络请求,找到数据的来源,然后直接使用Requests库发送请求并提取数据。

(一)分析网络请求

  1. 打开浏览器的开发者工具(F12)。
  2. 切换到“网络”(Network)标签页。
  3. 刷新网页,观察网络请求。
  4. 找到加载数据的请求,查看其URL、请求方法(GET或POST)、请求头和请求参数。

(二)代码实现

以下是一个使用Requests提取动态网页数据的示例代码:

import requests
from requests.auth import HTTPProxyAuth# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 目标网页的网络请求URL
url = "https://example.com/api/data"# 请求头信息
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Referer": "https://example.com"
}# 请求参数(如果有)
params = {"param1": "value1","param2": "value2"
}# 设置代理
proxies = {"http": f"http://{proxyHost}:{proxyPort}","https": f"http://{proxyHost}:{proxyPort}"
}# 设置代理认证
proxy_auth = HTTPProxyAuth(proxyUser, proxyPass)# 发送请求
response = requests.get(url, headers=headers, params=params, proxies=proxies, auth=proxy_auth)# 检查请求是否成功
if response.status_code == 200:# 提取数据data = response.json()print("提取到的数据:", data)
else:print("请求失败,状态码:", response.status_code)

(三)代码解析

  1. 目标网页的网络请求URL:通过分析网络请求,找到加载数据的URL。
  2. 请求头信息:设置请求头信息,包括<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">User-Agent</font><font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">Referer</font>等,以模拟浏览器的行为。
  3. 请求参数:如果请求需要携带参数,可以通过<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">params</font>参数传递。
  4. 发送请求:使用<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">requests.get()</font>方法发送GET请求,获取数据。
  5. 检查请求是否成功:通过检查响应的状态码,判断请求是否成功。如果成功,则提取数据;否则,打印错误信息。

六、动态网页爬虫的注意事项

  1. 遵守法律法规:在进行网页爬取时,必须遵守相关法律法规,尊重网站的版权和隐私政策。不要爬取未经授权的数据,避免对网站造成不必要的负担。
  2. 设置合理的爬取频率:动态网页的加载和渲染需要消耗服务器资源,因此在爬取数据时,应设置合理的爬取频率,避免对网站造成过大压力。
  3. 处理反爬虫机制:许多网站会设置反爬虫机制,如限制IP访问频率、检测User-Agent等。可以通过设置代理IP、随机生成User-Agent等方式来应对反爬虫机制。
  4. 数据存储与处理:提取到的数据需要进行合理的存储

相关文章:

Python爬虫解析动态网页:从渲染到数据提取

一、动态网页与静态网页的区别 在开始之前&#xff0c;我们需要理解动态网页与静态网页的区别。静态网页的内容在服务器端是固定的&#xff0c;每次请求都会返回相同的结果&#xff0c;通常以HTML文件的形式存储。而动态网页则不同&#xff0c;其内容是通过JavaScript在客户端…...

LLMs之MCP:如何使用 Gradio 构建 MCP 服务器

LLMs之MCP&#xff1a;如何使用 Gradio 构建 MCP 服务器 导读&#xff1a;本文详细介绍了如何使用Gradio构建MCP服务器&#xff0c;包括前提条件、构建方法、关键特性和相关资源。通过一个简单的字母计数示例&#xff0c;演示了如何将Gradio应用转换为LLM可以使用的工具。Gradi…...

VBA模拟进度条

在上一章中我跟大家介绍了ProgressBar控件的使用方法&#xff0c;但由于该控件无法在64位版本的Office中运行&#xff0c;为此我们可以采用Lable控件来模拟进度条的变化&#xff0c;以解决在64位版本的Office中无进度条控件的问题。 一、设计思路 添加两个重叠的Lable标签控件…...

MySQL强化关键_019_索引优化

目 录 一、最左前缀原则 1.完全使用索引 2.部分使用索引 3.不使用索引 4.效率折损 &#xff08;1&#xff09;使用范围查找 &#xff08;2&#xff09;索引断开 二、索引失效场景 1. 索引列参与运算 2.索引列模糊查询以“%”开始 3.索引列是字符串类型&#xff0c;查…...

高性能MCU的MPU与Cache优化详解

概述 在现代高性能单片机&#xff08;如ARM Cortex-M7、Cortex-A系列在MCU中的应用&#xff09;中&#xff0c;Memory Protection Unit (MPU) 和Cache系统的协同工作对系统性能有着决定性影响。本文将深入分析MPU配置如何影响Cache命中率&#xff0c;多主设备对RAM访问的竞争问…...

关于list集合排序的常见方法

目录 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、进阶排序技巧 4.1 空值安全处理 4.2 多字段组合排序 4.3. 逆序 5、性能优化建议 5.1 并行流加速 5.2 原地排序 6、最佳实践 7、注意事项 前言 Java中对于集合的排序操作&#xff0c;分别为list.s…...

不动产登记区块链系统(Vue3 + Go + Gin + Hyperledger Fabric)

好久没有介绍过新项目的制作了&#xff0c;之前做的一直都是Fisco Bcos的项目&#xff0c;没有介绍过Hyperledger Fabric的项目&#xff0c;这次来给大家分享下。 系统概述 不动产登记与交易平台是一个基于Hyperledger Fabric的综合性管理系统&#xff0c;旨在实现不动产登记…...

从 GPT 的发展看大模型的演进

这是一个技术爆炸的时代。一起来看看 GPT 诞生后&#xff0c;与BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架构的两种不同类型的预训练语言模型。它们之间的角逐可以从 Transformer 的编码解码结构角度来分析。 BERT&#xff08;Bidirectional Encoder Representatio…...

基于大模型的短暂性脑缺血发作(TIA)全流程预测与诊疗辅助系统详细技术方案

目录 系统整体架构系统部署拓扑图核心模块详细技术方案1. 术前风险预测模块算法实现伪代码:数据处理流程:2. 手术方案智能生成系统手术方案决策伪代码:手术方案生成流程:3. 麻醉智能决策系统麻醉方案伪代码:4. 术后监护与复发预测实时监测流程:5. 并发症预测系统双通道风…...

JSCH使用SFTP详细教程

文章目录 1. JSCH和SFTP基础概念1.1 什么是JSCH&#xff1f;1.2 SFTP协议特点1.3 JSCH的优势1.4 常用场景 2. 环境配置和依赖管理2.1 Maven依赖配置2.2 Gradle依赖配置2.3 基础配置类2.4 配置文件示例 3. SFTP连接管理3.1 基础连接类3.2 连接池管理3.3 连接测试工具 4. 文件上传…...

Trae CN IDE 中 PHP 开发的具体流程和配置指南

以下是 Trae CN IDE 中 PHP 开发的具体流程和配置指南,结合知识库内容和实际开发需求整理,并附实例说明: 一、安装与初始配置 下载与安装 Trae IDE 访问 Trae 官网 下载 macOS 或 Windows 版本。安装完成后,启动 Trae,首次运行会进入初始化向导。初始设置 主题与语言:选择…...

【Qt】构建目录设置

问题 ProjectRoot/├── src/ # 源代码│ ├── project1│ └── project2├── build/ # 构建目录│ ├── build-PCIeDemoApp-Desktop_Qt_5_9_7_MSVC2015_64bit-Debug/│ └── build-PCIeDemoApp-Desktop_Qt_5_9_7_MSVC2015_64bit-Rele…...

【仿生机器人】极具前瞻性的架构——认知-情感-记忆“三位一体的仿生机器人系统架构

基于您的深度需求分析&#xff0c;我将为您设计一个全新的"认知-情感-记忆"三位一体的仿生机器人系统架构。以下是经过深度优化的解决方案&#xff1a; 一、核心架构升级&#xff08;三体认知架构&#xff09; 采用量子纠缠式架构设计&#xff1a; 认知三角&#xf…...

Web后端快速入门(Maven)

Maven是apche旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 开源项目&#xff1a;Welcome to The Apache Software Foundation. Maven的作用&#xff1a; 依赖管理&#xff08;方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题&#xff09…...

机器学习算法:逻辑回归

1. 基础概念 定义&#xff1a; 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类问题的监督学习算法&#xff0c;通过概率预测样本属于某一类别的可能性。 核心特点&#xff1a;输出是概率值&#xff08;0~1&#xff09;&#xff0c;通过阈值&#…...

企业展示型网站模板HTML5网站模板下载指南

在当今数字化浪潮中&#xff0c;企业网站已成为企业展示形象、推广产品和服务的重要窗口。一个设计精美、功能完善的企业展示型网站&#xff0c;不仅能提升企业的品牌形象&#xff0c;还能吸引潜在客户&#xff0c;促进业务增长。而HTML5网站模板&#xff0c;凭借其跨平台兼容性…...

ArrayList和LinkedList(深入源码加扩展)

ArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList: 基于动态数组(Dynamic Ar…...

Unity UI 性能优化--Sprite 篇

&#x1f3af; Unity UI 性能优化终极指南 — Sprite篇 &#x1f9e9; Sprite 是什么&#xff1f;—— 渲染的基石与性能的源头 在Unity的2D渲染管线中&#xff0c;Sprite 扮演着至关重要的角色。它不仅仅是2D图像资源本身&#xff0c;更是GPU进行渲染批处理&#xff08;Batch…...

AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?

目前&#xff0c;随着科技和社会的不断发展&#xff0c;人们的生活水平和方式有了翻天覆地的变化。 从吃饱穿暖到吃好喝好再到健康生活&#xff0c;观念也在逐渐发生改变。 尤其是在21世纪&#xff0c;大家对健康越来越重视&#xff0c;这就不得不提AI健康小屋和氧舱。 一、A…...

OpenCV C++ 学习笔记(五):颜色空间转换、数值类型转换、图像混合、图像缩放

文章目录 颜色空间转换cvtColor通道分离split通道合并merge数值类型转换convertTo图片混合addWeighted图片缩放resize 颜色空间转换cvtColor cvtColor 是 OpenCV 中用于将图像从一种色彩空间转换为另一种色彩空间的函数。它非常适用于各种图像处理任务&#xff0c;如灰度化、颜…...

如何做接口测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff…...

【JMeter】性能测试知识和工具

目录 何为系统性能 何为性能测试 性能测试分类 性能测试指标 性能测试流程 性能测试工具&#xff1a;JMeter&#xff08;主测web应用&#xff09; jmeter文件目录 启动方式 基本元件&#xff1a;元件内有很多组件 jmeter参数化 jmeter关联 自动录制脚本 直连数据库…...

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP&#xff08;Hyper Text Transfer Protocol&#xff09; 超文本传输协议&#xff0c;是一种建立在 TCP 上的无状态连接&#xff0c;整个基本的工作流程是客户端发送一个 HTTP 请求&#xff0c;说明…...

字符编码全解析:ASCII、GBK、Unicode、UTF-8与ANSI

UTF - 8(全球字符能被唯一标识)、GBK、Unicode、ANSI 区别与关联 qwen模型分词器文件 1. ASCII(基础铺垫,理解编码起源) 作用:最早期为处理英文文本设计,是字符编码的基础,后演变成其他编码兼容的一部分 。范围:共 128 个字符(0 - 127),包含英文大小写字母、数字…...

《前端面试题:HTML5、CSS3、ES6新特性》

现代前端开发中&#xff0c;HTML5、CSS3和JavaScript ES6共同构成了三大核心技术支柱。这些技术不仅显著提升了用户体验和性能表现&#xff0c;更大幅提高了开发效率。本文将从技术演进、核心特性到最佳实践&#xff0c;系统性地介绍这三大技术的应用之道。 我们将首先探讨HTM…...

MaxCompute开发UDF和UDTF案例

文章目录 一、Java开发UDF1、创建Maven项目2、创建UDF类3、打包上传资源4、创建函数MyUDF5、SQL验证 二、Java开发UDTF1、创建Maven项目2、创建UDTF类3、打包上传更新资源4、创建函数MyUDTF5、SQL验证 三、常见问题1、发布函数报错 一、Java开发UDF 1、创建Maven项目 创建Mav…...

49套夏日小清新计划总结日系卡通ppt模板

绿色小清新PPT模版&#xff0c;日系小清新PPT模版&#xff0c;粉红色PPT模版&#xff0c;蓝色PPT模版&#xff0c;草青色PPT模版&#xff0c;日系卡通PPT模版 49套夏日小清新计划总结日系卡通ppt模板&#xff1a;夏日小清新日系卡通PPT模版https://pan.quark.cn/s/9e4270d390fa…...

告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]

嗨&#xff0c;各位技术伙伴们&#xff01;&#x1f44b; 在日常的软件开发中&#xff0c;我们经常面临需求变更的挑战。如何构建一个既能满足当前需求&#xff0c;又能轻松应对未来变化的系统呢&#xff1f;答案往往藏在那些经典的设计模式中。 今天&#xff0c;我们就来聊聊…...

Express教程【006】:使用Express写接口

文章目录 8、使用Express写接口8.1 创建API路由模块8.2 编写GET接口8.3 编写POST接口 8、使用Express写接口 8.1 创建API路由模块 1️⃣新建routes/apiRouter.js路由模块&#xff1a; /*** 路由模块*/ // 1-导入express const express require(express); // 2-创建路由对象…...

mongodb集群之分片集群

目录 1. 适用场景2. 集群搭建如何搭建搭建实例Linux搭建实例(待定)Windows搭建实例1.资源规划2. 配置conf文件3. 按顺序启动不同角色的mongodb实例4. 初始化config、shard集群信息5. 通过router进行分片配置 1. 适用场景 数据量大影响性能 数据量大概达到千万级或亿级的时候&…...