动态网站数据爬取——Selenium的使用

Selenium 是一个广泛使用的自动化工具,最初设计用于测试 Web 应用程序的功能,但它也被广泛用于爬虫开发,尤其是处理动态网页和需要 JavaScript 渲染的页面。它支持多种浏览器(如 Chrome、Firefox、Edge、Safari 等)并且可以模拟用户在浏览器中的一系列操作,如点击、滚动、输入等。

1.1 Selenium基本操作
1.1.1 浏览器启动

Selenium 能够通过 WebDriver 启动指定的浏览器实例,并进行自动化操作。WebDriver 是 Selenium 的核心组件之一,它提供了与浏览器交互的接口。在 Python 中,通常使用 selenium.webdriver 来启动浏览器。

from selenium import webdriver# 启动 Chrome 浏览器
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')# 启动 Firefox 浏览器
# driver = webdriver.Firefox(executable_path='/path/to/geckodriver')# 访问网页
driver.get('https://example.com')# 获取页面标题
print(driver.title)# 关闭浏览器
driver.quit()

解析

  • webdriver.Chrome() 启动 Chrome 浏览器,参数 executable_path 用于指定 ChromeDriver 可执行文件的路径。不同浏览器需要不同的驱动(如 geckodriver 用于 Firefox)。
  • driver.get(url) 用于访问指定的网页 URL。
  • driver.quit() 用于关闭浏览器,结束 Selenium 会话。
1.1.2 元素定位

元素定位是与 Selenium 交互的关键。在爬虫中,我们需要准确找到网页中的元素,以便提取内容、点击链接或填写表单等。Selenium 提供了多种方式来定位网页元素。

常用的元素定位方法包括:

  • By.ID:通过元素的 ID 属性定位。
  • By.NAME:通过元素的 name 属性定位。
  • By.CLASS_NAME:通过元素的 class 属性定位。
  • By.TAG_NAME:通过元素的标签名定位。
  • By.CSS_SELECTOR:通过 CSS 选择器定位元素。
  • By.XPATH:通过 XPath 定位元素(非常强大,支持更复杂的选择)。
from selenium.webdriver.common.by import By# 使用 ID 定位
element = driver.find_element(By.ID, 'loginButton')# 使用 CLASS_NAME 定位
element = driver.find_element(By.CLASS_NAME, 'btn-primary')# 使用 CSS_SELECTOR 定位
element = driver.find_element(By.CSS_SELECTOR, '.content > p')# 使用 XPATH 定位
element = driver.find_element(By.XPATH, '//div[@class="content"]/p')

解析

  • find_element() 方法用于定位单个元素。如果定位的元素不存在,Selenium 会抛出 NoSuchElementException 异常。
  • find_elements() 用于查找多个符合条件的元素,返回的是一个列表。
1.1.3 动作模拟

Selenium 允许我们模拟一系列用户操作,如点击、输入文本、鼠标悬停、键盘按键等。这些动作在爬取动态网页时尤其重要,因为很多网页的交互和数据加载依赖于用户操作。

  1. 点击操作
button = driver.find_element(By.ID, 'submitButton')
button.click()
  1. 输入文本
input_box = driver.find_element(By.NAME, 'username')
input_box.send_keys('myUsername')# 清空输入框
input_box.clear()# 输入密码
password_box = driver.find_element(By.NAME, 'password')
password_box.send_keys('myPassword')
  1. 鼠标悬停(使用 ActionChains)
from selenium.webdriver.common.action_chains import ActionChains# 鼠标悬停到某个元素上
element = driver.find_element(By.ID, 'hoverElement')
actions = ActionChains(driver)
actions.move_to_element(element).perform()
  1. 滚动页面
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
1.1.4 隐式和显式等待

在动态网页中,页面内容通常是异步加载的,直接操作可能会导致元素尚未加载完成而抛出异常。为了解决这个问题,Selenium 提供了等待机制。

  • 隐式等待:每次查找元素时都会等待指定的时间(如果元素在指定时间内出现,则继续执行,否则抛出异常)。
# 设置隐式等待,单位为秒
driver.implicitly_wait(10)
  • 显式等待:显式等待是在特定条件下等待某个元素出现或变为可操作状态。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 显式等待元素加载,最多等待 10 秒
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'dynamicElement'))
)

解析

  • implicitly_wait() 设置了全局的隐式等待时间,Selenium 会在每次寻找元素时等待该时间。
  • WebDriverWaitexpected_conditions 用于显式等待。presence_of_element_located 用于等待元素加载,visibility_of_element_located 用于等待元素可见。
1.2 处理动态加载的页面内容

动态加载的页面通常通过 JavaScript、AJAX 或 WebSocket 等技术实现内容的异步加载。在这种情况下,页面初始加载时并不会包含所有数据,数据通常是在用户操作后或页面滚动时通过异步请求加载。要抓取动态加载的内容,需要特定的技巧。

1.2.1 等待页面加载完成

在处理动态加载的网页时,首先需要等待页面或某些元素完全加载。可以使用 Selenium 的显式等待,确保在执行数据提取操作之前,目标内容已经被加载。

# 等待页面上的某个特定元素加载完成
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'targetElement'))
)
1.2.2 模拟滚动加载内容

一些动态网页内容是在用户滚动页面时通过 JavaScript 动态加载的。这种情况下,我们可以模拟滚动操作,迫使浏览器加载更多数据。

# 模拟页面向下滚动
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 等待加载完成后再执行下一步操作
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'nextPageElement'))
)
1.2.3 获取 Ajax 请求的数据

许多动态页面通过 Ajax 请求从服务器获取数据。爬虫可以直接监听这些 Ajax 请求,并通过捕获请求的响应数据来提取内容,而不必等到页面完全渲染后再进行提取。

  1. 通过浏览器开发者工具获取 Ajax 请求 打开浏览器开发者工具的 "Network" 面板,刷新页面后,可以看到所有网络请求。找到与数据相关的 Ajax 请求,并记录该请求的 URL 和参数。

  2. 使用 Selenium 获取 Ajax 请求的数据 Selenium 允许通过 JavaScript 访问浏览器的开发者工具 API,从而获取 Ajax 请求的响应。

# 获取页面的所有网络请求
requests = driver.execute_script("return window.performance.getEntriesByType('resource');")
for request in requests:if "api" in request['name']:print(request['name'])
1.2.4 处理 JavaScript 渲染的内容

一些动态页面依赖于 JavaScript 渲染内容。如果内容通过 JavaScript 生成并插入到 DOM 中,Selenium 可以模拟浏览器执行 JavaScript 脚本并返回渲染后的页面。

# 获取渲染后的页面内容
html_content = driver.page_source

此时,driver.page_source 返回的是执行 JavaScript 后的页面 HTML,包含了所有动态加载的内容。

1.2.5 处理验证码与反爬虫机制

有时,网站会通过验证码或反爬虫机制(如IP封锁、请求头检查等)来防止爬虫抓取数据。在这种情况下,可以使用一些技巧绕过反爬虫机制。

  • 使用代理:通过代理池来绕过IP封锁。
  • 模拟真实浏览器:通过更改请求头,模拟真实浏览器的访问行为。
  • OCR识别验证码:使用 OCR(如 Tesseract)识别验证码并提交。

总结

Selenium 是一个非常强大的工具,适用于处理动态网页的爬取。它能够模拟用户的浏览器操作,包括点击、输入、滚动等操作,从而触发数据的加载。在处理动态加载的网页时,Selenium 的显式等待、滚动操作和 JavaScript 执行都能够帮助开发者提取渲染后的数据。

随着动态网页的逐渐增多,爬虫开发者越来越依赖 Selenium 来抓取复杂的网页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18128.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

容器运行时 AND Docker

容器运行时 and Docker 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集(‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进…

Scala-数据类型-概述(Scala 3.x 类型层次结构)

Scala Scala-数据类型 Scala1. Any — 顶级类型2. Matchable — 匹配类型3. AnyVal — 值类型的父类4. AnyRef — 引用类型的父类5. Null - 引用类型的子类型Tips: 为什么 null 不推荐使用? 6. Nothing - 底层类型 (Bottom Type)整理不易,对您有帮助的话…

Linux:权限相关知识详解

1.shell命令以及运行原理 1.1初步理解认识shell Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell&…

React中常用的钩子

在当今,React的钩子写法已经逐渐成为了一种主流开发模式,本文将介绍几种在React中常用的钩子 useState 可以用来双向绑定,创建需要监听变化并且使用的数据 使用该钩子定义时,参数可以是一个直接定义好的变量,也可以是…

.NET SDK 各操作系统开发环境搭建

一、Win10(推荐) 1、VS 2022 社区版 # 下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ 2、.NET 6 SDK # 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 3、Hello World 如果需要使用旧程序样式时,则…

Linux 下网络套接字(Socket) 与udp和tcp 相关接口

文章目录 1. socket常见API2 sockaddr结构体及其子类1. sockaddr结构体定义(基类)2. 子类 sockaddr_in结构体用于(IPv4)3 子类 sockaddr_un(Unix域套接字)4. 总结画出其结构体 3.实现一个简单的tcp Echo 服务器和客户端(cpp)3.1 客户端3.2 服…

跨平台WPF框架Avalonia教程 七

数据绑定 Avalonia使用数据绑定将数据从应用程序对象传递到UI控件,根据用户输入更改应用程序对象中的数据,并在响应用户命令时对应用程序对象进行操作。 在这种安排中,控件是绑定目标,而对象是数据源。 Avalonia运行数据绑定系统…

日常ctf

1, [陇剑杯 2021]日志分析(问1) %2e 为URL编码的符号 "." flag{www.zip} 2, [陇剑杯 2021]日志分析(问2) 根据之前题目的分析,在获取到源码文件之后,黑客又成功访问了in…

基于微信小程序的校园助手+LW示例参考

1.项目介绍 项目角色:管理员、普通用户功能模块:管理员(用户管理、寻物启事管理、物品分类管理、表白广场、吐槽大会、二手交易、拼车出行等)、普通用户(登录注册、寻物启事、失物招领、表白广场、吐槽大会、拼车出行…

逆向攻防世界CTF系列38-xxxorrr

逆向攻防世界CTF系列38-xxxorrr 64位无壳,很自然的找到main和一个比较函数 以为逻辑很简单了 enc [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46,0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0…

数据结构-堆排序笔记

1 思路 总体思路 首先我们会拿到一个无序的数组,我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质,直至大顶堆只剩下一个元素。 具体思路 首先我们先将一个…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件(此处是tsx、直接用app或者jsx也行) import { useState, useEffect } from react impo…

跨平台WPF框架Avalonia教程 六

添加交互性 用户界面的一个基本功能是与用户进行交互。在Avalonia中,您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。 处理事件​ Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处…

【传知代码】VRT_ 关于视频修复的模型

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ VRT_ 关于视频修复的模型 背景介绍:重要性: VRT的重要性和研究背景VRT的背景:VRT的重要性: 视…

药界互联:中药实验管理的网络化

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足,创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

【Linux】进程字段、环境变量与进程地址空间

🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想,准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

基于isSpring的PPT转换

背景 PPT课件目前还是一项在教学中高度频繁使用的工具,对于在线教学就更为重要了。如何把PPT转换为在线web,同时保留更多的PPT特性(动画、音效、视频)呢?这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一…

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…