【爬虫】5.6 Selenium等待HTML元素

这篇具有很好参考价值的文章主要介绍了【爬虫】5.6 Selenium等待HTML元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

任务目标

创建Ajax网站

创建服务器程序

Selenium XX 等待

1. Selenium强制等待

2. Selenium隐性等待

3. Selenium循环等待

4. Selenium显示等待

等待方法


任务目标

  • 在浏览器加载网页的过程中,网页的有些元素时常会有延迟的现象,在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()

模拟网站结果如下:

【爬虫】5.6 Selenium等待HTML元素,爬虫,python,selenium,查找HTML元素,...等待HTML元素【爬虫】5.6 Selenium等待HTML元素,爬虫,python,selenium,查找HTML元素,...等待HTML元素


Selenium XX 等待

1. 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()

2. 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()

3. Selenium循环等待

循环等待 实际上这个爬虫程序能否爬到数据的关键是<select>中是否已经出现了<option>元素,我们可以设置一个循环来判断是否有<option>元素

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

driver = webdriver.Chrome()
try:
    driver.get("http://127.0.0.1:5000")
    waitTime = 0
    while waitTime < 10:
        marks = driver.find_elements(By.XPATH, "//select/option")
        if len(marks) > 0:
            break
        time.sleep(0.5)
        waitTime += 0.5
    if waitTime >= 10:
        raise Exception("Waiting time out")
    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())
except Exception as err:
    print(err)
time.sleep(5)
driver.close()

循环等待 实际上这个爬虫程序能否爬到数据的关键是<select>中是否已经出现了<option>元素,我们可以设置一个循环来判断是否有<option>元素。 这个程序中使用 waitTime 变量来构造一个循环,它最长等待 10 秒,每间隔 0.5 秒就检查一次<select>中是否有<option>存在,如果找到了<option>元素就退出等待循环,不然就继续等待直到<option>出现为止,如果 10 秒内还没有出现据抛出异常。

4. Selenium显示等待

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
try:
    driver.get("http://127.0.0.1:5000")
    # 显示等待
    locator = (By.XPATH, "//select/option")
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))

    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())
except Exception as err:
    print(err)

构造一个定位元素的 locator 的对象,例如通过 XPath 的方法定位<select>中的<option>元素:

locator=(By.XPATH,"//select/option")

使用 WebDriverWait 构造一个实例,调用 until 方法:

WebDriverWait(driver, 10,0.5).until(EC.presence_of_element_located(locator))

这条语句的含义是等待 locator 指定的元素出现,最长等待 10 秒,每间隔 0.5 秒就出现检查一次。如果在 10 秒内出现了该元素就是结束等待,否则就抛出一个异常,默认抛出异常为:NoSuchElementException。

这种等待的优点:等待判断准确,不会浪费多余的等待时间,在实际中使用可以提高执行效率。


等待方法

1. EC.presence_of_element_located(locator)

这种形式是 等待 locator指定的元素 出现 ,也就是HTML文档中建立起了这个元素。

2. EC.visibility_of_element_located(locator)

这种形式是 等待 locator指定的元素 可见 ,注意元素出现时未见得可见,

例如:

<select id="xmark" style="display:none">...</select>

那么元素<select>是出现的但是不可见。

3. EC.element_to_be_clickable(locator)

这种形式是 等待 locator指定的元素 可以被点击

例如,在爬虫程序中等待 <input type="submit"> 按钮可用被点击:

locator = (By.XPATH, "//input[@type='submit']")

WebDriverWait(driver, 10,0.5).until(EC.element_to_be_clickable(locator))

或者等待 <option> 是否可以被点击: locator = (By.XPATH, "//select/option") WebDriverWait(driver,10,0.5).until(EC.element_to_be_clickable(locator))

使用这两种方法都可以爬取到手机品牌数据。

但是注意使用: locator = (By.XPATH, "//select") WebDriverWait(driver,10,0.5).until(EC.element_to_be_clickable(locator))

是等待<select>是否可以点击,这个元素就是没有<option>时也是可以点击的,因此用这个等待是爬取不到手机的品牌数据的。

4. EC.element_located_to_be_selected(locator)

这种形式是 等待 locator指定的元素 可以被选择,可以被选择的元素一般是<select>中的选项<option>、输入的多选框 <input type="checkbox"> 以及输入的单选框 <input type="radio">等元素。

locator = (By.XPATH, "//select/option")

WebDriverWait(driver, 10,0.5).until(EC.element_located_to_be_selected(locator))

同样能爬取到手机的品牌数据。

但是使用下列是不行的:

locator = (By.XPATH, "//input[@type='submit']")

WebDriverWait(driver,   10,0.5).until(EC.element_located_to_be_selected(locator))

因为这样的 <input type='submit'> 是怎么样也不可以选择的。

5. EC.text_to_be_present_in_element(locator,text)

这种形式是等待 locator 指定的元素的文本中包含指定的text文本,例如爬虫程序中使用下列的等待:

locator = (By.ID, "msg")

WebDriverWait(driver, 10,0.5).until(EC.text_to_be_present_in_element(locator,"品"))

即等待<span id="msg">......</span>元素中的文本包含"品"字,由于在<option>出现后设置文本是"品牌",因此爬虫程序可以爬取到手机品牌数据。


下一篇文章:实验项目一:【文本反爬网站的分析和爬取】
实战源码:Python网络爬虫实战文章来源地址https://www.toymoban.com/news/detail-682924.html

到了这里,关于【爬虫】5.6 Selenium等待HTML元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫——selenium_访问元素信息

    获取元素属性 获取标签名 获取元素文本

    2024年02月13日
    浏览(36)
  • selenium元素等待及滚动条滚动

    selenium三大等待,sleep(强制)、implicitlyWait(隐式等待)、WebDriverWait(显式等待),主要记一下最后面的WebDriverWait。 WebDriverWait是三大等待中最常用也是最好用的一种等待方式,比起另外两种而言,B格更高、更智能。写法为: 在iframe中也可以使用WebDriverwait,例如: 例子中

    2024年02月13日
    浏览(48)
  • RobotFrameWork - 08 - Selenium API - 元素相关操作、注释、休眠及等待元素出现

    元素相关操作 Input Text Click Element Click Button 注释 注释1 — Comment 注释2 — # 休眠及等待元素出现 Sleep Wait Until Page Contains Element 元素相关操作 Input Text 文本输入 Xpatt=//*[@]表示元素定位,定位文本输入框。 附:关于元素定位,参考“Selenium Xpath 定位详解.pdf”文档。 WebDriver基础

    2024年04月22日
    浏览(37)
  • selenium之显示等待(等到某个元素出现后再继续执行)

    本文章还请认真仔细阅读,非常简单,阅读前,你可能已经掌握,xpath 我们在爬虫的时候,总会利用time.sleep(),去等待元素的出现,但是这很容易出错,因为你不知道你的网速有多卡😂,从而导致频繁报错 我相信我的注释已经很 【言简意赅】了,你一定可以看得懂 我用了一

    2024年02月12日
    浏览(41)
  • Selenium教程:一文了解Selenium的元素查找

    注:本文内容基于selenium 3.141.0 Selenium的元素查找指的是使用Selenium WebDriver库中提供的方法来定位和操作网页上的各种元素,如文本框、按钮、下拉框、链接等。通过元素查找,可以在自动化测试中模拟用户操作,比如输入文本、点击按钮、选择下拉选项等。 Selenium提供了多种

    2024年03月15日
    浏览(47)
  • 爬虫学习(13):selenium自动化测试(二):等待页面加载完成

    在上一篇已经讲过了大部分的知识点和实战,本篇主要内容为知识点回顾和多个元素的定位知识点补充,以及补充页面加载知识点和案例。 在一个页面中有很多不同的策略可以定位一个元素。在你的项目中,你可以选择最合适的方法去查找元素。Selenium提供了下列的方法给你

    2024年02月06日
    浏览(59)
  • selenium查找svg元素

    目录 如何为SVG元素编写XPath 使用local-name()的语法 需要记住的一点

    2024年02月16日
    浏览(46)
  • 学习selenium+python使用 XPath 表达式来实现找到目标元素时智能封装等待,执行测试代码启动Chrome浏览器后,地址栏只显示data;

    学习使用 XPath 表达式来实现找到目标元素时智能封装等待 执行测试代码启动Chrome浏览器后,地址栏只显示 data; 看了好久找到了替代启动浏览器的方法:换成 self.driver.get(\\\'http://localhost:8080\\\') 就好了 然后开始琢磨两者的区别: 使用 self.driver.get(\\\'http://localhost:8080\\\') 时,driver 是

    2024年01月17日
    浏览(81)
  • 【爬虫】4.2 Scrapy 中查找 html 元素

    目录 Xpath简介 1. Scrapy 的 Xpath 简介 (1)使用xpath查找HTML中的元素 2. Xpath 查找 html 元素 (2)\\\"//\\\"与\\\"/\\\"的使用 (3)使用\\\".\\\"进行Xpath连续调用 (4)extract与extract_first函数使用 (5)获取元素属性值 (6)获取节点的文本值 (7)多个文本节点值 (8)使用condition限定tag元素 (9)使

    2024年02月09日
    浏览(27)
  • Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式

    selenium中有8种不错的元素定位方式,每个方式和应用场景都不一样,需要根据自己的使用情况来进行修改 目前selenium已经出现了新的版本的定位方式,虽然说定位语法不一样,但是万变不离其宗。 用旧版的定位语法就会出现这个删除线,你用他来进行爬虫的时候运行时就会提

    2024年02月03日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包