使用Python进行Web Scraping:动态网页内容抓取及解决方案

使用python进行web scraping:动态网页内容抓取及解决方案

本文旨在解决使用Python进行Web Scraping时,由于网页内容由JavaScript动态生成而导致无法抓取的问题。文章将介绍如何通过分析XHR/API请求获取JSON数据,以及使用Selenium等工具模拟浏览器行为来渲染动态内容,从而成功抓取目标信息。通过本文,读者将掌握应对动态网页抓取的有效方法,并能灵活应用于实际项目中。

动态网页抓取概述

传统的requests和BeautifulSoup组合在抓取静态网页时非常有效。然而,现代Web应用通常使用JavaScript动态生成内容,这意味着页面的HTML结构在加载后会发生改变。直接使用requests获取的HTML源码可能不包含目标数据,导致抓取失败。

解决方案一:分析XHR/API请求

许多动态网页通过异步JavaScript和XML(XHR)请求从服务器获取数据,这些数据通常以JSON格式返回。我们可以通过浏览器的开发者工具(通常按F12打开)的网络选项卡来分析这些请求。

打开开发者工具: 打开目标网页,按下F12键,进入开发者工具。切换到网络选项卡: 在开发者工具中,选择“Network”(网络)选项卡。刷新页面: 刷新页面,观察网络请求。筛选XHR请求: 过滤请求类型,只显示XHR(或Fetch/XHR)请求。查找API端点: 找到包含目标数据的API请求。通常,这些请求的响应类型为JSON。分析请求URL和参数: 记录API的URL和请求参数,这些信息将用于Python代码中。

示例代码:

立即学习“Python免费学习笔记(深入)”;

以下代码演示了如何使用requests库获取JSON数据并提取所需信息。

import requestsurl = 'https://comic.naver.com/api/article/list?titleId=811721&page=1'  # 替换为实际的API端点try:    response = requests.get(url)    response.raise_for_status()  # 检查请求是否成功    data = response.json()    for article in data['articleList']:        print(article.get('subtitle'))  # 提取并打印漫画标题except requests.exceptions.RequestException as e:    print(f"请求错误: {e}")except ValueError as e:    print(f"JSON解码错误: {e}")except KeyError as e:    print(f"KeyError: {e}, JSON结构可能已更改")

代码解释:

requests.get(url): 发送GET请求到指定的API端点。response.raise_for_status(): 检查HTTP响应状态码,如果不是200 OK,则抛出异常。response.json(): 将响应内容解析为JSON格式。data[‘articleList’]: 访问JSON数据中的articleList键,通常包含一个列表,其中每个元素代表一个漫画章节。article.get(‘subtitle’): 从每个章节的字典中获取subtitle键的值,即漫画标题。异常处理: 包含requests.exceptions.RequestException处理请求错误,ValueError处理JSON解码错误,KeyError处理JSON结构变更。

注意事项:

API端点可能会改变,需要定期检查和更新代码。某些API可能需要身份验证(例如,需要提供API密钥或登录凭据)。应遵守网站的robots.txt协议,避免过度请求导致服务器过载。

解决方案二:使用Selenium模拟浏览器行为

如果无法直接找到API端点,或者API的使用受到限制,可以使用Selenium等工具模拟浏览器行为,渲染动态内容。

安装Selenium和WebDriver:

pip install selenium

还需要下载与你的浏览器版本匹配的WebDriver(例如,ChromeDriver for Chrome)。将WebDriver的可执行文件放在系统PATH中,或者在Selenium代码中指定其路径。

编写Selenium代码:

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 配置Chrome选项(可选)chrome_options = Options()chrome_options.add_argument("--headless")  # 无头模式,不显示浏览器窗口# 创建WebDriver实例driver = webdriver.Chrome(options=chrome_options)  # 确保ChromeDriver在PATH中,或者指定路径try:    # 加载网页    driver.get("https://comic.naver.com/webtoon/list?titleId=811721&tab=wed")    # 等待目标元素加载(使用显式等待)    wait = WebDriverWait(driver, 10)    element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.EpisodeListList__title--lfIzU")))    # 提取数据    cartoons = driver.find_elements(By.CSS_SELECTOR, "span.EpisodeListList__title--lfIzU")    for cartoon in cartoons:        print(cartoon.text)except Exception as e:    print(f"发生错误: {e}")finally:    # 关闭浏览器    driver.quit()

代码解释:

webdriver.Chrome(): 创建Chrome浏览器的WebDriver实例。driver.get(url): 加载指定的网页。WebDriverWait和EC.presence_of_element_located: 使用显式等待,确保目标元素加载完成后再进行操作。这可以避免因元素未加载完成而导致的错误。driver.find_elements(By.CSS_SELECTOR, “span.EpisodeListList__title–lfIzU”): 使用CSS选择器查找所有匹配的元素。cartoon.text: 获取元素的文本内容。driver.quit(): 关闭浏览器。

注意事项:

Selenium需要安装WebDriver,并确保WebDriver的版本与浏览器版本兼容。使用显式等待可以提高代码的稳定性,避免因元素未加载完成而导致的错误。无头模式可以在后台运行浏览器,提高效率。Selenium的性能开销比requests大,应根据实际情况选择合适的解决方案。

总结

动态网页抓取是一个常见的挑战,但通过分析XHR/API请求或使用Selenium等工具模拟浏览器行为,可以有效地解决这个问题。选择哪种方法取决于网页的结构、API的可用性以及性能要求。理解这些技术可以帮助你更有效地抓取Web数据,并将其应用于各种应用场景中。

以上就是使用Python进行Web Scraping:动态网页内容抓取及解决方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1367616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 08:04:13
下一篇 2025年12月14日 08:04:26

相关推荐

  • Discord.py 教程:监听用户状态变化并发送通知消息

    本教程详细讲解如何使用 Discord.py 监听服务器成员的状态变化(如在线、离线、忙碌等),并在此变化发生时向指定频道发送通知消息。我们将重点介绍 on_member_update() 事件的正确用法,以及所需的 Intents 配置,以确保您的机器人能够准确捕获并响应用户活动。 在构建 dis…

    2025年12月14日
    000
  • 使用 Tkinter 实现控件的周期性数据更新

    本文详细介绍了如何在 Tkinter 应用中实现控件(如 Label)的周期性数据更新,使其能够实时反映外部数据源(例如文件)的变化。核心方法是利用 Tkinter 的 after() 函数,在主事件循环中调度更新任务,从而避免阻塞 UI。文章提供了具体的 Python 代码示例,并讨论了在数据获取…

    2025年12月14日
    000
  • Selenium中提取HTML标签内所有直接文本节点内容的高级技巧

    本文旨在解决Selenium中提取HTML标签内所有直接文本节点内容的挑战,而非获取子元素内部的文本。通过使用driver.execute_script执行JavaScript代码,遍历目标元素的直接子节点,并精确识别和拼接Node.TEXT_NODE类型的内容,从而实现高效且准确的文本提取,避免了…

    2025年12月14日 好文分享
    000
  • Python中动态更新对象属性:利用字典映射与setattr()处理字符串引用

    本教程探讨了如何在Python中根据外部数据(如数据库查询结果)动态更新对象属性,当对象名和属性名以字符串形式存在时面临的挑战。文章详细介绍了如何通过构建对象映射字典并结合内置的setattr()函数,安全高效地实现这一需求,避免了eval()等不推荐的方法,并提供了清晰的代码示例。 问题描述:从字…

    2025年12月14日
    000
  • python pytesseract库是什么

    pytesseract是基于Tesseract引擎的Python OCR库,可将图像中的印刷或手写文字识别为文本,支持多语言并可结合Pillow或OpenCV使用;需先安装pytesseract包和Tesseract-OCR程序,再通过image_to_string()方法提取文字,如处理中文需指定…

    2025年12月14日
    000
  • Django自定义用户模型UpdateView数据更新失败解决方案

    本文旨在解决Django自定义用户模型在使用UpdateView时,表面上数据在前端更新但未持久化到数据库的问题。核心原因通常是表单(forms.py)中定义的字段与模板(template.html)中实际渲染的字段不一致,或模型字段存在未满足的验证约束。文章将深入剖析此问题,并提供三种确保数据正确…

    2025年12月14日
    000
  • Tkinter实现外部数据实时更新GUI组件的教程:利用after()方法

    本教程详细讲解如何在Tkinter应用中实现GUI组件(如Label)的实时更新,以响应外部数据源的变化。通过利用Tkinter的after()方法,我们可以在不阻塞主事件循环的前提下,周期性地读取外部数据并刷新界面,确保用户界面的流畅性和响应性。 理解Tkinter的事件循环与UI更新 tkint…

    2025年12月14日
    000
  • Python中高效检测数字组合可用性:Set与Counter的应用

    本文旨在解决在给定数字字符串中检查非连续数字组合是否可用的问题。传统字符串匹配无法有效处理此类场景。我们将介绍如何利用Python的set数据结构处理唯一数字组合的检测,以及如何使用collections.Counter来精确处理包含重复数字的组合检测,从而实现灵活且准确的组合可用性判断。 一、问题…

    2025年12月14日
    000
  • Discord.py 教程:实时检测用户状态变化并发送通知

    本教程将指导您如何使用 Discord.py 库监听并响应 Discord 服务器中成员的状态变化。我们将重点介绍正确的事件处理函数 on_member_update(),并演示如何配置必要的 Intents、比较用户状态,以及在状态发生改变时向指定频道发送通知消息,确保您的 Discord 机器人…

    2025年12月14日
    000
  • python如何处理文件

    Python通过open()函数处理文件,推荐使用with语句确保文件安全关闭。1. 用’r’、’w’、’a’等模式打开文件,配合encoding=’utf-8’避免中文乱码;2. 可逐行读取节省内存,或…

    2025年12月14日
    000
  • Python使用Xlwings复制Excel单元格多色字体及复杂格式教程

    在使用Python处理Excel时,openpyxl在复制单元格数据及基础格式方面表现良好,但对于包含多种字体颜色等富文本格式的单元格,其能力存在局限。本教程将深入探讨openpyxl在此类场景下的不足,并提供一个基于xlwings库的有效解决方案,通过模拟Excel原生复制粘贴功能,轻松实现复杂格…

    2025年12月14日
    000
  • Python代码的风格是什么?

    Python代码风格遵循PEP 8规范,使用snake_case命名变量和函数,CamelCase命名类,常量全大写;用4个空格缩进,逗号后加空格,行不超过79字符,函数间空两行,导入语句分组并按标准库、第三方库、本地库顺序排列。 Python代码的风格主要遵循PEP 8规范,这是官方推荐的编码风格…

    2025年12月14日
    000
  • Django连接PostgreSQL时“密码认证失败”问题解析与解决方案

    本文详细阐述了Django应用在连接本地PostgreSQL数据库时,即使pg_hba.conf配置为trust模式,仍可能遭遇“密码认证失败”错误的原因与解决方案。核心在于,Django的数据库配置通常要求用户拥有明确的密码,即使PostgreSQL服务器在trust模式下不强制要求。教程将指导您…

    2025年12月14日
    000
  • Python turtle 模块:利用循环优化多对象操作的重复代码

    本文探讨了如何在Python turtle 模块中,通过迭代处理多个turtle对象来消除重复代码,从而提升代码效率和可维护性。针对多个turtle实例需要执行相似但参数可能不同的操作场景,教程展示了如何使用嵌套循环将冗余代码精简为简洁高效的结构,实现更优雅的多对象控制。 引言:重复代码的困境 在p…

    2025年12月14日
    000
  • Python中大规模球体无重叠随机移动模拟的性能优化实践

    本文探讨了在Python中高效模拟大量无重叠球体在特定空间内随机移动的方法。针对初始实现中存在的性能瓶颈,文章详细介绍了如何通过优化近邻搜索(使用cKDTree的批处理查询和多核并行)、以及利用Numba进行JIT编译来显著提升模拟速度,实现更流畅、快速的物理模拟。 1. 问题背景与初始实现分析 在…

    2025年12月14日
    000
  • python如何创建一个空的文件_python创建空白文件的几种方法

    使用’x’模式或pathlib.Path.touch()可安全创建空文件。通过open(‘file’, ‘x’)可避免覆盖,文件存在时抛出异常;os.utime()和Path.touch()能创建文件或更新时间戳,适用于跨平台场…

    2025年12月14日
    000
  • Python中根据字符串动态更新对象属性的实用教程

    本教程旨在解决Python中根据字符串名称动态更新对象实例属性的常见问题。通过构建一个对象名称到实例的映射字典,并结合Python内置的setattr()函数,可以安全高效地实现从外部数据(如数据库查询结果)批量修改对象属性,避免了直接字符串操作或eval()带来的错误和安全隐患。 引言 在pyth…

    2025年12月14日
    000
  • Python对象属性的动态更新:从字符串名称到实际操作

    本文旨在解决Python中根据字符串名称动态更新对象属性的常见问题。通过创建一个对象名称到实例的映射字典,并结合Python内置的setattr()函数,可以安全高效地实现从外部数据源(如数据库查询结果)批量修改对象属性,避免了使用eval()等不不推荐的方法,从而提升代码的健壮性和可维护性。 理解…

    2025年12月14日
    000
  • Python中高效模拟无重叠球体随机运动:利用cKDTree和Numba提升性能

    本文探讨了在Python中高效模拟大量无重叠球体随机运动的方法。针对原始实现中因逐个球体碰撞检测导致的性能瓶颈,我们引入了多项优化策略。通过利用scipy.spatial.cKDTree的批量查询和多核并行能力,并结合Numba进行关键计算的热点加速,实现了显著的性能提升,有效解决了大规模球体运动模…

    2025年12月14日
    000
  • Selenium ChromeDriver 初始化常见错误与解决方案

    本文旨在解决使用 Python Selenium 初始化 Chrome WebDriver 时常见的 WebDriverException 错误,特别是“Failed to create Chrome process”问题。我们将深入探讨路径格式、Service 类实例化以及版本兼容性等核心问题,并…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信