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

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

内容简介:兄弟连教育建议,用户在考虑培训周期时要切实结合自身目前所掌握的区块链知识的多少、培训的目的是简单的认知提升还是借此高薪就业等等。兄弟连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


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

查看所有标签

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

维多利亚时代的互联网

维多利亚时代的互联网

[英] 汤姆·斯丹迪奇 / 多绥婷 / 后浪丨江西人民出版社 / 2017-8 / 38.00元

人类历史上的第一次大连接 回顾互联网的前世 预言互联网的未来 ……………… ※编辑推荐※ ☆《财富》杂志推荐的75本商务人士必读书之一 ☆ 回顾互联网的前世,颠覆你的思维,升级你对互联网的认知 ☆ 人类历史上一次全球大连接是维多利亚时期的电报时代,那时候也有疯狂的资本、 巨大的泡沫、网络新型犯罪、网络亚文化崛起……现在的互联网时代就是电报时代的重演;回顾那......一起来看看 《维多利亚时代的互联网》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具