我正在尝试登录Youtube,它重定向到accounts.google.com/ServiceLogin?service=youtube…chromedp。由于某种原因,它会在尝试从该页检索任何内容时超时。大多数选择器都随机生成类,但这不应该阻止获取body,而它确实是这样做的。截图显示了登录页面,所以它在那里导航正确,但它在页面上找不到任何东西。有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),
}
}
结果是Google帐户页面基于User-Agent的响应不同,所以当我浏览和抓取xpath或选择器时,它们与我的go程序使用的不同。修正了在开始运行时添加相同的用户代理:
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`),