我的Go+语言初体验——用Go+写个爬虫并进行数据处理

小生凡一 社区中级贡献者
Golang领域优质创作者
博客专家认证
2021-11-30 09:59:58

“我的Go+语言初体验” | 征文活动进行中……

 

写在前面

是这样的!我个人是Go语言爱好者,接触七牛是在大一的时候,这几天七牛云带着Go+来CSDN征文!那我就用Go+写一个爬虫吧!

项目初始化

前面我们已经完成了go+的搭建,然后我们建立一个项目吧!用vscode吧,因为goland没有goplus的插件。

  • 创建一个.gop文件

在这里插入图片描述

 

  • 写入hello world 测试能否跑通

在这里插入图片描述

 

gop run main.gop

但是会出错

在这里插入图片描述

 


这里提示gop.mod没有找到!

 

此时我们应该要先gop mod一下包名! 注意!! 我们一定要用gop mod

虽然用go mod可以执行,但是不是gop的mod而是go的mod,我一开始就是用go mod进行init的,但是许老师说是要gop mod的!!

在这里插入图片描述

 

然后就会出现这个东西gop mod文件了

然后我们继续跑一下!

在这里插入图片描述

 


就会有这个错,此时我们只需要按照他的要求,go get一下这个builtin就可以了
在这里插入图片描述

 


之后就可以跑出来了
在这里插入图片描述

 

那我们用Go+写一个爬虫吧!

1. 找到blink

CSDN呢,要切换成新版才能看到blink的!我本来是旧版的,就先切换一下新版。
我们就找到了

在这里插入图片描述

 

2. 分析页面

我们发现并没有相应的接口显示评论,所以我们点击更多之后

在这里插入图片描述

 


就会出现这个了,这个就是我们的爬取地址了!
在这里插入图片描述

 


然后我们看一下这个url,返回就是我们所需要的评论信息!
在这里插入图片描述

 


然后我们看响应参数!
在这里插入图片描述

 

  • pageNum就是页码
  • pageSize就是页面大小
  • blinkId就是这个blink的id了

那么我们可以直接让pageNum=1pageSize=500,直接返回全部的评论!
舒服了!

3. 编写代码

如果你不喜欢在goland中没有go-plus插件的提示的话,可以在vscode上创建,这样可以有高亮的提示了。

在这里插入图片描述

 

3.1 发送请求

使用net/http包,构造一个client

client := &http.Client{}
reqSpider, err := http.NewRequest("GET", "https://blink-open-api.csdn.net/v1/pc/blink/allComment?pageNum=1&pageSize=400&blinkId=1260435", nil)
if err != nil {
    println (err)
}
reqSpider.Header.Set("content-length", "0")
reqSpider.Header.Set("accept", "*/*")
reqSpider.Header.Set("x-requested-with", "XMLHttpRequest")
respSpider, err := client.Do(reqSpider)
if err != nil {
    println (err)
}
bodyText, _ := ioutil.ReadAll(respSpider.Body)

3.2 解析数据

我们通过刚刚查看响应的方式情况,可以看到这是标准的json格式的数据,

所以我们可以使用json包,将string转化成结构体的json格式

    var result BlinkResult
    _ = json.Unmarshal(bodyText, &result)

3.3 数据处理与分析

  • 查看24天前的这一天的所有留言记录
    count := 0
    // 如果存在20天前发表的内容,打印出内容
    if ({for item <- items, item.CreateTime == "24 天前"}) { // 注意这里一定要有括号, 返回bool
        for item <- items, item.CreateTime == "24 天前" {
            count++
            println item
        }
        printf("一共有%d人在24天前留言", count)
    }

在这里插入图片描述

 

  • 查看所有评论的来源平台
    for item <- items {
        switch item.FromType {
        case "CSDN-APP:Android:":
            countAndroid++
            userAndroid = append(userAndroid, item)
        case "CSDN-APP:iOS:":
            countIOS++
            userIOS = append(userIOS, item)
        case "pc":
            countPC++
            userPC = append(userPC, item)
        default:
            countOrder++
        }
    }

在这里插入图片描述

 

  • 做一个小升级,我们统计各个平台的平均评论时间
    countAndroid, countIOS, countPC, countOrder, all := 0, 0, 0, 0, len(items)
    meanDayIOS, meanDayAndroid, meanDayPC := 0, 0, 0
    tmp := 0
    var userAndroid []LuckyBlinkPerson
    var userIOS []LuckyBlinkPerson
    var userPC []LuckyBlinkPerson
    // 统计所有的来源平台以及平均评论天数
    for item <- items {
        switch item.FromType {
        case "CSDN-APP:Android:":
            countAndroid++
            tmp, _ = strconv.Atoi(item.CreateTime[:2])
            userAndroid = append(userAndroid, item)
            meanDayAndroid += tmp
        case "CSDN-APP:iOS:":
            countIOS++
            userIOS = append(userIOS, item)
            tmp, _ = strconv.Atoi(item.CreateTime[:2])
            meanDayIOS += tmp
        case "pc":
            countPC++
            userPC = append(userPC, item)
            tmp, _ = strconv.Atoi(item.CreateTime[:2])
            meanDayPC += tmp
        default:
            countOrder++
        }
    }
    printf("来自Android有:%d人 平均评论天:%d天前\n", countAndroid, meanDayAndroid/len(userAndroid))
    printf("来自iOS有:%d人 平均评论天:%d天前\n", countIOS, meanDayIOS/len(userIOS))
    printf("来自pc有:%d人 平均评论天:%d天前\n", countPC, meanDayPC/len(userPC))
    printf("其他的有:%d人\n", countOrder)
    printf("一共有%d人\n", all)

在这里插入图片描述

 

  • 然后我们统计出哪天评论了多少人
    // 统计评论天数每一天有多少人评论
    mapDay := map[string]int{}
    meanDayIOS, meanDayAndroid, meanDayPC = 0, 0, 0
    for user <- items {
        mapDay[user.CreateTime]++
    }
    for k, v <- mapDay {
        printf("%s 评论了 %d 条信息\n", k, v)
    }

在这里插入图片描述

 

  • 返回所有在20天前的这一天评论的安卓用户的昵称,内容,创建时间
    androidCommont := [[user.NickName, user.Content, user.CreateTime] for user <- userAndroid, user.CreateTime == "20 天前"]
    if len(androidCommont) != 0 {
        for androidInfo <- androidCommont {
            println androidInfo
        }
    }

在这里插入图片描述

 

  • 去除重复的用户名称的评论数据
func removeBlinkRepByMap(slc []LuckyBlinkPerson) []LuckyBlinkPerson {
    var result []LuckyBlinkPerson
    tempMap := map[LuckyBlinkPerson]byte{}
    for _, e <- slc {
        l := len(tempMap)
        tempMap[e] = 0
        if len(tempMap) != l {
            result = append(result, e)
        }
    }
    return result
}

3.4 输出所有的评论

    var luckyBPList []LuckyBlinkPerson
    for _, v <- commentList {
        var luckBlinkPerson LuckyBlinkPerson
        luckBlinkPerson.UserName = v.Username
        luckBlinkPerson.NickName = v.Nickname
        luckBlinkPerson.CreateTime = v.CreateTime
        luckBlinkPerson.Content = v.Content
        luckyBPList = append(luckyBPList, luckBlinkPerson)
    }
    luckyBPList = removeBlinkRepByMap(luckyBPList)
    for _, v <- luckyBPList {
        println v.NickName, v.Content, v.CreateTime
    }

完整代码在github上:

https://github.com/CocaineCong/go-plus-demo

总结

怎么说呢,写完爬虫感觉,这个好像有点写python的感觉,毕竟我是数据科学专业的,经常用到python进行数据处理….

Go+的领域就是面向数据分析的,Go+的爬虫很快!性能也比python牛,语法也相似

相信Go+的未来一定会如同其创始公司一样,7777777牛起来!

也希望我能为Go+社区尽一份绵薄之力,一份Go+爬虫送给大家!

...全文
509 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
海拥✘ 2021-12-01
  • 打赏
  • 举报
回复

牛牛牛

小生凡一 社区中级贡献者 2021-11-30
  • 打赏
  • 举报
回复 1
"管家婆加密狗读写工具"是一款专门针对管家婆软件的辅助工具,旨在帮助用户进行加密狗的读取和写入操作。加密狗是一种硬件设备,通常用于软件的授权管理,确保只有拥有正确密钥的用户才能运行特定的软件。在IT行业中,这种技术被称为硬件锁或USB Dongle,它通过USB接口连接到计算机,存储了软件的许可证信息。 管家婆软件是一款广泛应用于中小企业财务管理、进销存管理、生产管理等领域的应用软件。它的不同版本可能需要不同的加密狗来验证用户的使用权。"适用于多种版本"表明这款工具兼容管家婆的多个产品版本,为用户提供了一站式的加密狗管理解决方案。 "已测试可用"意味着开发者或提供者已经对这个工具进行了实际的测试,确保它在实际环境中可以正常工作。这是非常重要的,因为它给用户带来了一定程度的信任,表明该工具在使用时不会出现严重的兼容性问题或功能失效。 "要有狗才能用哦"这一提示强调了加密狗是必不可少的,没有加密狗,这个读写工具将无法执行其功能。这意味着用户必须拥有合法的管家婆加密狗才能使用这个工具,否则将无法进行任何读写操作。 从压缩包中的文件名"管家婆写狗(R4ND全集)无壳版.exe"可以看出,这是一个针对管家婆软件的写狗工具,而且是"无壳版"。"无壳版"通常指的是软件去除了保护壳,即没有额外的防逆向工程措施,这可能使工具更易于理解和使用,但同时也可能让软件更容易被破解。"R4ND全集"可能表示这个工具包含了针对各种随机情况的全面支持,比如处理各种类型的加密狗或者各种数据写入需求。 "管家婆加密狗读写工具"是为了解决管家婆软件用户在加密狗管理上的问题而设计的,它具备广泛的版本兼容性,并经过了实际测试,确保功能的稳定性和可靠性。用户需要拥有管家婆的加密狗才能使用此工具进行读写操作,而提供的无壳版本可能方便了用户进行更深入的使用或调试。然而,使用无壳版工具也需谨慎,因为这可能会增加软件被非法利用的风险。
【PA1实验报告1】是关于计算机系统和软件开发的一个实验项目,主要涵盖了以下几个关键知识点: 1. **指令集架构**:实验的目标之一是熟悉指令集的架构。指令集是计算机处理器理解和执行的基本命令集合,它定义了处理器如何处理数据和控制硬件。在这里,虽然可以选择不同的指令集,如RISC-V或x86,但因为实现多个指令集的复杂性,实验选择了x86。x86架构是一种复杂的CISC(复杂指令集计算)架构,包含了大量的单条指令,可以执行多种操作。 2. **图灵机原理**:图灵机是一种理论计算模型,用于描述通用计算能力的极限。在实验中,探究图灵机的运行原理意味着理解其基本操作,包括如何读取和修改存储带上的符号,以及如何根据当前状态和读取的符号来改变状态和移动读写头。 3. **调试器的工作原理**:调试器是软件开发中的重要工具,用于检查和控制程序的执行。实验要求用代码模拟寄存器结构,实现调试器的基本功能。这包括设置断点、单步执行、查看寄存器和内存状态等。调试器的工作原理涉及追踪程序执行流程,中断执行以便分析,并能恢复执行以继续调试。 4. **寄存器结构模拟**:在x86架构中,有不同大小的寄存器,如32位、16位和8位寄存器。实验要求使用`union`结构来模拟这些寄存器,因为`union`可以在同一内存空间中存储不同大小的数据类型,从而反映x86寄存器的共用特性。例如,EAX寄存器可以视为AX、AH和AL的组合。 5. **NEMU模拟器**:NEMU是一个程序模拟器,它的目的是使其他程序能够在NEMU上运行,就像在真实的硬件上一样。实验中提到的`init_monitor()`函数是NEMU启动时调用的关键初始化函数,负责处理参数解析、日志文件初始化、镜像加载和ISA相关的初始化工作。`load_img()`函数用于加载客户程序的镜像,而`init_isa()`则涉及CPU状态的初始化,包括寄存器的设置。 6. **内存管理**:实验中提到了固定内存位置0x10000来加载客户镜像,以及抽象出来的API如`isa_default_img[]`和`isa_default_img_size`,这些API简化了镜像加载和内存管理。 7. **设备初始化**:`init_device()`函数用于初始化设备,这是模拟真实计算机环境的关键部分,因为模拟器需要模拟I/O设备以处理输入输出操作。 8. **断点和监视点**:实验还要求实现监视点功能,即断点。断点是调试中的一个关键元素,允许在特定代码行暂停程序执行,以便检查程序的状态。 这个实验全面地覆盖了计算机系统的基础知识,从底层的指令集到高级的调试技术,旨在加深学生对计算机系统运行机制的理解,并提供实践经验。通过这样的实验,学生不仅能够学习到理论知识,还能提升实际编程和解决问题的能力。
Nexus是Sonatype公司开发的一款强大的 Maven仓库管理器,它集成了Maven仓库代理、存储库聚合以及组件发布等功能,广泛应用于Java开发者的构建和部署流程中。标题"nexus-3.30.0-01-win64.zip"表示的是Nexus 3的30.0.0.1版本的Windows 64位安装包,这通常用于在Windows操作系统上搭建和管理本地或企业级的Maven仓库。 描述中提到可以从官方网站下载,这确保了软件来源的正规性与安全性。下载地址是https://help.sonatype.com/repomanager3/download/,这是Sonatype官方的帮助页面,用户可以在此获取最新版本的Nexus Repository Manager及其相关的文档和资源。 Nexus的核心功能包括: 1. **代理仓库**:Nexus可以作为Maven中央仓库的代理,减少对互联网的直接访问,提高开发效率。通过配置,它可以缓存远程仓库中的组件,本地团队可以快速获取所需依赖。 2. **存储库聚合**:允许用户将多个存储库(如Maven、npm、NuGet等)组合成一个逻辑组,便于管理和查找组件。 3. **组件发布**:开发者可以使用Nexus发布自己的软件组件,确保版本控制和权限管理。 4. **安全控制**:Nexus提供了精细的访问控制策略,可以限制不同用户或团队对不同存储库的访问权限。 5. **质量检查**:内置的构件验证功能可以检查上传的组件是否符合预设的规则,比如POM格式正确性、签名验证等。 6. **搜索与浏览**:Nexus提供图形界面,方便用户搜索、浏览和管理仓库中的组件。 7. **持续集成**:与CI/CD工具如Jenkins、GitLab CI/CD等集成,自动化构建和部署过程。 8. **版本管理**:支持SNAPSHOT版本的管理,方便进行开发阶段的版本迭代。 压缩包内的两个主要文件“sonatype-work”和“nexus-3.30.0-01”可能是Nexus的安装目录结构。"sonatype-work"通常包含Nexus运行时的数据和配置,如数据库连接信息、日志文件等;而"nexus-3.30.0-01"可能是Nexus的可执行程序和配置文件,用于启动和配置服务。 在安装和配置Nexus时,用户需要注意以下几点: - 安装路径应避免有空格和特殊字符,以防运行时出现问题。 - 配置文件通常位于“nexus-3.30.0-01/conf”目录下的“nexus.properties”,根据实际需求进行修改。 - 启动Nexus通常需要指定JAVA_HOME环境变量,确保使用的是兼容的Java版本。 - 需要创建并配置至少一个仓库,如Maven公共仓库的代理,以便开始使用。 - 对于生产环境,应考虑设置备份策略,防止数据丢失。 Nexus作为一款强大的软件仓库管理工具,对于Java开发者和企业来说,是构建高效、安全的软件供应链的重要组成部分。通过正确配置和使用,能够大大提高软件开发和发布的效率,同时保障组件的质量和安全性。

1,084

社区成员

发帖
与我相关
我的任务
社区描述
Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。 Go+ 官网:https://goplus.org/
其他 企业社区
社区管理员
  • Go+
  • 杨东杰
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区为 Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。

Go+ 官网:https://goplus.org/
GitHub地址:https://github.com/goplus/gop

试试用AI创作助手写篇文章吧