动态内容加载时,爬虫应如何处理?
处理动态内容加载是爬虫开发中的一个常见挑战。许多现代网站使用 JavaScript 动态加载内容,这意味着页面的某些部分可能在初始加载时并不存在,而是通过后续的 AJAX 请求或 JavaScript 执行动态生成的。为了处理这种情况,爬虫需要能够模拟浏览器的行为,执行 JavaScript 并等待内容加载完成。以下是几种常见的方法和工具,可以帮助你处理动态内容加载。
1. 使用 Selenium
Selenium 是一个用于自动化浏览器操作的工具,可以模拟真实用户的行为,包括点击、滚动、等待等。Selenium 支持多种浏览器,如 Chrome、Firefox 等。
示例代码
Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdef get_html_with_selenium(url):options = webdriver.ChromeOptions()options.add_argument("--headless") # 无头模式,不显示浏览器界面driver = webdriver.Chrome(options=options)driver.get(url)# 等待页面加载完成try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.product-item")))finally:html = driver.page_sourcedriver.quit()return html# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html_with_selenium(url)
print(html)
2. 使用 Puppeteer
Puppeteer 是一个 Node 库,通过 DevTools 协议控制 Chrome 或 Chromium。Puppeteer 默认以无头模式运行,但也可以配置为运行“有头”模式。
示例代码
JavaScript
const puppeteer = require('puppeteer');async function getHtmlWithPuppeteer(url) {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto(url, { waitUntil: 'networkidle2' }); // 等待网络空闲const html = await page.content();await browser.close();return html;
}// 使用示例
const url = "https://www.vip.com/vip-products";
getHtmlWithPuppeteer(url).then(html => {console.log(html);
});
3. 使用 Requests + BeautifulSoup + PyQuery
如果你不想使用 Selenium 或 Puppeteer,可以尝试结合 Requests、BeautifulSoup 和 PyQuery 来处理动态内容。这种方法通常需要手动分析页面的 AJAX 请求,并直接发送请求获取数据。
示例代码
Python
import requests
from bs4 import BeautifulSoupdef get_html(url):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"}response = requests.get(url, headers=headers)return response.textdef parse_html(html):soup = BeautifulSoup(html, "lxml")products = []items = soup.select(".vip-product")for item in items:product = {"name": item.select_one(".product-name").text.strip(),"price": item.select_one(".product-price").text.strip(),"discount": item.select_one(".product-discount").text.strip(),"description": item.select_one(".product-description").text.strip(),"image_url": item.select_one(".product-image img")["src"]}products.append(product)return products# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html(url)
products = parse_html(html)
for product in products:print(product)
4. 使用 Scrapy + Splash
Scrapy 是一个强大的 Python 爬虫框架,而 Splash 是一个用于渲染 JavaScript 的工具,可以与 Scrapy 结合使用,处理动态内容。
示例代码
Python
import scrapy
from scrapy_splash import SplashRequestclass VipProductSpider(scrapy.Spider):name = "vip_product"start_urls = ["https://www.vip.com/vip-products"]def start_requests(self):for url in self.start_urls:yield SplashRequest(url, self.parse, args={'wait': 0.5})def parse(self, response):products = response.css("div.product-item")for product in products:yield {"name": product.css(".product-name::text").get(),"price": product.css(".product-price::text").get(),"discount": product.css(".product-discount::text").get(),"description": product.css(".product-description::text").get(),"image_url": product.css(".product-image img::attr(src)").get()}
5. 使用 Playwright
Playwright 是一个用于自动化 Chromium、Firefox 和 WebKit 浏览器的工具,支持 Python、JavaScript、.NET 和 Java 等多种语言。
示例代码
Python
from playwright.sync_api import sync_playwrightdef get_html_with_playwright(url):with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()page.goto(url)html = page.content()browser.close()return html# 使用示例
url = "https://www.vip.com/vip-products"
html = get_html_with_playwright(url)
print(html)
总结
处理动态内容加载时,选择合适的工具和方法取决于你的具体需求和开发环境。Selenium 和 Puppeteer 是处理动态内容的常用工具,而 Requests + BeautifulSoup + PyQuery 则适用于一些简单的动态内容处理。Scrapy + Splash 和 Playwright 提供了更强大的功能,适合复杂的动态内容处理。希望这些方法能帮助你高效地处理动态内容加载,完成爬虫任务。
相关文章:
动态内容加载时,爬虫应如何处理?
处理动态内容加载是爬虫开发中的一个常见挑战。许多现代网站使用 JavaScript 动态加载内容,这意味着页面的某些部分可能在初始加载时并不存在,而是通过后续的 AJAX 请求或 JavaScript 执行动态生成的。为了处理这种情况,爬虫需要能够模拟浏览…...

第五十二节:增强现实基础-简单 AR 应用实现
引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…...
前端高频面试题1:HTML/CSS/浏览器/计算机网络
目录 1.为什么会出现margin塌陷? 2.如何解决margin塌陷? 3.HTML5有哪些新特性? 4.常见的语义化标签有哪些?语义化标签的好处? 5.使用css和js做动画有何优劣 6.如何实现文本超出展示省略号 7.deep在css中存在吗&…...

LLaMaFactory 微调QwenCoder模型
步骤一:准备LLamaFactory环境 首先,让我们尝试使用github的方式克隆仓库: git config --global http.sslVerify false && git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git # 创建新环境,指定 Python 版本(以 3.…...
Git全流程操作指南
Git全流程操作指南 一、Git 环境配置 1. 安装 Git Windows:下载 Git for Windows macOS:brew install git Linux: sudo apt-get update && sudo apt-get install git # Debian/Ubuntu sudo yum install git …...

【最新版】Arduino IDE的安装入门Demo
1、背景说明 1、本教程编写日期为2025-5-24 2、Arduino IDE的版本为:Arduino IDE 2.3.6 3、使用的Arduino为Arduino Uno 1、ArduinoIDE的安装 1、下载。网址如下:官网 2、然后一路安装即可。 期间会默认安装相关驱动,默认安装即可。 3、安…...

不起火,不爆炸,高速摄像机、数字图像相关DIC技术在动力电池新国标安全性能测试中的应用
2026年7月1日,我国将正式实施GB38031-2025《电动汽车用动力蓄电池安全要求》——这项被称为“史上最严电池安全令”的新国标,首次将“热失控不蔓延、不起火、不爆炸”从企业技术储备上升为强制性要求,标志着电池安全进入“零容忍”时代&#…...

thinkadmin中使用layui日期选择器,数据库存储时间戳
form.html <div class="layui-form-item label-required-prev" id="jiezhi_time-div">...

WSL中ubuntu通过Windows带代理访问github
WSL中ubuntu通过Windows带代理访问github 前言: WSL是Windows下的ubuntu访问工具,目前无法访问外网,因此需要配置一下。 步骤一 代理中进行如下设置: 步骤二 ubuntu22.04中修改配置 使用如下命令获取IP地址: ip route | grep default | aw…...

RISC-V特权模式及切换
1 RISC-V特权模式基本概念 1.1 RISC-V特权模式介绍 RISC-V 指令集架构(ISA)采用多特权级别设计作为其核心安全机制,通过层次化的权限管理实现系统资源的隔离与保护。该架构明确定义了四个层次化的特权模式,按照权限等级由高至低…...
Python爬虫实战:研究Tornado框架相关技术
1. 引言 1.1 研究背景与意义 网络爬虫作为一种自动获取互联网信息的程序,在信息检索、数据挖掘、舆情分析等领域有着广泛的应用。随着互联网数据量的爆炸式增长,对爬虫的性能和效率提出了更高的要求。传统的同步爬虫在处理大量 URL 时效率低下,而异步爬虫可以显著提高并发…...

【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT
Transformer 神经网络 Self-Attention 的提出动机 传统的循环神经网络(RNN)处理序列信息依赖时间步的先后顺序,无法并行,而且在捕捉长距离依赖关系时存在明显困难。为了解决这些问题,Transformer 引入了 Self-Attent…...
Ubuntu实现和主机的复制粘贴 VMware-Tools(open-vm-tools)
Ubuntu实现和主机的复制粘贴 VMware-Tools(open-vm-tools) 1.安装open-vm-tools # 更新软件源并安装工具包 sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop -y2.启用剪贴板共享 sudo nano /etc/vmware-tools/tools.conf添加或…...

4060显卡什么水平 4060显卡参数介绍
NVIDIA的GeForce RTX 40系列显卡基于最新的Ada Lovelace架构,提供了前所未有的图形处理能力和效率。其中,RTX 4060定位中高端市场,针对那些寻求卓越性能同时又注重成本效益的用户群体。那么,4060显卡什么水平呢?本文将…...
Kafka Producer 如何实现Exactly Once消息传递语义
Exactly-Once (精确一次) 是 Kafka 中最高级别的消息传递语义,确保消息既不会丢失也不会重复。以下是 Kafka Producer 实现 Exactly-Once 语义的关键机制: 1. 实现方法 1.1 启用幂等性 (Idempotence) props.put("enable.idempotence", &quo…...
通过ansible playbook创建azure 资源
安装 Ansible 在 macOS 上 Ansible 可以通过多种方式在 macOS 上安装,推荐使用 pip 或 Homebrew。 使用 Homebrew 安装 Ansible 运行以下命令: brew install ansible使用 pip 安装 Ansible 确保 Python 已安装(macOS 通常自带 Python),然后运行: pip install ansible…...
C++双线程交替打印奇偶数(活泼版)
C双线程交替打印奇偶数(活泼版) 文章目录 C双线程交替打印奇偶数(活泼版)1.🎮 游戏规则说明书2.🔧 游戏道具准备区2.1🧩 道具清单 3.👯♂️ 创建两个线程小伙伴3.1🧑…...

技术为器,服务为本:AI时代的客服价值重构
在智能化浪潮中,大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身,而在于其赋能服务的深度与广度。AI对于我们来说,如同发动机之于汽车,重要的不是引擎参数,而是整车带给用户的驾驶体…...
hadoop异构存储
Hadoop异构存储是一种基于HDFS的存储优化技术,通过将不同热度的数据分配到不同类型的存储介质上实现性能与成本的平衡。以下是其核心原理和实现方式: 一、核心概念 异构存储基本原理:Hadoop集群允许使用SSD、HDD、ARCHIVE等多种存储介质…...

EasyVoice:开源的文本转语音工具,让文字“开口说话“
名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、EasyVoice是什么?1. 核心特性一览2. 技术架构概览 二、安装部署指南…...

扫地机产品异物进入吸尘口堵塞异常检测方案
扫地机产品异物进入吸尘口堵塞异常的检测方案 文章目录 扫地机产品异物进入吸尘口堵塞异常的检测方案一.背景二.石头的音频异常检测的方案2.1 音频检测触发点2.1.1时间周期2.1.2根据清洁机器人清扫模式或清扫区域污渍类型,即当清扫模式为深度清洁模式 或清扫区域污渍类型为重度…...

C++并集查找
前言 C图论 C算法与数据结构 本博文代码打包下载 基本概念 并查集(Union-Find)是一种用于处理动态连通性(直接或间接相连)的数据结构,主要支持两种操作:union 和 find。通过这两个基本操作,可…...
git reset --hard HEAD~1与git reset --hard origin/xxx
git reset --hard HEAD~1与git reset --hard origin/xxx git reset --hard origin/xxx有时候会太长,手工输入略微繁琐,可以考虑: git reset --hard HEAD~1 替代。 或者使用这种方式 git reset撤销当前分支所有修改,恢复到最近一…...
window 显示驱动开发-转换 Direct3D 固定函数状态(二)
未使用的User-Mode显示驱动程序函数 启用固定函数顶点着色器转换器时,Direct3D 运行时不会调用以下 用户模式显示驱动程序函数 : MultiplyTransform SetTransform SetMaterial SetLight CreateLight DestroyLight 1. 核心规则 当 固定功能顶点着…...
双路物理CPU机器上安装Ubuntu并部署KVM以实现系统多开
在双路物理CPU机器上安装Ubuntu并部署KVM以实现系统多开,并追求性能最优,需要从硬件、宿主机系统、KVM配置、虚拟机配置等多个层面进行优化。 以下是详细的操作指南和优化建议: 阶段一:BIOS/UEFI 设置优化 (重启进入) 启用虚拟化…...

C++ RB_Tree
一、红黑树是什么?—— 带颜色标记的平衡二叉搜索树 红黑树是一种自平衡二叉搜索树,它在每个节点上增加了一个颜色属性(红色或黑色),通过对颜色的约束来确保树的大致平衡。这种平衡策略被称为 "弱平衡"&…...
命令模式,观察者模式,状态模式,享元模式
什么是命令模式? 核心思想是将原本直接调用的方法封装为对象(如AttackCommand),对象包含执行逻辑和上下文信息(如目标、参数)。比如,玩家的按键操作被封装成一个命令对象&#…...

kibana解析Excel文件,生成mapping es导入Excel
一、Excel转为CSV格式 在线免费网站:EXCEL转CSV - 免费在线将EXCEL文件转换成CSV (cdkm.com) 二、登录kibana 点击左边菜单栏找到Machine Learning, 进入后上面菜单选择Data Visualizer,然后上穿转好的csv格式的Excel 点击导入输入建立的m…...

开疆智能Profinet转Profibus网关连接EC-CM-P1 PROFIBUS DP从站通讯模块配置案例
本案例是通过开疆智能Profibus转Profinet网关将正弦研发的Profibus从站模块连接的EM600变频器接入到西门子1200PLC的配置案例。 配置过程 1. 打开网关配置软件“”新建项目并添加模块PN2DPM并设置参数 2. 设置网关的Profibus参数。如站地址,波特率等。(…...

Oracle RMAN自动恢复测试脚本
说明 此恢复测试脚本,基于rman备份脚本文章使用的fullbak.sh做的备份。 数据库将被恢复到RESTORE_LO参数设置的位置。 在恢复完成后,执行一个测试sql,确认数据库恢复完成,数据库备份是好的。恢复测试数据库的参数,比如SGA大小都…...