硒无头与无头



我目前正在python中使用Selenium进行一个webcrapping项目。

当在非无头模式下从web驱动程序运行时,我的代码可以正常工作。然而,当它在无头模式下运行时,情况并非如此。例如,如果我试图从网站中提取文本,非无头模式将返回文本,而无头模式则返回None。(我在下面附上了一些代码以供参考(。

首先,我用以下代码构建了网络驱动程序(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)

我在谷歌上搜索了一些无头模式不起作用的原因,但我仍然不确定。根据我的理解,无头模式;动作相同";,但是仅仅没有图形用户界面。

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

谢谢。

如果您试图抓取的网站具有由javascript呈现的动态元素,则需要Xvfb。

sudo apt-get install -y xvfb

"Xvfb或X虚拟帧缓冲区是一个实现X11显示服务器协议的显示服务器。与其他显示服务器相比,Xvfb在虚拟内存中执行所有图形操作,而不显示任何屏幕输出">

在python中,Xvfb有两个包装器。

1-xvfbwrapper

pip install xvfbwrapper

然后添加到您的python文件中:

from xvfbwrapper import Xvfb
display = Xvfb()
display.start()

2-pyvirtualdisplay

pip install PyVirtualDisplay

然后在你的代码中:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()

我通常可以用time.sleep(10)绕过这个问题,但是,我有一个特定的网站,我不能用time.sleep(10)driver.implicitly_wait(10)抓取。

我认为该网站有一个系统来检查浏览器的用户代理。

为了尝试绕过这个问题,我在无头窗口中添加了用户代理,它起到了作用。

browser_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'
options_edge.add_argument(f'user-agent={self.user_agent}')

您可以从以下网站获取用户代理:https://whatmyuseragent.com/(非附属(

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

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

换句话说,试图访问web元素的函数可能会返回None,因为在调用函数之前没有加载这些元素。

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

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

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

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

相关内容

  • 没有找到相关文章