【爬虫】5.6 Selenium等待HTML元素

news2024/9/19 22:20:37

任务目标

  • 在浏览器加载网页的过程中,网页的有些元素时常会有延迟的现象,在HTML元素还没有准备好的情况下去操作这个HTML元素必然会出现错误,这个时候Selenium需要等待HTML元素。例如:上节实例中出现的select的下拉框元素,选项填充需要执行JavaScript脚本
  • 我们来学习如果使用Selenium等待延迟的HTML元素并最终爬取元素的数据。

创建Ajax网站

phone.html 如下:

注:phone.html 文件要位于 templates 这个目录下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form name="frm" action="/">
        <div>
            <span id="msg"></span>
            <label for="xmark"></label><select id="xmark"></select>
        </div>
        <input type="submit" value="提交" id="submit" disabled="true">
    </form>
</body>
<script>
    function loadMarks(){
        var http=new XMLHttpRequest(); 
        http.open("get","/marks",true);
        http.send(null);
        http.onreadystatechange=function(){
            // onreadystatechange存储函数,每当 readyState 属性改变时,就会触发调用该函数。
            // readystate存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
            // 0: 请求未初始化    1: 服务器连接已建立     2: 请求已接收    3: 请求处理中    4: 请求已完成,且响应已就绪
            // status,200(OK),404(未找到页面)
            if (http.readyState===4 && http.status===200){ //请求完成并且成功返回
                var xmark=document.getElementById("xmark"); 
                var xcolor=document.getElementById("xcolor"); 
                marks=eval("("+http.responseText+")");// JS中将JSON的字符串解析成JS对象格式
                for(var i=0;i<marks.length;i++) 
                    xmark.options.add(new Option(marks[i],marks[i])); 
                    document.getElementById("submit").disabled=false;
                    document.getElementById("msg").innerHTML="品牌";
            }
        };
    }
	loadMarks();
</script>
</html>

创建服务器程序

服务器server.py程序如下:

import flask
import json
import time

app = flask.Flask(__name__)


@app.route("/")
def index():
    return flask.render_template("phone.html")


@app.route("/marks")
def loadMarks():
    time.sleep(1)
    marks = ["华为", "苹果", "三星"]
    return json.dumps(marks)  # 将JSON的对象格式转化成str格式


app.run()

模拟网站结果如下:


Selenium强制等待

必须等待的时间,缺点:不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没有到,浪费时间),如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("http://127.0.0.1:5000")

# 设置强制等待1.5秒,
time.sleep(1.5)

marks = driver.find_elements(By.XPATH, "//select/option")
print("品牌数量:", len(marks))
for mark in marks:
    print(mark.text)
form = driver.find_element(By.XPATH, "//form")
print(form.get_attribute("innerHTML").strip())
time.sleep(5)
driver.close()

Selenium隐性等待

该方法是浏览器对象调用的方法,即设置浏览器打开网页均等待的时长, 同样如果设置的隐性等待时间不够长, 还是爬取不到需要的数据。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()

# 设置隐性加载时间1.5秒,即网页在加载时最长等待 seconds 秒
driver.implicitly_wait(1.5)

driver.get("http://127.0.0.1:5000")
marks = driver.find_elements(By.XPATH, "//select/option")
print("品牌数量:", len(marks))
for mark in marks:
    print(mark.text)
form = driver.find_element(By.XPATH, "//form")
print(form.get_attribute("innerHTML").strip())
time.sleep(5)
driver.close()

Selenium循环等待

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

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

相关文章

htmx-使HTML更强大

‍本文作者是360奇舞团开发工程师 htmx 让我们先来看一段俳句: javascript fatigue: longing for a hypertext already in hand 这个俳句很有意思&#xff0c;是开源项目htmx文档中写的&#xff0c;意思是说&#xff0c;我们已经有了超文本&#xff0c;为什么还要去使用javascr…

1、Spring是什么?

Spring 是一款主流的 Java EE 轻量级开源框架 。 框架 你可以理解为是一个程序的半成品&#xff0c;它帮我们实现了一部分功能&#xff0c;用这个框架我们可以减少代码的实现和功能的开发。 开源 也就是说&#xff0c;它开放源代码。通过源代码&#xff0c;你可以看到它是如何…

【问题思考总结】为什么B树中的搜索可以在分支结点上结束,而B+树必须到叶节点上才能结束?

问题提出 在刷到B树的时候&#xff0c;发现王道书上写B树非叶子结点仅仅起到索引作用&#xff0c;没有关键字对应记录的存储地址。 然而&#xff0c;观察B树的存储结构&#xff0c;我们发现&#xff0c;其中对于每个结点&#xff0c;也仅有结点的关键字信息和指向子树的指针…

SpringBoot—日志

目录 日志使用日志日志级别设置日志级别设置分组指定日志文件路径日志切割归档使用第三方日志框架log4j2配置文件【分级存储】logback配置文件【分级存储】 实例代码 日志 使用日志 给controller添加日志信息 要给controller类上添加Slf4j注解&#xff0c;然后使用log.info(…

Android 开发中的sdkmanager 操作说明(Delphi适用)

目录 sdkmanager 说明&#xff1a; 用法&#xff1a; 列出已安装和可用的软件包 安装软件包 更新所有已安装的软件包 接受许可 选项 sdkmanager 说明&#xff1a; sdkmanager 是一个命令行工具&#xff0c;您可以用它来查看、安装、更新和卸载 Android SDK 的软件包。如…

前端文件、图片直传OOS、分片上传、el-upload上传(vue+elementUI)

前言&#xff1a;基于天翼云的面相对象存储(Object-Oriented Storage&#xff0c;OOS),实现小文件的直接上传&#xff0c;大文件的分片上传。 开发文档地址&#xff1a;网址 上传之前的相关操作&#xff1a;注册账户&#xff0c;创建 AccessKeyId 和 AccessSecretKey之后&…

Private market:借助ZK实现的任意计算的trustless交易

1. 引言 Private market&#xff0c;借助zk-SNARKs和以太坊来 隐私且trustlessly selling&#xff1a; 1&#xff09;以太坊地址的私钥&#xff08;ECDSA keypair&#xff09;2&#xff09;EdDSA签名3&#xff09;Groth16 proof&#xff1a;借助递归性来匿名交易Groth16 proo…

RTK和CORS有什么区别?

高精度定位技术 关于高精度定位技术&#xff0c;RTK为业界熟知且被广泛应用&#xff0c;那么RTK到底是什么&#xff1f;仅仅是差分GPS吗&#xff1f; 其实并不尽然。 RTK RTK&#xff0c;载波相位差分技术&#xff0c;是实时处理两个测站载波相位观测量的差分方法&#xff0…

什么是OLAP

一、什么是OLAP OLAP&#xff08;On-line Analytical Processing&#xff0c;联机分析处理&#xff09;是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。可以比较下其与传统的OLTP&#xff08;On-line Transaction Processing&#xff0c;联机事务处理&…

分布式集群框架——Google文件系统GFS

Google文件系统GFS Google文件系统&#xff08;Google File System&#xff0c;GFS&#xff09;是一个大型的分布式文件系统。它为Google云计算提供海量存储&#xff0c;并且与Chubby、MapReduce以及Bigtable等技术结合十分紧密&#xff0c;处于所有核心技术的底层。由于GFS并不…

TDesign表单rules通过函数 实现复杂逻辑验证输入内容

Element ui 中 我们可以通过validator 绑定函数来验证一些不在表单model中的值 又或者处理一下比较复杂的判断逻辑 TDesign也有validator 但比较直观的说 没有Element那么好用 这里 我们给validator绑定了我们自己的checkAge函数 这个函数中 只有一个参数 value 而且 如果你的…

ssm计算机网络课程试卷生成器系统源码

ssm计算机网络课程试卷生成器系统源码099 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm package com.controller;import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays;…

spring cloud、gradle、父子项目、微服务框架搭建---spring secuity oauth2、mysql 授权(九)

文章目录 一、二、授权服务2.1 初始化表结构2.2 引入依赖2.3 自定义 用户详情类 UserDetailsService2.4 授权配置 AuthorizationServerConfiguration2.5 Web安全配置 WebSecurityConfiguration2.6 默认生成接口 三、资源服务3.1 引入依赖3.2 资源服务 ResourceServerConfig 四、…

2023年DAMA-CDGA/CDGP数据治理认证线上班到这里

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

探讨三维模型OBJ格式轻量化在数据存储的重要性

探讨三维模型OBJ格式轻量化在数据存储的重要性 三维模型的OBJ格式轻量化在数据存储方面具有重要性。以下是对三维模型OBJ格式轻量化在数据存储的重要性进行浅析&#xff1a; 1、节省存储空间&#xff1a;原始的三维模型文件往往非常庞大&#xff0c;占据大量的存储空间。通过进…

亚马逊产品流量来源?产品流量如何增加?

"亚马逊产品流量"通常指的是在亚马逊平台上的商品页面上产生的访问量或点击量。这是衡量产品在亚马逊上的曝光和受关注程度的重要指标之一。产品流量的多少可以影响销售和排名等方面。 亚马逊产品流量的来源可以有多种&#xff0c;包括&#xff1a; 1、有机流量&…

基于python的豆瓣电影数据分析可视化系统(包含文档+源码)

本系统采用Python技术和Django 搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发基于python的豆瓣电影数据分析可视化系统。通过调研和分析&#xff0c;系统拥有管理员和用户两个角色&#xff0c;主要具备个人中心、电影管理、用户管理、系统管理…

基于Spring Boot的高校学生党校系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校学生党校系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

DC电源模块在仪器设备中使用的突出表现

BOSHIDA DC电源模块在仪器设备中使用的突出表现 DC电源模块是一种广泛应用于各种电子设备中的电源设备&#xff0c;它的最显著特点就是可以将电源直接转换为直流电&#xff0c;而且可以根据需要进行稳定地输出&#xff0c;这使得它在很多领域都有着广泛的应用。 在仪器设备中…

Android Native Code开发学习(二)JNI互相传参返回调用

Android Native Code开发学习&#xff08;二&#xff09; 本教程为native code学习笔记&#xff0c;希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04&#xff0c;当然windows也是可以的&#xff0c;区别不大 一、native code介绍 native code就是在android项目中混合C或…