• golang爬虫练习-抓取行业信息分类


    抓取框架介绍

    gathertool

    gathertool是golang脚本化开发库,目的是提高对应场景程序开发的效率;轻量级爬虫库,接口测试&压力测试库,DB操作库等。

    地址: https://github.com/mangenotwork/gathertool
    下载: go get github.com/mangenotwork/gathertool
    库文档: https://pkg.go.dev/github.com/mangenotwork/gathertool

    抓取效果图

    在这里插入图片描述

    在这里插入图片描述

    上代码

    代码位置:
    https://github.com/mangenotwork/gathertool/tree/main/_examples/cnlinfo

    package main
    
    import (
    	gt "github.com/mangenotwork/gathertool"
    )
    
    // 行业信息网 : http://www.cnlinfo.net/
    
    func init() {
    	// 读取配置
    	err := gt.NewConf("conf.yaml")
    	if err != nil {
    		panic(err)
    	}
    }
    
    // Rse 抓取结果保存的数据结构
    type Rse struct {
    	Broad  string   `json:"broad"`
    	Fenlei []string `json:"fenlei"`
    }
    
    var (
    	rse = make([]*Rse, 0)
    )
    
    // 获取行业分类
    func main() {
    	caseUrl := "http://www.cnlinfo.net/allgongsifenlei/yiqiyibiao.htm"
    	ctx, _ := gt.Get(caseUrl)
    	hangyeList, err := gt.GetPointClassHTML(ctx.Html, "ul", "hangye-list")
    	if err != nil {
    		gt.Error("没有获取到 ul class = hangye-list")
    		return
    	}
    	hangyeHtml := ""
    	if len(hangyeList) > 0 {
    		hangyeHtml = hangyeList[0]
    	}
    	// 获取并便利分类大类
    	for _, li := range gt.RegHtmlA(hangyeHtml) {
    		broad := gt.RegHtmlATxt(li)[0]
    		href := gt.RegHtmlHrefTxt(li)[0]
    		// 抓取小类
    		getClassify2(broad, href)
    	}
    	// 保存并输出到json文件
    	err = gt.OutJsonFile(rse, gt.Config.GetStr("out_file"))
    	if err != nil {
    		gt.Error(err)
    	}
    }
    
    // 获取小类
    func getClassify2(broad, caseUrl string) {
    	var (
    		notData     = 0
    		reqDelayMax = gt.Config.GetInt("req_delay_max")
    		reqDelayMin = gt.Config.GetInt("req_delay_min")
    	)
    	d := &Rse{
    		Broad:  broad,
    		Fenlei: make([]string, 0),
    	}
    	gt.Infof("抓取大类 %v : %v", broad, caseUrl)
    	ctx, _ := gt.Get(caseUrl, gt.SetSleep(reqDelayMin, reqDelayMax))
    	hangyeContent, err := gt.GetPointClassHTML(ctx.Html, "ul", "hangye-fenlei-content")
    	if err != nil {
    		gt.Error("没有获取到 ul class = hangye-fenlei-content")
    		notData++
    	}
    	for _, ul := range hangyeContent {
    		for _, a := range gt.RegHtmlATxt(ul) {
    			d.Fenlei = append(d.Fenlei, a)
    		}
    	}
    	// 第二种样式
    	hangyeContent1, err := gt.GetPointClassHTML(ctx.Html, "ul", "fenlei_list1")
    	if err != nil {
    		gt.Error("没有获取到 ul class = fenlei_list1")
    		notData++
    	}
    	for _, ul := range hangyeContent1 {
    		for _, a := range gt.RegHtmlATxt(ul) {
    			d.Fenlei = append(d.Fenlei, a)
    		}
    	}
    	rse = append(rse, d)
    	if notData == 2 {
    		panic("该页面没有数据")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    配置文件 conf.yaml

    # 抓取结果输出文件
    out_file: "fenlei.json"
    # 请求延时
    req_delay_min : 1
    req_delay_max : 3
    
    • 1
    • 2
    • 3
    • 4
    • 5

    抓取输出: fenlei.json

    练习总结

    使用gathertool能很规范化抓取程序的编写,提供配置,请求,提取,保存;
    特别是提取,使用 gt.GetPointClassHTML 快速定位到数据Dom范围,再使用gt.RegHtmlATxt获取到具体数据;
    gathertool还有很多很多的方法值得去探索和学习;
    使用gathertool编写抓取程序大大提升了效率,该程序用时不到5分钟便编写完成并成功编译执行和抓取到最终结果;

  • 相关阅读:
    基于JavaFX的扫雷游戏实现(四)——排行榜
    Python学习笔记:导入txt、xlsx文件并做简单函数处理
    mv-lcd初始化
    Kubernetes Pod自动扩容和缩容 基于自定义指标
    (建议收藏)OpenHarmony系统能力SystemCapability列表
    NPDP如何续证?操作指南来了!
    ​一款开源的.NET程序集反编译、编辑和调试神器
    sqlserver在linux下安装
    Spring Boot 可以同时处理多少请求?
    中学历史教学参考杂志中学历史教学参考杂志社中学历史教学参考编辑部2022年第14期目录
  • 原文地址:https://blog.csdn.net/Man_ge/article/details/127976885