基于Go 1.19的站点模板爬虫
package main
import (
"fmt"
"log"
"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
}
// 爬取指定URL的页面内容
func crawlPage(logger *zap.Logger, url string) (string, error) {
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Get(url)
if err != nil {
logger.Error("Error fetching URL", zap.Error(err), zap.String("url", url))
return "", err
}
defer resp.Body.Close()
doc, err := html.Parse(resp.Body)
if err != nil {
logger.Error("Error parsing HTML", zap.Error(err), zap.String("url", url))
return "", err
}
return doc.Text(), nil
}
func main() {
logger, err := initLogger()
if err != nil {
log.Fatalf("无法初始化日志: %v", err)
}
defer logger.Sync()
url := "https://example.com"
content, err := crawlPage(logger, url)
if err != nil {
logger.Error("爬取页面失败", zap.Error(err), zap.String("url", url))
return
}
fmt.Printf("爬取的页面内容: %s\n", content)
}
这段代码使用了Go 1.19的特性,并修正了原代码中的一些问题,例如日志配置的初始化和错误处理。它展示了如何使用zap
库来初始化一个日志系统,并且如何使用net/http
和golang.org/x/net/html
包来进行HTTP请求和HTML解析。这个例子是一个简单的网络爬虫,它抓取一个指定的URL并打印出页面的文本内容。
评论已关闭