跳转到主要内容

🧩 Go Actor Demo

必需文件(位于项目根目录)

├── main.go
├── main
├── input_schema.json
├── README.md
├── go.mod
├── go.sum
└── GoSdk
      ├────sdk.go
      ├────sdk.pd.go
      └────sdk_grpc.pd.go
文件名说明
main.go脚本源码文件
main脚本入口文件(执行入口),统一命名为 main
input_schema.jsonUI 输入表单配置文件
README.md项目说明文档
sdk.goSDK 基础能力 ,放在GoSdk目录下
sdk_pd.go数据处理增强模块 ,放在GoSdk目录下
sdk_grpc.pd.go网络通信模块 ,放在GoSdk目录下

go脚本需要build后生成可执行文件,再上传到脚本市场

	set CGO_ENABLED=0 
	set GOOS=linux 
	set GOARCH=amd64 
	go build -o main ./main.go
💡 建议在 build 后,使用 UPX 压缩可执行文件,以显著减小体积。

⭐ 脚本核心文件 SDK

📁 文件说明

以下是三个重要的SDK文件,请将它们放在脚本的根目录下:
文件名称主要功能
sdk.go基础功能模块
sdk_pd.go数据处理增强模块
sdk_grpc.pd.py网络通信模块
这三个文件共同构成了脚本的“工具箱”,提供了与中台系统交互和爬虫运行所需的所有核心功能。

🔧 核心功能使用说明

1. 环境参数获取 - 获取脚本启动时的配置信息

当脚本启动时,可以从外部传入一些配置参数(比如要采集的网站地址、搜索关键词等)。使用以下方法获取这些参数: go复制代码
# 获取所有传入的参数以json形式返回
ctx := context.Background()
inputJSON, _ := cafesdk.Parameter.GetInputJSONString(ctx)

# 示例假设传入了网站地址和关键词
# 返回结果可能类似:{"website": "example.com", "keyword": "科技新闻"}
使用场景:比如您需要根据不同任务采集不同网站的数据,就可以通过传入不同的参数来实现,无需修改代码。

2. 运行日志 - 记录脚本执行过程

脚本执行过程中,您可以记录不同级别的日志信息,这些日志会显示在中台界面,方便查看执行状态和问题排查:
ctx := context.Background()
# 调试信息最详细用于问题排查
SDK.Log.Debug(ctx, "正在连接目标网站...")

# 一般信息正常流程记录
SDK.Log.Info(ctx, "成功获取10条新闻数据")

# 警告信息需要注意但非错误的情况
SDK.Log.Warn(ctx, "网络连接较慢,可能影响采集速度")

# 错误信息执行出错时使用
SDK.Log.Error(ctx, "无法访问目标网站,请检查网络连接")
日志级别说明
  • debug:最详细的调试信息,适合开发时使用
  • info:正常的流程记录,推荐在关键步骤使用
  • warn:警告信息,表示可能有问题但程序还能运行
  • error:错误信息,表示出现了需要关注的问题

3. 结果返回 - 将采集的数据发送回中台

当脚本采集到数据后,需要按照以下两个步骤将数据返回给中台系统:

第一步:设置表格表头(必须首先执行)

在推送具体数据之前,需要先定义数据的表格结构,就像Excel中先定义列标题一样:
# 设置表头
	headers := []*cafesdk.TableHeaderItem{
		{
			Label:  "标题",
			Key:    "title",
			Format: "text",
		},
		{
			Label:  "内容",
			Key:    "content",
			Format: "text",
		},
	}
	ctx := context.Background()
	res, err := cafesdk.Result.SetTableHeader(ctx, headers)
字段说明
  • label:表格中显示的列标题(用户可见,建议使用中文)
  • key:数据的唯一标识符(代码中使用,建议使用英文小写加下划线)
  • format:数据类型,支持以下格式:
    • "text":文本/字符串
    • "integer":整数
    • "boolean":是/否(布尔值)
    • "array":数组/列表
    • "object":对象/字典

第二步:逐条推送数据

设置好表头后,就可以开始推送采集到的数据了:
	type result struct {
		Title   string `json:"title"`
		Content string `json:"content"`
	}

	resultData := []result{
		{Title: "示例标题1", Content: "示例内容1"},
		{Title: "示例标题2", Content: "实示例内容2"},
	}
	
	ctx := context.Background()

	for _, datum := range resultData {
		jsonBytes, _ := json.Marshal(datum)

		res, err := cafesdk.Result.PushData(ctx, string(jsonBytes))
		if err != nil {
			cafesdk.Log.Error(ctx, fmt.Sprintf("推送数据失败: %v", err))
			return
		}
		fmt.Printf("PushData Response: %+v\n", res)
	}
重要提醒
  1. 设置表头与推送数据,顺序可以颠倒
  2. 推送数据时,字典中的key必须与表头中定义的key完全一致
  3. 数据需要逐条推送,不能一次性推送多条
  4. 建议在每次推送后记录日志,方便跟踪执行进度

⚠️ 常见问题与注意事项

  1. 文件位置:确保三个SDK文件放在脚本中(主文件所在的文件夹)
  2. 导入方式:在代码中直接使用 SDK 或 CafeSDK 即可调用相关功能
  3. 键名一致:推送数据时使用的key必须与表头中定义的key完全一致(包括大小写)
  4. 错误处理:建议对每个SDK调用都检查返回结果,特别是推送数据时
通过以上功能,您的脚本就可以与中台系统完美配合,实现参数的灵活配置、执行过程的透明监控,以及采集数据的规范化返回。

⭐ 脚本入口文件(main.go)

💡 代码示例

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"os"
	cafesdk "test/GoSdk"
	"time"
)

func run() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Printf("panic: %v\n", r)
		}
	}()

	time.Sleep(2 * time.Second)
	fmt.Println("golang gRPC SDK client started......")

	ctx := context.Background()

	// 1. 获取输入参数
	inputJSON, err := cafesdk.Parameter.GetInputJSONString(ctx)
	if err != nil {
		cafesdk.Log.Error(ctx, fmt.Sprintf("获取输入参数失败: %v", err))
		return
	}
	cafesdk.Log.Debug(ctx, fmt.Sprintf("输入参数: %s", inputJSON))

	// 2. 获取代理配置
	proxyDomain := "proxy-inner.cafescraper.com:6000"

	var proxyAuth string
	proxyAuth = os.Getenv("PROXY_AUTH")
	cafesdk.Log.Info(ctx, fmt.Sprintf("代理认证信息: %s", proxyAuth))

	// 3. 拼接代理 URL
	var proxyURL string
	if proxyAuth != "" {
		proxyURL = fmt.Sprintf("socks5://%s@%s", proxyAuth, proxyDomain)
	}
	cafesdk.Log.Info(ctx, fmt.Sprintf("代理地址: %s", proxyURL))

	// 创建自定义 HTTP 客户端,支持代理
	httpClient := &http.Client{
		Timeout: time.Second * 30, // 设置超时时间
	}

	// 如果配置了代理,设置代理传输层
	if proxyURL != "" {
		// 解析代理URL
		proxyParsed, err := url.Parse(proxyURL)
		if err != nil {
			cafesdk.Log.Error(ctx, fmt.Sprintf("解析代理URL失败: %v", err))
			return
		}

		// 创建带代理的传输层
		httpClient.Transport = &http.Transport{
			Proxy: http.ProxyURL(proxyParsed),
			TLSClientConfig: &tls.Config{
				InsecureSkipVerify: true, // 仅测试使用,生产环境应配置正确的证书
			},
		}

		cafesdk.Log.Info(ctx, "已配置代理客户端")
	}

	// 4. 业务逻辑处理(示例)
	cafesdk.Log.Info(ctx, "开始处理业务逻辑")
	// 发送请求到 ipinfo.io
	targetURL := "https://ipinfo.io/ip"
	req, err := http.NewRequestWithContext(ctx, "GET", targetURL, nil)
	if err != nil {
		cafesdk.Log.Error(ctx, fmt.Sprintf("创建请求失败: %v", err))
		return
	}

	cafesdk.Log.Info(ctx, fmt.Sprintf("开始请求: %s", targetURL))

	// 发送请求
	resp, err := httpClient.Do(req)
	if err != nil {
		cafesdk.Log.Error(ctx, fmt.Sprintf("请求失败: %v", err))
		return
	}
	defer resp.Body.Close()

	cafesdk.Log.Info(ctx, fmt.Sprintf("响应状态码: %d", resp.StatusCode))

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		cafesdk.Log.Error(ctx, fmt.Sprintf("读取响应失败: %v", err))
		return
	}

	// 打印返回的IP地址
	ip := strings.TrimSpace(string(body))
	cafesdk.Log.Info(ctx, fmt.Sprintf("当前IP地址: %s", ip))

	// 如果需要JSON格式输出,可以使用更结构化的方式
	cafesdk.Log.Info(ctx, "业务逻辑处理完成")
	
	// 5. 推送结果数据
	type result struct {
		Title   string `json:"title"`
		Content string `json:"content"`
	}

	resultData := []result{
		{Title: "实列标题1", Content: "实列内容1"},
		{Title: "实列标题2", Content: "实列内容2"},
	}

	for _, datum := range resultData {
		jsonBytes, _ := json.Marshal(datum)

		res, err := cafesdk.Result.PushData(ctx, string(jsonBytes))
		if err != nil {
			cafesdk.Log.Error(ctx, fmt.Sprintf("推送数据失败: %v", err))
			return
		}
		fmt.Printf("PushData Response: %+v\n", res)
	}

	// 6. 设置表格表头
	headers := []*cafesdk.TableHeaderItem{
		{
			Label:  "标题",
			Key:    "title",
			Format: "text",
		},
		{
			Label:  "内容",
			Key:    "content",
			Format: "text",
		},
	}

	res, err := cafesdk.Result.SetTableHeader(ctx, headers)
	if err != nil {
		cafesdk.Log.Error(ctx, fmt.Sprintf("设置表头失败: %v", err))
		return
	}
	fmt.Printf("SetTableHeader Response: %+v\n", res)

	cafesdk.Log.Info(ctx, "脚本执行完成")
}

func main() {
	run()
}

自动化数据采集脚本:操作与原理指南

1. 脚本简介

这是一个自动化工具的模板,它的作用就像一个“数字员工”。它会自动打开指定的网页(如社交媒体页面),提取你需要的信息,并将这些信息整理成整齐的表格。

2. 它通过哪几个步骤工作?

我们将整个过程简化为四个主要阶段:

第一步:接收指令(获取输入参数)

在启动脚本前,你会给它一些指令(例如:你想抓取的网页链接是什么?你想抓取多少条数据?)。

第二步:隐身准备(代理网络配置)

为了能够顺利访问一些海外或有访问限制的网站,脚本会自动配置“加密通道”(代理服务器)。

第三步:自动作业(业务逻辑处理)

这是脚本的核心部分。它会根据你提供的链接,自动前往目标页面,读取上面的标题、内容、图片地址等信息。

第四步:上报结果(数据推送与表格生成)

抓取完成后,脚本会将杂乱的信息转化为标准的格式,并保存到系统中。它还会自动为你设计好表格的表头(例如:第一列叫“链接”,第二列叫“内容”)。