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

15 篇文章 0 订阅
10 篇文章 2 订阅

抓取框架介绍

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("该页面没有数据")
	}
}

配置文件 conf.yaml

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

抓取输出: fenlei.json

练习总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值