Selenium请求过快 解决方法

Posted sunzzc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium请求过快 解决方法相关的知识,希望对你有一定的参考价值。

 等待界面元素出现

在进行网页操作的时候,有的元素内容不是可以理解出现的,可能会等待一段时间,比如

百度搜索一个词语,点击搜索后,浏览器需要把这个搜索请求发送给百度服务器,百度服务

器处理后,再把搜索结果返回

所以,从点击搜索到得到结果,需要一定的时间

只是通常百度服务器的处理比较快,感觉是立即出现了搜索结果。

百度搜索的每个结果对应界面元素其ID分别是数字1,2,3,4.....

如下:

技术图片

 

 

 过快请求实例:

from selenium import webdriver  # 导包
import time
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get(‘https://www.baidu.com‘)

ele = borwser.find_element_by_id(‘kw‘)
ele.send_keys(‘老祝头博客园‘)
cl = borwser.find_element_by_id(‘su‘).click()

eles = borwser.find_element_by_id(‘1‘)
print(eles.text)

 运行会抛出如下异常:

技术图片

 

 在短暂的瞬间,网页上是没有id为1的元素的(因为还没搜索到结果)自然会报错id为1的元素不存在

如果用 sleep等待几秒钟,等百度服务返回结果后再去选择元素,那样会浪费大量时间

 

Selenium提供了一个更合理的解决方案:

当发现元素没有找到的时候,并不立即返回找不到元素的错误。

而是周期性(每隔半秒)重新查找该元素,直到找到该元素

或者超出指定最大等待时间,才抛出异常,(若是find_elements 方法,则返回空列表)

 Selenium 的 Webdrive 对象有一个方法: implictly_wait(隐式等待)

该方法接收一个参数用来指定最大等待时间。

实例代码:

borwser.implicitly_wait(10)

后续的 find_element 等方法的调用都会采用上面的策略;

此方法会偷偷的设置等待时间 每隔半秒再找元素 最大上限为10秒

实例代码:

from selenium import webdriver  # 导包
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get(‘https://www.baidu.com‘)
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)

ele = borwser.find_element_by_id(‘kw‘)
ele.send_keys(‘老祝头博客园‘)
cl = borwser.find_element_by_id(‘su‘).click()

eles = borwser.find_element_by_id(‘1‘)
print(eles.text)

以上是关于Selenium请求过快 解决方法的主要内容,如果未能解决你的问题,请参考以下文章

使用Selenium如何获取网络请求

canvas 橡皮擦 解决滑动过快出现圆点问题

Selenium Xpath元素无法定位 NoSuchElementException: Message: no such element: Unable to locate element(代码片段

爬虫请求库——selenium

将 Selenium 与 Scrapy 集成

请求库之 selenium模块