草庐IT

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

轻烟飘荡 2023-04-18 原文


之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章
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)

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

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  5. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  6. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

随机推荐