首次使用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点执行。