抓取框架介绍
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分钟便编写完成并成功编译执行和抓取到最终结果;