自分1人では、環境をサクッと構築しスクレイピングしていましたが、メンバー間で共有したいときに面倒だったのでDockerで再現しました。
GoではHTMLの操作に、Agoutiを使用。
HTML解析には、goqueryを使っています。
サンプルコード
main.go
package main
import (
"log"
"strings"
"github.com/PuerkitoBio/goquery"
"github.com/sclevine/agouti"
)
func main() {
log.Println("処理開始...")
// ChromeDriver
driver := agouti.ChromeDriver(
agouti.ChromeOptions("args", []string{
"--headless",
"--window-size=1280,800",
}),
agouti.Debug,
)
if err := driver.Start(); err != nil {
log.Fatalln("Chromeドライバ起動に失敗しました。")
}
defer driver.Stop()
page, err := driver.NewPage(agouti.Browser("chrome"))
if err != nil {
log.Fatalln("Chromeでページを生成できませんでした。")
}
if err := page.Navigate("https://example.com"); err != nil {
log.Fatalln("該当ページに遷移できませんでした。")
}
getAll, err := page.HTML()
if err != nil {
log.Fatalln("遷移後のHTML(一覧)取得失敗しました。")
}
readerGetAll := strings.NewReader(getAll)
contentDom, _ := goquery.NewDocumentFromReader(readerGetAll)
if seeText := contentDom.Find("#header > h1 > span").Text(); seeText != "xxxxxx" {
log.Fatalln("対象の文字列はありませんでした。")
}
log.Println("正常に処理が終了しました。処理を終了します。")
}
Dockerfile
FROM ubuntu:latest
RUN apt update &&\
apt install -y wget curl unzip make tzdata software-properties-common
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \
&& curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \
&& unzip /tmp/chromedriver_linux64.zip \
&& mv chromedriver /usr/local/bin/
RUN add-apt-repository ppa:longsleep/golang-backports \
&& apt install -y golang-1.17
ENV TZ=Asia/Tokyo
ENV GO111MODULE=on
ENV GOPATH=$HOME/go
ENV PATH=$PATH:$GOPATH/bin
WORKDIR /go/src
docker-compose.yml
version: '3'
services:
sgo:
container_name: sgo
build: .
tty: true
ports:
- 3030:3030
volumes:
- ./:/go/src