首次使用Go语言:尝试使用Golang进行网络爬虫

最初的目标

我有一些想尝试的事情,所以决定尝试一下网络爬虫。

以下是你要的两个链接的中文描述:

https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406
这篇文章介绍了如何在Python中使用OpenCV库来进行图像处理和识别。

https://qiita.com/Azunyan1111/items/a1b6c58dc868814efb51
这篇文章主要讲解了使用TensorFlow库对图像进行深度学习的基本流程和步骤。

只需要一种选项,以下是中文的释意:我觉得如果简单地使用以前接触过的.NET或Python编写的话,可能很快就能完成,但是考虑到这种程度的话,我想尝试一下之前没有接触过的编程语言,所以决定尝试使用Golang。

〇建立Golang的环境

根据以上情况,从Golang的环境搭建开始进行网页抓取
参考网站如下:
http://www.softplus.jp/wiki/?Go%E8%A8%80%E8%AA%9E%28golang%29%E9%96%8B%E7%99%BA%2F%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%28Windows%29
https://qiita.com/murachi1208/items/ba44c650c13da78c60fd
https://qiita.com/kent_ocean/items/566e6a23d76ef3b4d125
https://qiita.com/spiegel-im-spiegel/items/dca0df389df1470bdbfa

Go语言的安装

请从以下链接中下载并安装:
https://golang.org/dl/
目前最新版本是[1.10]。

在设置 PATH
https://qiita.com/kent_ocean/items/566e6a23d76ef3b4d125
→但是最新的版本可能不需要设置。

〇Windows 版的 Git

请从以下链接下载并安装:
https://gitforwindows.org/

编辑器

试试用VSCode。
※如果用VS就好了,但是这个扩展没在这里吗?

请点击以下链接下载并安装:
https://code.visualstudio.com/download

在目前的时点上,是[VSCode 1.20.1]版本。

重新启动一次

写了Hello World后,我成功地运行了Golang。

package main
import "fmt"
func main(){
    fmt.Printf("Hello World!\n")
}

然而,IDE的自动补全功能没有正常工作。

当我尝试重新启动后,出现了要求安装gocode等内容的提示信息,因此再次执行了全部安装。

现在它包含了完整的补完功能,可以使用了。

我以为这件事会很快结束,但实际上花了大约1.5小时。

尝试使用Golang进行爬虫实际操作。

据调查,使用Python的BeautifulSoup来解析HTML似乎很方便。
我现在已经后悔。

然而,经过调查发现,确实存在类似的模块在Golang中。

请根据上述网站参考,通过GET方法获取以下模块。

go get github.com/PuerkitoBio/goquery

只需要一个选项:在PowerShell或命令提示符中输入上述内容就可以。

在查看网站时,可以考虑使用类似于JQuery的选择器来获取所需的信息。所以最好先查询一下JQuery的选择器,可能会更加丰富。

这一次为了先试试看,决定记录每天变化的日经平均指数。
https://www.nikkei.com/markets/worldidx/chart/nk225/
浏览了一下网站后,发现了一个名为economic_value_now的类,所以决定直接取得这个数值。
同时也可以将5日移动平均和25日移动平均一并记录下来,后面可能会用得上。
→由于计算移动平均看起来比较麻烦,所以决定不取了。反正数据积累后也能计算出来。

导出CSV文件

以下是对原文的中文翻译:
文件IO相关
https://hackerslog.net/post/labs/golang-io-summary/

在参考样例的基础上,尝试简单输出时,出现了同时存在带有””和不带””的项目,让我稍微犯愁了一下,但是经过试验,问题得以解决。
只要目标变量中包含逗号,就会加上””,否则就不会加上””。
※自动加上或者不加上感觉有点不自然。不知道是否可以通过选项来指定。

现在的日期时间。

如果要将其输出到文件中,我也想要输出时间!因此我尝试找到类似于DateTime.Now这样的东西。

time.now()

这很容易。
但是将其转化为字符串的格式有点奇怪。
※看起来有一个原因。

不需要逗号。

既然后面还要进行减法运算,没有逗号的话会更容易计算,所以先用替代方法删除逗号。

strings.Replace(str, "Replace", "rep", -1)

一旦完成

下面是我的成果。
这是我第一次使用Golang。
由于我完全不了解惯例,所以在查看示例的同时编写代码,因此写得非常别扭。
使用[:=]定义并赋值,只用[=]的话是赋值还是怎么样呢?
得益于IDE,它自动将所需的内容放入了Import中,非常方便。

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"

    "github.com/PuerkitoBio/goquery"
)

func main() {

    _url := "https://www.nikkei.com/markets/worldidx/chart/nk225/"

    doc, err := goquery.NewDocument(_url)
    if err != nil {
        panic(err)
    }

    u := url.URL{}
    u.Scheme = doc.Url.Scheme
    u.Host = doc.Url.Host

    //economic_value_now のものが日経平均っぽい
    economic_value_now := doc.Find(".economic_value_now").Text()
    fmt.Println(economic_value_now)
    economic_value_now = strings.Replace(economic_value_now, ",", "", -1)
    fmt.Println(economic_value_now)

    economic_value_time := doc.Find(".economic_value_time").Text()
    fmt.Println(economic_value_time)

    now := time.Now().Format("2006/01/02")

    file2, err := os.OpenFile("test_o2.csv", os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        log.Fatal("Error:", err)
    }
    defer file2.Close()

    writer := csv.NewWriter(file2)
    writer.UseCRLF = true //デフォルトはLFのみ

    writer.Write([]string{now, economic_value_time, economic_value_now})
    writer.Flush()

}

顺便提一下,如果不准备好名为[test_o2.csv]的文件而直接运行,会导致出现错误。
不知道是否有生成输出文件的选项。

想要定期输出

只需要使用任务计划程序定期执行即可。

在服务器上的执行环境

我已经做到了这一步,现在在服务器上执行吧,不过执行环境怎么弄呢?
是不是服务器端也需要安装同样的东西?
还需要下载必要的模块吗?
感觉这样很麻烦啊,但我觉得不会那么麻烦。

→不对。看起来似乎是要编译。

只要建置成功,就会生成exe文件,那就可以带着它走了。很简单。

只需一种选项,用中文翻译以下内容:
从任务计划程序定期执行该EXE程序,因为它是用来获取日经平均指数的,所以先暂定在16点执行。

广告
将在 10 秒后关闭
bannerAds