目录
3)找到元素但不是最新的(常在首次进入页面刷新后出现的问题)
一、异常情况
出现element find error异常情况大概分为以下几种:
1)查找元素本身不存在
2)元素的页面渲染跟不上速度
3)找到元素但不是最新的(常在首次进入页面刷新后出现的问题)
针对第一种异常可能就是代码写的有问题或者页面元素不存在(或有可能要查找的元素在iframe框架中,需要先进入到对应的iframe才能找得到),后面两种就是需要我们做一些动作来等待页面加载。每种方法都有对应的解决方式,下面记录下这几张异常的解决方法。
二、元素本身不存在异常
出现此种异常有两个原因:
1)页面元素不存在
打开页面查看html中的元素及属性
2)元素或在某个iframe里面
需要先进入到对应的iframe中,才能找到对应元素。进入iframe的方法代码如下:
from selenium import webdriver
# 使用class_name及id属性皆可定位
driver.switch_to.frame('name/id')
三、元素渲染跟不上速度
简单来讲就是页面加载太慢,导致元素加载不出来,代码在查找时找不到自然就会报错。对于这样及类似的问题,或只能使用等待加载的方法。
关于等待加载也有几种方法
1)隐式等待
from selenium import webdriver
# 设置隐式等待时间为3s
driver.implicitly_wait(3)
2)显示等待
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
# 等待元素可见 10s
WebDriverWait(driver,10).until(ec.presence_of_element_located((By.ID,'code')))
# 等待元素可点击 10s
WebDriverWait(driver,10).until(ec.element_to_be_clickable((By.ID,'code')))
3)循环等待
from selenium import webdriver
while True:
try:
if driver.find_element_by_link_text('下页').is_enabled() == True:
driver.find_element_by_link_text('下页').click()
break
except:
continue
4)强制等待
强制等待就是time.sleep(),也没什么好说的,哪个元素因为页面加载慢而找不到就在前面等待个几秒。
四、找到元素但不是最新的
这种情况我在页面中点击下一页的时候出现过这类问题。比如在爬取一个table元素,分为多页,而每一页的元素是一直存在,数据是更新的。这就导致我爬了三页但是结果中第二页的内容是没爬到的而是爬的第一页(第一页爬完 — 点击下一页 — 下一页没加载完但是元素存在,程序不知道没加载完,接着又爬了一遍第一页)
# 解决思路
# 确定一个页面的唯一内容如:当前第几页等等
# 我们可以利用这样一个信息,在每次点击下一页后获取当前页数是否等于当前循环的次数+1
# 这样就能保证如果获取当前页数不是等于当前循环的次数+1,则证明页面还没加载完
# 循环页数
for i in range(trade_page_num):
# 确认是否到达爬取的页数
while True:
try:
# # 当前页数
current_page_num_text = driver.find_element_by_id('pager').find_element_by_tag_name('td').text.split('/')[-1]
current_page_num = int(re.search('\d+', current_page_num_text).group())
if current_page_num == i+1:
log.info(f"当前执行流水第:{i + 1}页")
break
else:
raise ValueError('')
except:
continue
# 判断点击下一页的情况
if i >= trade_page_num - 1:
break
else:
while True:
try:
driver.find_element_by_link_text('下页').click()
except:
continue
else:
break