Python爬虫(5)-selenium用显式等待、隐式等待、强制等待,解决反复爬取网页时无法定位元素问题

在这里插入图片描述
之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章
Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式
Python爬虫(2)-Selenium控制浏览器
Python爬虫(3)-Selenium结合pywin32模拟键盘操作
Python爬虫(4)-Selenium模拟鼠标操作

Python爬虫(5)-selenium用显式等待、隐式等待、强制等待,解决加载时长过长、反复爬取网页时无法定位元素问题


大部分的网页在被加载出来的时候都需要一个过程,添加一个等待就可以防止,页面加载没有完成的情况下进行爬虫操作导致元素不存在而出现报错的情况。

在这里插入图片描述

1.强制等待

time.sleep()设置一个固定的时间,一般来讲大部分的网站都会有反爬虫机制,所以我们需要去根据robot协议来进行设置时间,如果没有的话就需要进行测试,一般设置在5秒,如果5秒会触发反爬虫机制,那么就继续调高等待的时间即可。

但是这个方法对于一些网页突然给你来个弹窗和加载时间莫名变长的时候就没有任何卵用一样需要去排查那些错误出现的原因

用法也十分简单导入time包

import time

然后直接调用time.sleep(5)即可

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
handles = driver.window_handles
driver.get('https://www.csdn.net/?spm=1011.2415.3001.4476')
driver.refresh()
time.sleep(5)
driver.close()

2. 隐式等待

隐式等待和强制等待的效果差不多,只是变成如果超过时间指定元素没有被加载出来就给你抛出个异常。

其实强制等待如果没被找到一样会抛出异常,隐式等待唯一好处就是如果定位不到就会不断访问元素直到被找到,超出时长就抛出异常
使用方法就是driver.implicitly_wait(5)

缺点就是费时,实际情况就是你又要用到强制又要用到隐式,那么你爬虫速度和时间就要无限制被延长

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
handles = driver.window_handles
driver.get('https://www.csdn.net/?spm=1011.2415.3001.4476')
driver.refresh()
driver.implicitly_wait(5)
driver.close()

3.显式等待

显式等待就是每隔一个时间段就去检测一下元素是否存在,只要存在就执行,而且这有个好处就是快,只要检测到元素有就马上进行后续操作,不用等待非常长的时间,有时候需要快速进行弹出页面检测元素操作时显式等待配合强制等待爬虫就是最好的方式
使用方法:

WebDriverWait(driver, 3, poll_frequency=0.5, ignored_exceptions=None)

driver浏览器驱动,3就是超时时间3秒,poll_frequency=0.5就是每隔0.5秒扫描一次,ignored_exceptions=None就是忽略异常,因为元素出现找不到时就会报错,这种异常及其烦人,忽略异常就可以解决掉这个问题。

显示等待比较适合判断爬虫时检测多个元素是否存在,这样的话极大加速我们爬虫时的效率

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
handles = driver.window_handles
driver.get('https://www.csdn.net/?spm=1011.2415.3001.4476')
driver.refresh()
driver.implicitly_wait(5)
driver.close()
time.sleep(5)
WebDriverWait(driver, 3, poll_frequency=0.5, ignored_exceptions=None)
tr = driver.find_element(By.CSS_SELECTOR,'#life-tab-tra > a').text
print(tr)
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Python中,您可以使用Selenium的WebDriverWait来等待百度定位元素,并将显式等待功能带入代码。例如,您可以使用以下代码来等待页面元素:from selenium.webdriver.support.ui import WebDriverWaitwait = WebDriverWait(driver, 10) element = wait.until(lambda driver: driver.find_element_by_id("someId")) ### 回答2: 使用selenium库进行元素定位,可以通过selenium提供的显式等待功能来等待元素加载和可见性,并且可以结合百度搜索的页面特点进行元素定位。以下是一个示例代码: ```python 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 # 启动浏览器 driver = webdriver.Chrome() # 打开百度首页 driver.get("https://www.baidu.com") # 定位搜索输入框,并输入搜索关键字 search_input = driver.find_element(By.ID, "kw") search_input.send_keys("Hello World") # 定位搜索按钮,并点击 search_button = driver.find_element(By.ID, "su") search_button.click() # 设置显式等待条件,等待搜索结果页面中的第一个搜索结果出现 wait = WebDriverWait(driver, 10) first_result = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#content_left h3.t"))) # 输出第一个搜索结果的文本 print(first_result.text) # 关闭浏览器 driver.quit() ``` 在上述代码中,我们使用`WebDriverWait`类设置了一个最大等待间为10秒的显式等待条件,直到搜索结果页面中的第一个搜索结果出现为止。之后,我们获取了第一个搜索结果的文本并进行了输出。 以上就是一个简单的示例,演示了如何使用selenium进行元素定位,并结合百度搜索的特点使用显式等待功能。 ### 回答3: 在使用Python中的Selenium库进行网页元素定位,可以结合显式等待功能来提高程序的稳定性和可靠性。下面是将百度定位元素并添加显式等待功能的代码示例: 首先,需要导入selenium库和WebDriverWait模块: 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 接着,启动Chrome浏览器并打开百度页面: driver = webdriver.Chrome() driver.get('https://www.baidu.com') 使用显式等待定位等待元素加载完成: wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, 'kw'))) 这里的10是超间,单位为秒。上述代码中的(By.ID, 'kw')表示通过"kw"的id属性来定位元素,也可以根据不同的属性、标签名等来定位定位元素后,可以进行相应的操作: element.send_keys('Python') element.submit() 最后,关闭浏览器: driver.quit() 以上就是在Python中使用Selenium库将百度定位元素并添加显式等待功能的代码。通过显式等待,可以确保程序等待元素加载完成后再进行操作,提高了代码的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻烟飘荡

我想吃甜筒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值