爬虫进阶: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.mzph.cn/diannao/41193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言 函数和包

go语言 函数和包 一、函数 在Go语言中,函数是执行特定任务的自包含代码块。 1.函数的定义 函数通过func关键字定义,格式如下: func 函数名(形参 形参类型, 形参 形参类型) 返回值类型 {函数体return 返回值 }2.基础函数类型 无参数无返回…

vue中数组出现__ob__: Observer属性,导致不能正确使用问题解决

直接上图,如下图,数组中出现__ob__: Observer属性,导致无法取值。 解决方案为:JSON.parse(JSON.stringify(数组变量名))深拷贝数组,重新生成一个可枚举数组。 // 处理代码如let tempIds JSON.parse(JSON.stringify(i…

一文带你初探FreeRTOS信号量

本文记录我初步学习FreeRTOS的信号量的知识,在此记录分享,希望我的分享对你有所帮助! 什么是信号量 在FreeRTOS中,信号量(Semaphore)是一种用于任务间同步和资源共享的机制。信号量主要用于管理对共享资源的…

Cgi上传文件 注意事项

//核心代码 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //错误方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 参考博客&#xff1a; https://blog.cs…

GNU/Linux - 各种包管理器介绍

Linux 包管理器根据不同的发行版和包管理系统有所不同。以下是一些常见的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在图片上添加文字

HTML如何在图片上添加文字 当我们开发一个页面&#xff0c;插入图片时&#xff0c;需要有一组文字对图片进行描述。那么HTML中如何在图片上添加文字呢&#xff1f;这篇文章告诉你。 先让我们来看下效果图&#xff1a; 句子“这是一张夜空图片”被放置在了图片的左下角。 那么…

Leetcode.342 4的幂

给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4x 示例 1&#xff1a; 输入&#xff1a;n 16 输出&#xff1a;true示…

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…

C#面:ASP.NET Core Filter如何⽀持依赖注⼊?

ASP.NET Core Filter可以通过依赖注入来支持。在ASP.NET Core中&#xff0c;依赖注入是一种将依赖对象提供给类的机制&#xff0c;它可以帮助我们解耦和测试代码。 要在ASP.NET Core Filter中使用依赖注入&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物联网教学09

ESP32CAM物联网教学09 摄像头配上显示屏 小智给摄像头配上了一块液晶显示屏,ESP32Cam变得更加酷炫了,应用也更加广泛了。 TFT彩色显示屏从第一课的CameraWebServer开始,我们一直都是利用浏览器来查看显示摄像头的视频流,都需要借助这个网页提供的服务。 可以让ESP32Cam开…

【案例干货】智能导览智慧景区系统小程序开发主要功能

智能景区/园区导览系统是一种利用云计算、物联网等新技术&#xff0c;通过互联网或移动互联网&#xff0c;借助便携的终端上网设备&#xff0c;为游客提供全方位、便捷化街区导航与信息服务的系统。 其主要功能可以归纳为以下几个方面&#xff1a; 1. 街区资讯展示 信息介绍&…

缠中说禅李彪08年“假死”具体原因探讨

在缠中说禅的信徒圈内&#xff0c;流传着创始人李彪于2008年逝世的说法&#xff0c;这一事件常被描绘成一种悲壮的牺牲&#xff0c;仿佛是为了其理念与信徒们的福祉鞠躬尽瘁。然而&#xff0c;这一“逝世”既未经公开证实&#xff0c;也与李彪生前构建的高大名声形成了某种讽刺…

短链接学习day2

用户敏感信息脱敏展示&#xff1a; RequestParam 和 PathVariable的区别 注解是用于从request中接收请求的&#xff0c;两个都可以接收参数&#xff0c;关键点不同的是RequestParam 是从request里面拿取值&#xff0c;而 PathVariable 是从一个URI模板里面来填充。 PathVari…

异步加载与动态加载

异步加载和动态加载在概念上有相似之处&#xff0c;但并不完全等同。 异步加载&#xff08;Asynchronous Loading&#xff09;通常指的是不阻塞后续代码执行或页面渲染的数据或资源加载方式。在Web开发中&#xff0c;异步加载常用于从服务器获取数据&#xff0c;而不需要用户等…

昇思25天学习打卡营第12天|ResNet50迁移学习

昇思25天学习打卡营第12天|ResNet50迁移学习 前言ResNet50迁移学习数据准备下载数据集 加载数据集数据集可视化 训练模型构建Resnet50网络固定特征进行训练训练和评估可视化模型预测 个人任务打卡&#xff08;读者请忽略&#xff09;个人理解与总结 前言 非常感谢华为昇思大模型…

vite简介

vite是新一代前端构建工具&#xff0c;vite具有优势如下&#xff1a; 轻量快速的热重载&#xff08;HMR&#xff09;&#xff0c;能实现快速的服务启动。对TypeScript、JSX、CSS等支持开箱即用。真正的按需编译&#xff0c;不再等待整个应用编译完成。webpack构建与vite构建对…

Java 遍历Map的方法

在Java中遍历Map可以采用以下几种常见方法&#xff1a; 1、使用 entrySet 遍历 这是最常见的遍历方式&#xff0c;同时访问键值对。 for (Map.Entry<K, V> entry : map.entrySet()) {K key entry.getKey();V value entry.getValue();// 处理键值对} 2、遍历 keySet 后…

【Java】CompletableFuture+Mockito单元测试不通过 Unnecessary stubbings detected

文章目录 问题描述问题分析解决Thread.sleepget()Mockito.lenient() 问题描述 有个接口使用CompletableFuture实现的异步调用&#xff0c;现在要用Mockito写单元测试 Testpublic void updateNumAsync() {Integer newNum 600;// updateRoleCountAsync用CompletableFuture异步调…

Jenkins 强制杀job

有时候有的jenkins job运行时间太长&#xff0c;在jenkins界面点击x按钮进行abort&#xff0c;会失败&#xff1a; 这时候点击&#xff1a; “Click here to forcibly terminate running steps” 会进一步kill 任务&#xff0c;但是也还是有杀不掉的可能性。 终极武器是jenkin…

vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;提供了可重用的组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。 官网 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安装 VueUse npm i vueuse/core vueuse/components&#xff08;可选&a…