0

我正在尝试登录 Youtube,它使用 chromedp 重定向到 accounts.google.com/ServiceLogin?service=youtube...。由于某种原因,它会超时尝试从该页面检索任何内容。大多数选择器都有随机生成的类,但这不应该阻止获取正文,确实如此。屏幕截图显示了登录页面,因此它可以正确导航到那里,但在页面上找不到任何内容。有 iframe,但登录表单/输入不在一个,并且#identifierId找不到。

这是一个代码片段:

func main() {
    // create chrome instance
    var buf []byte
    ctx, cancel := chromedp.NewContext(
        context.Background(),
        // chromedp.WithDebugf(log.Printf),
    )
    defer cancel()

    // create a timeout
    ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
    defer cancel()

    // navigate to a page, wait for an element, click
    var u string
    err := chromedp.Run(ctx,
        chromedp.Navigate(`https://youtube.com`),
        chromedp.Click(`#buttons > ytd-button-renderer > a`),
        chromedp.SendKeys(`#identifierId`, "bobboshmo@gmail.com", chromedp.ByID),
        chromedp.Location(&u),
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Printf(u)

    // capture entire browser viewport, returning png with quality=90
    if err := chromedp.Run(ctx, fullScreenshot(u, 90, &buf)); err != nil {
        log.Fatal(err)
    }
    if err := ioutil.WriteFile("fullScreenshot.png", buf, 0o644); err != nil {
        log.Fatal(err)
    }

}

func fullScreenshot(urlstr string, quality int, res *[]byte) chromedp.Tasks {
    return chromedp.Tasks{
        chromedp.Navigate(urlstr),
        chromedp.FullScreenshot(res, quality),
    }
}
4

1 回答 1

0

事实证明,Google 帐户页面的响应基于用户代理不同,所以当我浏览并抓取 xpath 或选择器时,它们与我的 go 程序使用的不同。通过在开始时将相同的用户代理添加到 Run 中来修复:

emulation.SetUserAgentOverride(`Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Mobile Safari/537.36`),
于 2021-10-04T21:59:55.427 回答