0

0

如何在Golang中实现一个简单的Web爬虫并存入MySQL Go语言GORM入门

P粉602998670

P粉602998670

发布时间:2026-03-11 15:40:32

|

325人浏览过

|

来源于php中文网

原创

正确做法是读完响应体后立即调用 resp.body.close(),避免连接泄漏;automigrate 不会自动更新字段,需手动验证表结构;goquery 查不到元素优先排查 http 层问题;并发数应根据网络和目标站调整,配合限流与连接池配置。

如何在golang中实现一个简单的web爬虫并存入mysql go语言gorm入门

net/http 发起请求时,别直接忽略 response.Body

Go 的 HTTP 客户端不会自动关闭响应体,不手动调用 resp.Body.Close() 会导致连接泄漏,爬虫跑一会儿就卡死或报 too many open files 错误。

常见错误是只读取内容就完事:io.ReadAll(resp.Body) 后没关;或者用 defer resp.Body.Close() 却忘了它在函数返回时才执行——如果中间 panic 或提前 return,照样漏关。

  • 正确做法:读完立刻关,不要 defer(除非你 100% 确保函数只有一处 return)
  • 更稳妥写法:
    resp, err := http.Get(url)
    if err != nil {
        return err
    }
    defer func() {
        if resp.Body != nil {
            resp.Body.Close()
        }
    }()
    body, _ := io.ReadAll(resp.Body)
    
  • 注意:如果用 http.Client 自定义超时或重试,Body 关闭逻辑不变

GORM 插入结构体前,先检查 AutoMigrate 是否真生效了

很多人以为调一次 db.AutoMigrate(&Article{}) 就万事大吉,其实 GORM 不会自动加字段、改类型、删列,也不会报错提示“这个字段我跳过了”。表结构和 struct 对不上时,插入可能静默失败,或存空值。

典型场景:开发中加了个 PublishedAt time.Time 字段,但数据库表没更新,GORM 插入时既不报错也不写入该字段,查出来就是零值。

立即学习go语言免费学习笔记(深入)”;

IBM Watson
IBM Watson

IBM Watson文字转语音

下载
  • 每次改 model 后,手动确认数据库实际字段:用 DESCRIBE articles 或工具看
  • 生产环境禁用 AutoMigrate,改用迁移脚本;开发期可加日志:db.Debug().AutoMigrate(&Article{}) 看 GORM 实际执行的 SQL
  • 注意字段标签:gorm:"not null"gorm:"default:0" 必须显式写,否则 GORM 可能按零值处理而非数据库默认值

解析 HTML 用 goquery 时,Find 返回空不等于页面没加载成功

doc.Find("h1.title") 返回空结果,大概率不是 selector 写错了,而是 HTML 结构根本没按预期加载——比如页面是 JS 渲染的,或者用了反爬 data-* 动态属性,又或者你没处理重定向后的最终 URL。

真实爬虫里,80% 的“找不到元素”问题出在 HTTP 层,而不是 selector 层。

  • 先打日志:fmt.Printf("status: %d, url: %s\n", resp.StatusCode, resp.Request.URL),确认是不是 302 跳转或 403 被拦
  • 检查 Content-Type 是否为 text/html,有些站点返回 JSON 或登录页却给 200
  • doc.Find("title").Text() 打个桩,确认 goquery 至少能读到基础节点;如果连 title 都空,说明 HTML 解析失败(比如编码不对,试试 charset.NewReaderLabel

并发抓取多个 URL 时,goroutine 数量不能只靠 runtime.NumCPU()

本地 CPU 是 8 核,不代表你能开 8 个 goroutine 去发 HTTP 请求。网络 IO 是瓶颈,不是 CPU;开太多反而触发 TCP 连接池耗尽、DNS 超时、目标站限流,甚至被封 IP。

真正有效的并发控制,得结合目标站点响应时间、连接池设置、以及你的带宽/出口 IP 能力来调。

  • 起步设成 3–5 个 goroutine,观察平均响应时间和错误率;再逐步加到 10–20
  • 必须配 http.ClientTransport
    client := &http.Client{
        Transport: &http.Transport{
            MaxIdleConns:        100,
            MaxIdleConnsPerHost: 100,
            IdleConnTimeout:     30 * time.Second,
        },
    }
    
  • 别用无缓冲 channel 控制并发,容易死锁;用 semaphore.NewWeighted(5)(来自 golang.org/x/sync/semaphore)更稳

事情说清了就结束。真正的难点不在“怎么写”,而在“怎么让每次请求都可靠、每条数据都对得上、每个 goroutine 都收得回来”。这些细节不盯住,跑两天就崩。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1438

2025.06.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号