GolangNote

Golang笔记

Golang+selenium+chrome headless + goquery 在Linux 上作爬虫实践

Permalink

以前使用PhantomJS,但效果并不好,现在使用Golang+selenium 驱动 chrome headless 模式,再用 goquery 解析html 字符,很方便。

Golang+selenium+chrome headless + goquery 在Linux 上作爬虫实践

首先在服务器上安装最新版本的 chrome 和 chromedriver

chrome headless 配置

启动 chrome 及简单配置

Go: 启动 chrome 及简单配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var opts []selenium.ServiceOption
caps := selenium.Capabilities{
    "browserName": "chrome",
}

// 禁止加载图片,加快渲染速度
imgCaps := map[string]interface{}{
    "profile.managed_default_content_settings.images": 2,
}

chromeCaps := chrome.Capabilities{
    Prefs: imgCaps,
    Path:  "",
    Args: []string{
        "--headless",
        "--start-maximized",
        //"--window-size=1200x600",
        "--no-sandbox",
        "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
        "--disable-gpu",
        "--disable-impl-side-painting",
        "--disable-gpu-sandbox",
        "--disable-accelerated-2d-canvas",
        "--disable-accelerated-jpeg-decoding",
        "--test-type=ui",
    },
}
caps.AddChrome(chromeCaps)

// 启动 chromedriver server
service, err := selenium.NewChromeDriverService("chromedriver", port, opts...)
if err != nil {
    log.Printf("Error starting the ChromeDriver server: %v", err)
    return
}
defer service.Stop()

打开一个网页

Go: 打开一个网页
1
2
3
4
5
6
7
// 打开 chrome 浏览器
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil {
    log.Println(err)
    return
}
defer wd.Quit()

然后加载URL

Go: 加载URL
1
2
3
4
err = wd.Get(curURL)
if err != nil {
    log.Println(fmt.Sprintf("Failed to load page: %s\n", err))
}

判断加载完成

Go: 判断加载完成
1
2
3
4
5
6
7
8
9
jsRt, err := wd.ExecuteScript("return document.readyState", nil)
if err != nil {
    log.Println("exe js err", err)
}
fmt.Println("jsRt", jsRt)
if jsRt != "complete" {
    log.Println("网页加载未完成")
    return
}

获取网站内容

Go: 获取网站内容
1
2
3
4
5
6
7
8
var frameHtml string

time.Sleep(1 * time.Second)
frameHtml, err = wd.PageSource()
if err != nil {
    log.Println(err)
    return
}

解析 html 文件

这里推荐使用 goquery

Go: 解析 html 内容
1
2
3
4
5
6
7
8
9
10
var doc *goquery.Document
doc, err = goquery.NewDocumentFromReader(bytes.NewReader([]byte(frameHtml)))
if err != nil {
    log.Println(err)
    return
}

doc.Find("li.s-result-item").Each(func(liIndex int, liItem *goquery.Selection) {
    // do something
})

selenium go 驱动库

selenium https://github.com/tebeka/selenium

Related articles

golang Selenium WebDriver 使用记录

Selenium WebDriver 直接通过浏览器自动化的本地接口来调用浏览器,以达到模拟浏览器行为的操作,如点击、选择、鼠标移动等。下面是记录个人使用golang 驱动的记录。...

Golang 单实例实现网站多域名请求

有时候写网站,为了统一的后端,把不同业务都集中到一个后端,这时就需要处理多域名的请求,在 Go http server 里实现很简单,只需把不同域名映射到不同的 `http.Handler`。...

Golang 时区时差处理方式

个人习惯用 0 时区时间戳记录时间,可以方便转到不同时区,下面介绍 Golang 时区时差处理...

Golang phantomjs 动态代理实现

phantomjs 是个很优秀的软件,虽然现在被chrome headless 抢了风头,但在某些特定场合,使用phantomjs 还是很方便,这里是介绍使用Go 实现动态代理。...

Write a Comment to "Golang+selenium+chrome headless + goquery 在Linux 上作爬虫实践"

Submit Comment Login
Based on Golang + fastHTTP + youdb | go1.16 Processed in 1ms