package main
import (
"fmt"
"net/http"
"os"
"time"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/net/html"
)
// 初始化日志配置
func initLogger() (*zap.Logger, error) {
encoderConfig := zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.EpochMillisTimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
}
core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderConfig), os.Stdout, zapcore.InfoLevel)
return zap.New(core), nil
}
// 抓取页面函数
func fetchPage(logger *zap.Logger, url string, fetchDuration time.Duration) (*html.Node, error) {
logger.Info("开始抓取页面", zap.String("url", url), zap.Duration("fetch_duration", fetchDuration))
client := &http.Client{Timeout: fetchDuration}
resp, err := client.Get(url)
if err != nil {
logger.Error("抓取页面失败", zap.Error(err))
return nil, err
}
defer resp.Body.Close()
doc, err := html.Parse(resp.Body)
if err != nil {
logger.Error("解析页面失败", zap.Error(err))
return nil, err
}
return doc, nil
}
func main() {
logger, err := initLogger()
if err != nil {
fmt.Println("初始化日志失败:", err)
return
}
defer logger.Sync()
doc, err := fetchPage(logger, "https://example.com", 5*time.Second)
if err != nil {
fmt.Println("抓取页面出错:", err)
return
}
// 对抓取到的页面数据进行处理
fmt.Println("页面抓取成功:", doc)
}
这段代码展示了如何使用Go语言高效地抓取网页数据。它使用了go.uber.org/zap
库来初始化日志配置,并使用net/http
和golang.org/x/net/html
包来执行HTTP请求和解析HTML。代码简洁,注重实效,并且在实际应用中可以作为爬虫项目的基础。