【问题标题】:F# - Playwright return randomly resultF# - 剧作家随机返回结果
【发布时间】:2023-01-18 17:37:59
【问题描述】:

我在 F# 中使用 Playwright 进行网页抓取,我注意到结果是随机返回的。 我有这个代码。

let getContent (url:string) =
task{
    use! paywright = Playwright.CreateAsync()
    let! browser = paywright.Chromium.LaunchAsync()
    printfn "URL  %A" url
    let! page = browser.NewPageAsync()
    page.SetDefaultTimeout(15000f)
    let! goto = page.GotoAsync(url)
    let! price = page.Locator("//span[@class='norm-price ng-binding']").AllInnerTextsAsync()
    
    printfn "Price %A" price
}

当我运行控制台程序时,有时它会返回结果(价格列表),但有时它只是以空结果结束。 我真的不知道出了什么问题。我也尝试使用异步包装器而不是任务,但输出是相同的。 我将延迟增加到 15 秒,但这也无济于事。

【问题讨论】:

    标签: f# playwright-dotnet


    【解决方案1】:

    难道你不等待getContent返回的任务? 也许程序在写入控制台之前终止。如果调用代码不是异步的(并且无法传播任务),您可以尝试:

    let printContent (url : string) =
        task { ... } |> Task.RunSynchronously
    

    更新 1: 可能页面异步加载它的价格数据。page 上的默认超时是指定一个最大限度超时,不要等待那么长时间才能让某些数据到达受控浏览器实例。您很可能必须等待某些请求完成或某些元素出现在页面上。你能公开分享网址吗?

    【讨论】:

    • 其实我有getContent url |> Task.WaitAll.我在哪里调用函数。所以不应该是这样的。
    • @Asik 你是说Task.WhenAll吗? Task.WaitAll 正在阻止。无论如何,正如你所说,我也更喜欢Task.RunSynchronously等待一项任务。
    • 哦,没关系。我会删除评论,因为它根本不是真的。
    • 它实际上有点奇怪但是当我添加let! browser = paywright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions(Headless = false ))时它返回结果的频率更高(有时仍然返回空结果)
    • 可能不是答案,但我将其重写为 C# 并且运行良好。
    【解决方案2】:

    我在同样的情况下,当我第一次打开 VS Code 并运行测试时它工作......并且第二次或以上它失败......然后我重新启动 VS Code 并且它再次运行正常...... . 看起来应该是干净的缓存? (只是大声思考)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2010-11-23
      • 2015-01-14
      • 2017-12-27
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多