Bootstrap

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)
;