php小編小新在這里為大家介紹一種方法,可以通過網(wǎng)頁抓取訪問動(dòng)態(tài)HTML元素。當(dāng)我們在進(jìn)行網(wǎng)頁抓取時(shí),有時(shí)會(huì)遇到一些動(dòng)態(tài)生成的內(nèi)容,這些內(nèi)容在網(wǎng)頁加載完成之前無法直接獲取。幸運(yùn)的是,我們可以利用一些工具和技術(shù)來解決這個(gè)問題。本文將介紹一種基于PHP的方法,使用它可以輕松地抓取訪問動(dòng)態(tài)HTML元素。讓我們一起來看看吧!
問題內(nèi)容
我正在使用 go-rod 進(jìn)行網(wǎng)頁抓取。我想訪問動(dòng)態(tài) 內(nèi)的鏈接。
為了使這個(gè) a
可見,我必須完成一個(gè)搜索器,它是一個(gè) input
,具有下一個(gè)格式(沒有 submit
):
登錄后復(fù)制
所以,當(dāng)我完成后,出現(xiàn)我要訪問的a
:
到這里,一切都還好。這是我用來完成搜索器的代碼:
//page's url page := rod.new().mustconnect().mustpage("https://www.sofascore.com/") //acept cookies alert page.mustelement("cookiesalertselector...").mustclick() //completes the searcher el := page.mustelement(`searcherselector...`) el.mustinput("lionel messi")
登錄后復(fù)制
現(xiàn)在問題出現(xiàn)了,當(dāng)我想點(diǎn)擊完成搜索后顯示的a
時(shí)。
我嘗試過這個(gè):
diviwant := page.mustelement("aselector...") diviwant.mustclick()
登錄后復(fù)制
還有這個(gè):
diviwant := page.mustelement("aselector...").mustwaitvisible() diviwant.mustclick()
登錄后復(fù)制
但是,它們都返回給我相同的錯(cuò)誤:
panic: {-32000 node is detached from document } goroutine 1 [running]: github.com/go-rod/rod/lib/utils.glob..func2({0x100742dc0?, 0x140002bad50?}) /users/lucastomicbenitez/go/pkg/mod/github.com/go-rod/[email protected]/lib/utils/utils.go:65 +0x24 github.com/go-rod/rod.gene.func1({0x14000281ca0?, 0x1003a98b7?, 0x4?}) /users/lucastomicbenitez/go/pkg/mod/github.com/go-rod/[email protected]/must.go:36 +0x64 github.com/go-rod/rod.(*element).mustclick(0x14000289320) /users/lucastomicbenitez/go/pkg/mod/github.com/go-rod/[email protected]/must.go:729 +0x9c main.main() /users/lucastomicbenitez/development/golang/evolutionaryalgorithm/main/main.go:22 +0x9c exit status 2
登錄后復(fù)制
所以,在尋找一些解決方案時(shí),我發(fā)現(xiàn)了這個(gè) github 問題并嘗試通過此方法獲取鏈接:
link := page.musteval(`()=> document.queryselector('aselector...').href`)
登錄后復(fù)制
但它返回這個(gè):
panic: eval js error: TypeError: Cannot read properties of null (reading 'href')
登錄后復(fù)制
但是,我很確定選擇器是正確的。
我做錯(cuò)了什么?
解決方法
正如@hymns for disco在評(píng)論中所說,我只需要在搜索器完成后等待一段時(shí)間即可。
el.MustInput("Lionel Messi") time.Sleep(time.Second) link := page.MustEval(`()=> document.querySelector('aSelector...').href`)
登錄后復(fù)制