硒无头与非无头

问题描述

我目前正在使用 Python 中的 Selenium 进行网页抓取项目。

我的代码在非无头模式下从网络驱动程序运行时按预期工作。但是,在无头模式下运行时情况并非如此。例如,如果我尝试从网站中提取文本,则非无头模式返回文本,而无头模式返回无。 (我在下面包含了一些代码以供参考)。

首先,我使用以下代码构建了 webdriver(opt.headless 设置为 True 或 False 以在无头和非无头之间切换)

def getHeadlessDriver():
     opts = webdriver.ChromeOptions()
     opts.headless = False
     driver = webdriver.Chrome(ChromeDriverManager().install(),options=opts)
     return driver

然后,我使用 find_elements_by_xpath 函数从网站中提取文本数据。下面提供了示例代码

driver = getHeadlessDriver()
Feedbacks = driver.find_elements_by_xpath(
    "//div[contains(@class,'LiveFeedbackSectionViewController__LiveFeedbackStatusItem-sc-1ahetk9-4 cUJPkM')]")
for Feedback in Feedbacks:
     print(Feedback.text)

我在谷歌上搜索了一些无头模式为什么不起作用的解释,但我仍然不确定。根据我的理解,无头模式“作用相同”,但只是没有图形用户界面。

我的代码的实现会不会有问题?或者除了没有图形用户界面之外,无头模式还有其他区别吗?

谢谢。

解决方法

我想我找到了这个问题的潜在答案。

在 Selenium 中使用无头浏览器时,它比使用非无头浏览器运行得更快。在这种情况下,python 程序可能会在 DOM 完全加载之前执行。

换句话说,尝试访问 Web 元素的函数可能会返回 None,因为在调用该函数之前未加载这些元素。

为了解决这个问题,我们可以利用 Selenium 中包含的 implicitly_wait 函数。例如,

driver = webdriver.Chrome()
driver.implicitly_wait(3) #units in seconds

将告诉驱动程序等待指定的时间(以秒为单位)传递给 implicitly_wait 函数,以便加载 DOM。

我已经使用这种方法在无头模式下测试了我的功能,现在似乎可以正常工作。但是如果这个问题有其他解决方案,请随时发表评论!