Maison >développement back-end >Golang >chromedp click ne fonctionne pas dans mon code golang. Pouvez-vous identifier le problème ?

chromedp click ne fonctionne pas dans mon code golang. Pouvez-vous identifier le problème ?

PHPz
PHPzavant
2024-02-10 09:54:10674parcourir

chromedp click 在我的 golang 代码中不起作用。你能找出问题所在吗?

éditeur php fraise, bonjour ! Concernant le problème que vous avez mentionné, si chromedp click ne fonctionne pas dans votre code golang, je peux vous aider à trouver le problème. chromedp est une bibliothèque qui utilise le protocole Chrome DevTools pour l'automatisation. La méthode click est utilisée pour simuler les événements de clic de souris. Les problèmes possibles incluent : 1. L'élément de page est invisible ou bloqué par d'autres éléments, provoquant l'échec du clic ; 2. Les paramètres de la méthode click sont transmis de manière incorrecte 3. La version de chromedp est incompatible avec la version du navigateur Chrome ; .Autres problèmes de logique de code. Veuillez fournir plus de détails et je vous proposerai une solution dans les plus brefs délais.

Contenu de la question

J'utilise chromedp pour développer Scraper.

Pour obtenir le contenu que je souhaite (page html) je dois cliquer sur un bouton spécifique.

J'ai donc utilisé chromedp.click et chromedp.outerhtml, mais je n'ai obtenu que le HTML de la page avant le clic, pas le HTML de la page une fois le clic terminé.

Pouvez-vous voir mon code et me suggérer comment le corriger ?

func runCrawler(URL string, lineNum string, stationNm string) {
    
        // settings for crawling
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.Flag("headless", false))
    
        // create chrome instance
    contextVar, cancelFunc := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancelFunc()

    contextVar, cancelFunc = chromedp.NewContext(contextVar)
    defer cancelFunc()


    var htmlContent string

    err := chromedp.Run(contextVar,
        chromedp.Navigate(URL),
        chromedp.WaitVisible(".end_footer_area"),
        chromedp.Click(".end_section.station_info_section > div.at_end.sofzqce > div > div.c10jv2ep.wrap_btn_schedule.schedule_time > button"),
        chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
    )
    fmt.Println("html", htmlContent)
    checkErr(err)

Je vous rends la page d'accueil et les boutons sur lesquels je dois cliquer

URL de la page : https://pts.map.naver.com/end-subway/ends/web/11321/home

La zone du bouton sur laquelle je dois cliquer :

Merci beaucoup

Solution de contournement

La page que vous souhaitez obtenir est ouverte dans un nouvel onglet (cible).

Dans ce cas, nous pouvons utiliser chromedp.waitnewtarget pour créer un chan à partir duquel nous pouvons recevoir l'identifiant cible du nouvel onglet. Créez ensuite un nouveau contexte en utilisant l'option chromedp.withtargetid afin que nous puissions nous connecter au nouvel onglet. A partir de là, tout vous est familier.

package main

import (
    "context"
    "fmt"
    "strings"

    "github.com/chromedp/cdproto/target"
    "github.com/chromedp/chromedp"
)

func main() {
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.Flag("headless", false),
    )

    ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancel()

    ctx, cancel = chromedp.NewContext(ctx)
    defer cancel()

    var htmlContent string

    ch := chromedp.WaitNewTarget(ctx, func(i *target.Info) bool {
        return strings.Contains(i.URL, "/timetable/web/")
    })

    err := chromedp.Run(ctx,
        chromedp.Navigate("https://pts.map.naver.com/end-subway/ends/web/11321/home"),
        chromedp.WaitVisible(".end_footer_area"),
        chromedp.Click(".end_section.station_info_section > div.at_end.sofzqce > div > div.c10jv2ep.wrap_btn_schedule.schedule_time > button"),
    )
    if err != nil {
        panic(err)
    }

    newCtx, cancel := chromedp.NewContext(ctx, chromedp.WithTargetID(<-ch))
    defer cancel()

    if err := chromedp.Run(newCtx,
        chromedp.WaitReady(".table_schedule", chromedp.ByQuery),
        chromedp.OuterHTML("html", &htmlContent, chromedp.ByQuery),
    ); err != nil {
        panic(err)
    }
    fmt.Println("html", htmlContent)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer