使用Golang和PhantomJS进行网络爬虫操作
简述
使用Golang和PhantomJS的方式来进行JavaScript页面的爬取。
我使用agouti启动了PhantomJS,并尝试使用goquery解析DOM。
相关文章
-
- Python + PhantomJSでスクレイピング
-
- Python + Chrome on CentOS7(Docker)でスクレイピング
- Golang + Chrome on CentOS7(Docker)でスクレイピング
Go语言环境配置
- Golang環境構築
Dockerfile: Docker文件
我将使用Docker创建环境。
From centos:7
ARG GO_VER=1.11
# Golang
WORKDIR /usr/local/src
RUN yum install -y git
RUN curl -O https://dl.google.com/go/go${GO_VER}.linux-amd64.tar.gz
RUN tar -C /usr/local -xzf go${GO_VER}.linux-amd64.tar.gz
ENV GOPATH=/code
ENV PATH=$PATH:$GOPATH/bin
ENV PATH=$PATH:/usr/local/go/bin
# PhantomJS
RUN yum install epel-release
RUN rpm -ivh http://repo.okay.com.mx/centos/6/x86_64/release/okay-release-1-1.noarch.rpm
RUN yum install phantomjs.x86_64
去 (Qù)
这是用于登录到 Qiita 的代码。
虽然仅使用 agouti 也可以获取元素,但使用 goquery 更方便。
package main
import (
"github.com/sclevine/agouti"
"github.com/PuerkitoBio/goquery"
"strings"
"log"
"fmt"
"time"
)
func main() {
// Set User-Agent
capabilities := agouti.NewCapabilities()
capabilities["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36"
capabilitiesOption := agouti.Desired(capabilities)
driver := agouti.PhantomJS(capabilitiesOption)
if err := driver.Start(); err != nil {
log.Fatalf("Failed to start driver:%v", err)
}
defer driver.Stop()
page, err := driver.NewPage(agouti.Browser("phantomjs"))
if err != nil {
log.Fatalf("Failed to open page:%v", err)
}
login_url := "https://qiita.com/login"
if err := page.Navigate(login_url); err != nil {
log.Fatalf("Failed to navigate:%v", err)
}
// form
identity := page.FindByID("identity")
password := page.FindByID("password")
identity.Fill("Your Id Here.")
password.Fill("Your Passowrd Here.")
// submit
if err := page.FindByClass("loginSessionsForm_submit").Submit(); err != nil {
log.Fatalf("Failed to login:%v", err)
}
// wait 3sec
time.Sleep(3 * time.Second)
// <title>を取得
title, err := page.Title()
log.Printf(title)
// 閲覧中のページのURLを取得
url, err := page.URL()
log.Printf(url)
// HTMLソースを取得
getSource, err := page.HTML()
log.Printf(getSource)
if err != nil {
log.Fatalf("Failed to get HTML:%v", err)
}
// Screen shotを保存
page.Screenshot("/tmp/phantomjs_qiita.jpg")
// Parse DOM
readerCurContents := strings.NewReader(getSource)
doc, err := goquery.NewDocumentFromReader(readerCurContents)
if err != nil {
log.Fatal(err)
}
// 今度はgoqueryで<title>を取得
fmt.Println(doc.Find("title").Text())
// ユーザー名を取得
fmt.Println(doc.Find("#globalHeader > div > div.st-Header_end > div:nth-child(4) > div.st-Header_loginUser > img").Attr("alt"))
}
如果执行此操作,应该能够成功登录并获取登录后页面的屏幕截图。
$ go run main.go
错误:不安全的评估
在使用github.com进行网页抓取时,执行了page.URL()操作,但出现了以下错误。
request unsuccessful: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security
Policy directive: "script-src assets-cdn.github.com".
根据以下PhantomJS的问题,似乎PhantomJS 1版本可正常运行。我还未调查如何在2版本中运行。如果有人提供相关信息,我将不胜感激。
谢谢建议,PhantomJS 1.9.8 可以使用。