爬虫进阶:Selenium与Ajax的无缝集成

00475.png

爬虫与Ajax的挑战

Ajax(Asynchronous JavaScript and XML)允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分内容。这为用户带来了更好的体验,但同时也使得爬虫在抓取数据时面临以下挑战:

  1. 动态内容加载:Ajax请求异步加载数据,爬虫需要等待数据加载完成才能抓取。
  2. JavaScript依赖:Ajax通常依赖JavaScript执行,而传统爬虫不执行JavaScript。
  3. 元素定位:动态加载的内容可能导致元素的ID或类名发生变化,使得定位变得困难。

Selenium的优势

Selenium是一个用于自动化Web应用程序测试的工具,它能够模拟用户的真实交互,包括处理JavaScript和Ajax。使用Selenium,爬虫可以:

  1. 执行JavaScript:Selenium可以执行页面中的JavaScript代码。
  2. 等待Ajax请求:Selenium提供了等待机制,可以等待Ajax请求完成。
  3. 元素定位:Selenium可以定位到动态生成的元素。

环境搭建

要使用Selenium,首先需要安装Selenium库和对应的WebDriver。以下是Python环境下的安装步骤:

pip install selenium

确保下载了与浏览器对应的WebDriver,例如Chrome的ChromeDriver,并将其路径添加到系统PATH中。

Selenium与Ajax集成的基本步骤

1. 初始化WebDriver

from selenium import webdriverdriver = webdriver.Chrome()

2. 访问目标网页

driver.get("http://example.com/ajax")

3. 等待Ajax请求完成

Selenium提供了显式等待和隐式等待两种方式来处理Ajax请求。

显式等待

显式等待允许你设置等待条件和超时时间。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "dynamic-element")))
隐式等待

隐式等待为所有查找操作设置全局等待时间。

driver.implicitly_wait(10)  # 等待10秒
element = driver.find_element_by_id("dynamic-element")

4. 抓取数据

一旦Ajax请求完成,就可以使用Selenium提供的API抓取数据。

data = element.text
print(data)

5. 关闭WebDriver

完成数据抓取后,关闭WebDriver。

driver.quit()

实现代码示例

以下是一个使用Selenium处理Ajax动态加载内容的爬虫示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.proxy import Proxy, ProxyType# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 创建代理对象
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyHost}:{proxyPort}"
proxy.ssl_proxy = f"{proxyHost}:{proxyPort}"
proxy.add_to_capabilities(webdriver.DesiredCapabilities.CHROME)# 初始化WebDriver,添加代理
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}/')
driver = webdriver.Chrome(options=chrome_options)# 目标网页URL
url = "http://example.com/ajax-content"# 打开网页
driver.get(url)# 显式等待Ajax加载完成
wait = WebDriverWait(driver, 20)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ajax-loaded")))# 抓取需要的数据
data = driver.find_element_by_class_name("ajax-loaded").text# 输出数据
print(data)# 关闭浏览器
driver.quit()

性能优化与最佳实践

  1. 合理设置等待时间:避免过长的等待时间,影响爬虫效率。
  2. 异常处理:增加异常处理逻辑,确保爬虫的稳定性。
  3. 元素定位策略:使用更稳定的元素定位策略,如CSS选择器或XPath。
  4. 资源管理:确保及时关闭WebDriver,释放资源。

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

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

相关文章

伪元素content追加文字使用小技巧

E::before和E::after本身的作用是追加字&#xff0c;直接在文字后面追加链接 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

bpftrace几种使用实例

1. 排查内存泄漏 memory.c memory.bt 可以执行相关memory&#xff0c;用bpftrace追踪malloc和free的过程 修改memory.bt&#xff0c;加上malloc和free统计&#xff0c;重新执行 2. 验证tcp连接关闭是应用关闭还是内核关闭 nginx服务启动后&#xff0c;会处于监听状态&…

1999-2022年企业持续绿色创新水平数据

企业持续绿色创新水平数据为研究者提供了评估企业在绿色技术领域创新持续性和能力的重要视角。以下是对企业持续绿色创新水平数据的介绍&#xff1a; 数据简介 定义&#xff1a;企业持续绿色创新水平反映了企业在一定时期内绿色专利申请的持续性和创新能力。计算方法&#xf…

Redis 多数据源 Spring Boot 实现

1.前言 本文为大家提供一个 redis 配置多数据源的实现方案&#xff0c;在实际项目中遇到&#xff0c;分享给大家。后续如果有时间会写一个升级版本&#xff0c;升级方向在第5点。 2.git 示例地址 git 仓库地址&#xff1a;https://github.com/huajiexiewenfeng/redis-multi-…

Cesium 二三维热力图

Cesium 二三维热力图 原理&#xff1a;主要依靠heatmap.js包来实现 效果图&#xff1a;

昇思25天学习打卡营第18天|Pix2Pix实现图像转换

Pix2Pix概述 Pix2Pix是基于条件生成对抗网络实现的一种深度学习图像转换模型。Pix2Pix是将cGAN应用于有监督的图像到图像翻译&#xff0c;包括生成器和判别器。 基础原理 cGAN的生成器是将输入图片作为指导信息&#xff0c;由输入图像不断尝试生成用于迷惑判别器的“假”图像…

【JavaSE】异常(Exception)

目录 异常是什么异常的分类异常的处理方法throw抛出异常异常的声明异常的捕获和处理finally 自定义异常类 异常是什么 异常就是程序在进行时的不正常行为&#xff0c;就像之前数组时会遇到空指针异常&#xff08;NullPointerException&#xff09;&#xff0c;数组越界异常&am…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…

用Python轻松转换PDF为CSV

数据的可访问性和可操作性是数据管理的核心要素。PDF格式因其跨平台兼容性和版面固定性&#xff0c;在文档分享和打印方面表现出色&#xff0c;尤其适用于报表、调查结果等数据的存储。然而&#xff0c;PDF的非结构化特性限制了其在数据分析领域的应用。相比之下&#xff0c;CS…

Golang | Leetcode Golang题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; type pair struct{ right, height int } type hp []pairfunc (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].height > h[j].height } func (h hp) Swap(i, j int) { h[i], h[j]…

python: create Envircomnet in Visual Studio Code 创建虚拟环境

先配置python开发环境 1.在搜索栏输入“>" 或是用快捷组合键ctrlshiftP键 就会显示”>",再输入"python:" 选择已经安装好的python的版本,选定至当前项目中&#xff0c;都是按回车 就可以看到创建了一个虚拟环境的默认的文件夹名".venv" 2 …

14-38 剑和诗人12 - RAG+ 思维链 ⇒ 检索增强思维(RAT)

在快速发展的 NLP 和 LLM 领域&#xff0c;研究人员不断探索新技术来增强这些模型的功能。其中一种备受关注的技术是检索增强生成 (RAG) 方法&#xff0c;它将 LLM 的生成能力与从外部来源检索相关信息的能力相结合。然而&#xff0c;最近一项名为检索增强思维 (RAT) 的创新通过…

大数据平台之数据同步

数据同步也成为CDC (Chanage Data Capture) 。Change Data Capture (CDC) 是一种用于跟踪和捕获数据库中数据变更的技术&#xff0c;它可以在数据发生变化时实时地将这些变更捕获并传递到下游系统。以下是一些常用的开源 CDC 方案&#xff1a; 1. Flink CDC Flink CDC 是基于 …

iptables与firewalld

iptables Linux上常用的防火墙软件 1、 防火墙的策略 防火墙策略一般分为两种&#xff0c;一种叫通策略&#xff0c;一种叫堵策略&#xff0c;通策略&#xff0c;默认门是关着的&#xff0c;必须要定义谁能进。堵策略则是&#xff0c;大门是洞开的&#xff0c;但是你必须有身…

迅捷PDF编辑器合并PDF

迅捷PDF编辑器是一款专业的PDF编辑软件&#xff0c;不仅支持任意添加文本&#xff0c;而且可以任意编辑PDF原有内容&#xff0c;软件上方的工具栏中还有丰富的PDF标注、编辑功能&#xff0c;包括高亮、删除线、下划线这些基础的&#xff0c;还有规则或不规则框选、箭头、便利贴…

C++ volatile 关键字

C volatile &#xff08;只有release下才会生效&#xff09; 1、告诉编译器volatile修饰的变量不要进行指令顺序的优化&#xff0c;以保证代码编写者的真实意图&#xff1b; int a 0;int b 10;int c 100;int* p &a;p &b;p &c;如果不加volatile修饰 p , 编译…

香橙派AIpro测评:yolo8+usb鱼眼摄像头的Camera图像获取及识别

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比&#xff0c;同时还可以兼容ubuntu、安卓等多种操作系统&#xff0c;今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV8s算法的部署并使用一个外接的鱼眼USB摄像头…

Bellman equation的不同形式及变化

总忘记贝尔曼方程的推导过程&#xff0c;自己推一遍吧 matrix-vector form就省略了 对于matrix-vector form形式的状态价值贝尔曼方程求解&#xff0c;若已知MDP的动态&#xff08;转移矩阵P和奖励函数R&#xff09;&#xff0c;则计算复杂度的贡献主要来自矩阵求逆&#xff…