使用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 可以使用。

bannerAds