兄弟连区块链培训Go语言爬虫编写

栏目: Scala · 发布时间: 5年前

内容简介:兄弟连教育建议,用户在考虑培训周期时要切实结合自身目前所掌握的区块链知识的多少、培训的目的是简单的认知提升还是借此高薪就业等等。兄弟连Go全栈与课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌名师团队精心打造,历时半年时间共同研发而出。上次用Scala写了个爬虫。最近在闲工夫之时,学习Go语言,便用Go移植了那个用Scala写的爬虫,代码如下:

兄弟连教育建议,用户在考虑培训周期时要切实结合自身目前所掌握的区块链知识的多少、培训的目的是简单的认知提升还是借此高薪就业等等。兄弟连 Go 全栈与 区块链培训 课程设置为5个半月共计22周的学习时长,由浅入深进行讲解,助力于小白用户向区块链工程师的转型。

课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌名师团队精心打造,历时半年时间共同研发而出。

上次用Scala写了个爬虫。最近在闲工夫之时,学习Go语言,便用Go移植了那个用Scala写的爬虫,代码如下:

package main

import (

"fmt"

"io/ioutil"

"net/http"

"regexp"

)

var (

ptnIndexItem    = regexp.MustCompile(`(.+)`)

ptnContentRough = regexp.MustCompile(`(?s).*

.*`)

ptnBrTag        = regexp.MustCompile(`

`)

ptnHTMLTag      = regexp.MustCompile(`(?s)`)

ptnSpace        = regexp.MustCompile(`(^\s+)|( )`)

)

func Get(url string) (content string, statusCode int) {

resp, err1 := http.Get(url)

if err1 != nil {

statusCode = -100

return

}

defer resp.Body.Close()

data, err2 := ioutil.ReadAll(resp.Body)

if err2 != nil {

statusCode = -200

return

}

statusCode = resp.StatusCode

content = string(data)

return

}

type IndexItem struct {

url   string

title string

}

func findIndex(content string) (index []IndexItem, err error) {

matches := ptnIndexItem.FindAllStringSubmatch(content, 10000)

index = make([]IndexItem, len(matches))

for i, item := range matches {

index[i] = IndexItem

}

return

}

func readContent(url string) (content string) {

raw, statusCode := Get(url)

if statusCode != 200 {

fmt.Print("Fail to get the raw data from", url, "\n")

return

}

match := ptnContentRough.FindStringSubmatch(raw)

if match != nil {

content = match[1]

} else {

return

}

content = ptnBrTag.ReplaceAllString(content, "\r\n")

content = ptnHTMLTag.ReplaceAllString(content, "")

content = ptnSpace.ReplaceAllString(content, "")

return

}

func main() {

fmt.Println(`Get index ...`)

s, statusCode := Get

if statusCode != 200 {

return

}

index, _ := findIndex(s)

fmt.Println(`Get contents and write to file ...`)

for _, item := range index {

fmt.Printf("Get content %s from %s and write to file.\n", item.title, item.url)

fileName := fmt.Sprintf("%s.txt", item.title)

content := readContent(item.url)

ioutil.WriteFile(fileName, []byte(content), 0644)

fmt.Printf("Finish writing to %s.\n", fileName)

}

}

代码行数比Scala版的有一定增加,主要原因有以下几方面原因:

1 golang 重视代码书写规范,或者说代码格式,很多地方写法比较固定,甚至比较麻烦。比如就算是if判断为真后的执行语句只有一句话,按照代码规范,也要写出带大括号的三行,而在Scala和很多其他语言中,一行就行;

2 golang 的strings包和regexp包提供的方法并不特别好用,特别是和Scala相比,使用起来感觉Scala的正则和字符串处理要舒服的多;

3 scala版的爬虫里面用到了Scala标准库中的实用类和方法,它们虽然不是语法组成,但用起来感觉像是语法糖,这里很多方法和函数式编程有关,golang的函数式编程还没有去仔细学习。

当然golang版的爬虫也有一个优势,就是编译速度很快,执行速度在现在的写法里面体现不出优势;golang的特性goroutine在这里没有用到,这段代码今后会不断改进。

高能预警,兄弟连教育区块链直播课程8月持续火爆来袭!

原价1188元的12节区块链进阶课程,现仅需1元!

还可免费领取《Go语言基础实战项目开发》与《Go语言高级实战项目开发》教材两本!!

限时限量!!先到先得!!

http://www.ydma.cn/open/course/24


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字乌托邦

数字乌托邦

[美]弗雷德·特纳 / 张行舟、王芳、叶富华、余倩 / 译言·东西文库/电子工业出版社 / 2013-5-1 / 49.80元

20世纪60年代早期,在美国大众眼中,计算机只是冷战中冰冷的机器,然而到了90年代互联网到来之时,计算机却呈现出一个截然不同的世界——它们模拟出了一个数字乌托邦般的协同体,而这正是曾经最反对冷战的嬉皮士们的共同愿景。 本书正是探索这次非同寻常,且颇具讽刺意味的变革的第一本书。作者挖掘出那些在旧金山湾区的先驱者——斯图尔特·布兰德和他的“全球网络”鲜为人知的故事。1968年到1998年期间,通......一起来看看 《数字乌托邦》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换