GolangNote

Golang笔记

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

Permalink

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

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

安装

Bash: 安装 google-chrome
1
2
3
4
5
6
apt-get update
apt-get install libxss1 libappindicator1 libindicator7
apt-get install curl
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i google-chrome*.deb
apt-get install -f

Bash: 安装 chromedriver
1
2
3
4
wget https://chromedriver.storage.googleapis.com/2.43/chromedriver_linux64.zip
apt-get install unzip
unzip chromedriver_linux64.zip
cp chromedriver /usr/bin/

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

本文网址: https://golangnote.com/topic/232.html 转摘请注明来源

Related articles

golang Selenium WebDriver 使用记录

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

golang 实现的基于web的文件管理-filebrowser

FileBrowser 在指定目录中提供了一个文件管理界面,可用于上传,删除,预览,重命名和编辑文件。它允许创建多个用户,每个用户都可以有自己的目录。它可以用作独立的应用程序。...

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

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

Golang http IPv4/IPv6 服务

Golang 的网络服务,如果不指定IPv4 或 IPv6,如果VPS 同时支持 IPv4 和 IPv6,`net.Listen()` 只会监听 IPv6 地址。但这不影响客户端使用 IPv4 地址来访问。...

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

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.20 Processed in 1ms