【问题标题】:WebScraping through multiple sites with Selenium使用 Selenium 通过多个站点进行 Web 抓取
【发布时间】:2021-08-28 08:45:33
【问题描述】:

我在一个项目中使用 Selenium,该项目包括打开一系列网站,这些网站包含几乎相同的结构,在每个网站中收集数据并存储它。

我遇到的问题是一些我不想访问的站点不可用,当程序到达其中一个站点时它就会停止。

我想要它做的是跳过这些并继续进行下一次迭代,但到目前为止我的尝试已经过时了......在我最近的尝试中,我使用了方法 is_displayed(),但显然它只会告诉我一个元素是否可见,而不是告诉我它是否存在。

if driver.find_element_by_xpath('//*[@id="main-2"]/div[2]/div[1]/div[1]/div/div[1]/strong').is_displayed():

上面的例子不起作用,因为驱动程序需要先找到元素,然后再告诉我它是否可见,但元素根本不存在。

你们中有人处理过类似的事情吗?

How one of the sites looks like normally

How it looks like when it is unavailable

【问题讨论】:

  • 避免使用 [1] [x] 的 xpath 并使用元素的属性
  • @Wonka 我有什么特别的理由要避免它吗?我从元素终端复制了 xpath,您还有什么建议?

标签: python selenium web-scraping


【解决方案1】:

您可以使用 Selenium 预期条件等待元素存在。
我只是在下面举一个例子。
我在这里定义了 5 秒的超时时间,但您可以使用任何超时值。
此外,您的元素定位器看起来很糟糕。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element_xpath_locator = '//*[@id="main-2"]/div[2]/div[1]/div[1]/div/div[1]/strong'
wait = WebDriverWait(browser, 5)
wait.until(EC.presence_of_element_located((By.XPATH, element_xpath_locator)))

【讨论】:

  • 还没来得及思考我将如何在我的代码中实现这一点,但很快就会检查它。谢谢!另外,我的元素定位器有什么问题?
  • 定位器太长太复杂。我很确定您是从自动生成的开发工具中获取的,而正确的定位器永远不会像这样。你应该学习如何做到这一点。
  • 那么,你试过了吗?它解决了您的问题吗?
  • 抱歉,忘记将其标记为解决方案。它确实有效,但并不完全符合我的预期。我在尝试中设置了 WebDriverWait(browser, 2) 并添加了一个带有 TimeoutException 的例外。但令我惊讶的是,即使在异常页面中的 2 秒或更多秒后,代码仍会寻找元素,并且只会在更多时间后转到 except。
  • 好吧,首先我建议将显式等待超时设置为更长的时间。通常我们使用 20 或 30 秒,因为如果元素通常存在显式等待,这不会使您的测试运行更长时间。当 Selenium 检测到预期的条件时,流程将立即继续。但是通过设置太短的超时时间,如果由于互联网速度慢等原因页面仍未加载,您可能会导致测试超时失败。
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2017-01-24
  • 2023-02-03
相关资源
最近更新 更多