Golang·采集使用chromedp + goquery 简单爬取动态数据网页元素
1、脚本:
终端载入 : go get github.com/chromedp/chromedp
2、方法涵
// 获取网站上爬取的数据
func GetHttpHtmlContent(url string, selector string, sel interface{}) (string, error) {
options := []chromedp.ExecAllocatorOption{
chromedp.Flag("headless", true), // debug使用
chromedp.Flag("blink-settings", "imagesEnabled=false"),
chromedp.UserAgent(`Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36`),
}
//初始化参数,先传一个空的数据
options = append(chromedp.DefaultExecAllocatorOptions[:], options...)
c, _ := chromedp.NewExecAllocator(context.Background(), options...)
// create context
chromeCtx, cancel := chromedp.NewContext(c, chromedp.WithLogf(log.Printf))
// 执行一个空task, 用提前创建Chrome实例
chromedp.Run(chromeCtx, make([]chromedp.Action, 0, 1)...)
//创建一个上下文,超时时间为10s
timeoutCtx, cancel := context.WithTimeout(chromeCtx, 10*time.Second)
defer cancel()
var htmlContent string
err := chromedp.Run(timeoutCtx,
chromedp.Navigate(url),
chromedp.WaitVisible(selector),
chromedp.OuterHTML(sel, &htmlContent, chromedp.ByJSPath),
)
if err != nil {
log.Println(err)
return "", err
}
return htmlContent, nil
}
3、使用方式
// 采集网
func GetSportsLotter() {
url := "http://www.baidu.com"
html, err := GetHttpHtmlContent(url, "body > div", `document.querySelector("body")`)
// 参数说明:url采集地址,网页标签名称 body > div.name > div.name2,固定内容 document.querySelector("body")`,
if err != nil {
log.Println(err)
}
// 成功取得HTML内容进行后续处理
fmt.Println(html)
}4、简易版(goquery.NewDocument 采集)
终端下载入 go get github.com/PuerkitoBio/goquery
doc, err := goquery.NewDocument(url)
if err != nil {
log.Println("爬取网页数据 异常:", err)
}
body := ""
doc.Find("body").Each(func(i int, s *goquery.Selection) {
band := s.Find(".mp-classiclist")
Html, _ := band.Eq(0).Find("h3").Html() //采集元素
text := band.Eq(0).Find("h3").Text() //采集文本
img, exist := band.Find("div").Attr("src") //采集图片
fmt.Println(Html, text)
// band = strings.Replace(band, "\t\t", "", -1)
// band = strings.Replace(band, "\n\n\n", "", -1)
body = ""
})