【问题标题】:Can't collect price from a webpage using vba/selenium in headless mode无法在无头模式下使用 vba/selenium 从网页收集价格
【发布时间】:2021-08-19 22:30:17
【问题描述】:

我已经创建了一个结合 selenium 的 vba 脚本来从这个 webpage 中获取价格 $8.97。如果我在非无头模式下运行脚本,它会获取内容。但是,我的意图是以无头模式获取内容。我知道我可以使用他们的 api 来获取价格,但是 api 在 4/5 请求后被阻塞,所以我故意选择了这条路线。

我已经尝试过(在非无头模式下工作):

Sub GrabWalmartContent()
    Const Url$ = "https://www.walmart.ca/en/ip/terra-delyssa-tunisian-extra-virgin-olive-oil/6000196167258"
    Dim driver As Object
    Set driver = CreateObject("Selenium.ChromeDriver")
    
'    driver.AddArgument "--headless"
    driver.get Url
    Debug.Print driver.FindElementByCss("span[data-automation='buybox-price']", Timeout:=5000).Text
End Sub

如何在无头模式下使用 vba 和 selenium 从网页中获取价格?

【问题讨论】:

  • 无头模式下抛出的错误是什么?
  • NoSuchElementError 指向 debug.print 行 @cruisepandey。

标签: vba selenium web-scraping


【解决方案1】:

欢迎来到永远有趣的网络抓取世界。您应该始终牢记一条规则:如果您的抓取工具在 headful 模式下工作,但在 headless 模式下不工作,那么您正在抓取的网站很可能会阻止 headless 浏览器。

作为测试,我用 headless chrome(使用 puppeteer)打开了您的页面,并截取了屏幕截图。结果:

因此,沃尔玛不一定喜欢无头浏览器,他们已经采取了一些措施来检测和阻止它们。网站所有者可以做很多事情来检测无头浏览器,最简单的一种是检查请求的 User-Agent 标头。

我将用户代理更改为我当前版本的桌面 chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36,然后重新运行刮板。结果:

因此,既然这行得通,看起来沃尔玛正在阻止无头用户代理,但仅此而已。以下代码仅在您的初始代码中添加了一行,并取消了 headless 参数。如您所料,它将在即时窗口中打印 $8.97:

Sub GrabWalmartContent()
    Const Url$ = "https://www.walmart.ca/en/ip/terra-delyssa-tunisian-extra-virgin-olive-oil/6000196167258"
    Dim driver As Object
    Set driver = CreateObject("Selenium.ChromeDriver")
    driver.AddArgument "--user-agent=""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"""
    driver.AddArgument "--headless"
    driver.get Url
    Debug.Print driver.FindElementByCss("span[data-automation='buybox-price']", Timeout:=5000).Text
End Sub

【讨论】:

  • 是的,你是@Dimitri。看来我们在定义user-agent 时不需要那些额外的引号"。具体来说,这就是我的意思"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"。谢谢。
【解决方案2】:

即使您的 css 看起来不错,您也需要适当地等待才能获取文本。

或者您可以在页面加载时设置超时:

driver.Timeouts.PageLoad = 20000   

然后按照您的方式获取价格。

【讨论】:

  • 该行中已经存在超时,会引发该错误。但是,您似乎建议我增加它,对吗?好的,我现在就试试。
  • 我相信这是针对webelement的,我是说整个页面laoding
  • 对不起,即使20000 超时,它又失败了。我试过driver.AddArgument "--disable-blink-features=AutomationControlled",当我无头运行任何脚本时,大多数情况下都有效,但在这里失败了。
  • 哦,我明白了。好的,现在尝试遵守。
  • 那也失败了。
猜你喜欢
  • 2023-01-22
  • 2021-12-05
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2020-02-10
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多