Go爬虫开发学习记录

Go爬虫开发学习记录

基础篇:使用net/http库

Go的标准库net/http提供了完善的HTTP客户端功能,是构建爬虫的基石:

package mainimport ("fmt""io""net/http"
)func fetchPage(url string) string {// 创建自定义HTTP客户端client := &http.Client{}// 构建GET请求req, _ := http.NewRequest("GET", url, nil)// 设置请求头模拟浏览器req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)")req.Header.Add("Cookie", "example_cookie=value")// 发送请求resp, err := client.Do(req)if err != nil {fmt.Println("请求错误:", err)return ""}defer resp.Body.Close()  // 确保关闭响应体// 检查状态码if resp.StatusCode != 200 {fmt.Println("状态码错误:", resp.StatusCode)return ""}// 读取响应内容body, err := io.ReadAll(resp.Body)if err != nil {fmt.Println("读取失败:", err)return ""}return string(body)
}func main() {url := "https://www.runoob.com/go/go-tutorial.html"htmlContent := fetchPage(url)fmt.Println(htmlContent)
}

解析:

  1. 自定义HTTP客户端:通过&http.Client{}创建可配置的客户端实例
  2. 请求头设置:添加User-Agent和Cookie模拟浏览器行为
  3. 错误处理:全面处理网络请求、状态码和读取错误
  4. 资源清理:使用defer确保响应体正确关闭

进阶篇:HTML解析与内容提取

获取HTML只是第一步,关键是从中提取有价值的信息:

import ("golang.org/x/net/html""strings"
)func parseHTML(htmlStr string) (title, content string) {// 解析HTML文档doc, err := html.Parse(strings.NewReader(htmlStr))if err != nil {fmt.Println("解析错误:", err)return}// 递归查找标题var findTitle func(*html.Node)findTitle = func(n *html.Node) {if n.Type == html.ElementNode && n.Data == "title" {for c := n.FirstChild; c != nil; c = c.NextSibling {if c.Type == html.TextNode {title = c.Datareturn}}}for c := n.FirstChild; c != nil; c = c.NextSibling {findTitle(c)}}findTitle(doc)// 提取所有文本内容var extractText func(*html.Node)extractText = func(n *html.Node) {if n.Type == html.TextNode {trimmed := strings.TrimSpace(n.Data)if trimmed != "" {content += trimmed + "\n"}}for c := n.FirstChild; c != nil; c = c.NextSibling {extractText(c)}}extractText(doc)return
}func main() {htmlContent := fetchPage("https://www.runoob.com/go/go-tutorial.html")title, content := parseHTML(htmlContent)fmt.Println("标题:", title)fmt.Println("内容:\n", content)
}

解析:

  1. 递归遍历DOM树:深度优先搜索(DFS)遍历所有节点
  2. 节点类型判断
    • ElementNode:HTML元素节点(标签)
    • TextNode:文本内容节点
  3. 内容清洗strings.TrimSpace去除空白字符
  4. 精确提取:通过标签名(title)定位特定内容

高效篇:使用Colly+GoQuery框架

对于复杂爬取任务,Colly+GoQuery组合提供更强大的解决方案:

package mainimport ("fmt""log""strings""time""bytes""github.com/gocolly/colly""github.com/PuerkitoBio/goquery"
)func main() {// 1. 创建Collector实例c := colly.NewCollector(colly.AllowedDomains("runoob.com", "www.runoob.com"),colly.UserAgent("Mozilla/5.0..."),colly.Async(true), // 启用异步)// 2. 设置爬取规则c.Limit(&colly.LimitRule{DomainGlob:  "*runoob.com*",Parallelism: 2, // 并发数Delay:       1 * time.Second,RandomDelay: 1 * time.Second,})// 3. 注册回调函数c.OnRequest(func(r *colly.Request) {fmt.Println("访问:", r.URL)})c.OnError(func(_ *colly.Response, err error) {log.Println("错误:", err)})// 4. 使用GoQuery解析c.OnHTML("html", func(e *colly.HTMLElement) {doc, err := goquery.NewDocumentFromReader(bytes.NewReader(e.Response.Body))if err != nil {log.Println("解析失败:", err)return}// 提取标题title := doc.Find("title").Text()fmt.Println("页面标题:", title)// 提取导航菜单doc.Find("#leftcolumn a").Each(func(i int, s *goquery.Selection) {fmt.Printf("菜单%d: %s\n", i+1, strings.TrimSpace(s.Text()))})// 提取文章内容doc.Find("div.article").Each(func(i int, s *goquery.Selection) {section := s.Find("h1").Text()content := strings.TrimSpace(s.Text())fmt.Printf("\n章节%d: %s\n内容: %s\n", i+1, section, content)})})// 5. 开始爬取c.Visit("https://www.runoob.com/go/go-tutorial.html")c.Wait() // 等待异步任务fmt.Println("爬取完成")
}

Colly核心优势:

  1. 智能限速控制

    • 自动延迟请求
    • 随机延迟避免检测
    • 并发控制保护服务器
  2. 强大的选择器

    • CSS选择器语法
    • 链式调用
    • 支持复杂嵌套选择
  3. 异步高性能

    • 协程并发处理
    • 自动队列管理
    • 高效资源利用
  4. 扩展性强

    • 中间件支持
    • 自定义存储后端
    • 请求重试机制

可视化爬虫工具:易采集EasySpider

对于非技术人员或快速原型开发,可视化爬虫工具是绝佳选择:
无代码可视化爬虫

易采集EasySpider 核心特点:

  • 零代码可视化操作
  • 浏览器自动化录制
  • 智能数据提取
  • 定时任务调度
  • 云存储支持

适用场景:快速数据采集原型、非技术用户、简单爬取任务

爬虫开发最佳实践

  1. 遵守Robots协议

    User-agent: *
    Allow: /public/
    Disallow: /private/
    
  2. 道德规范

    • 尊重网站版权声明
    • 避免高频请求
    • 不爬取敏感信息
  3. 反爬虫对策

    • 轮换User-Agent
    • 使用代理IP池
    • 模拟人类操作间隔
    • 处理验证码机制
  4. 错误处理

    • 网络异常重试
    • 状态码处理
    • 超时控制
  5. 数据存储

    • 结构化数据:MySQL/PostgreSQL
    • 半结构化:MongoDB/Elasticsearch
    • 文件存储:CSV/JSON/Parquet

总结与学习路径

Go爬虫开发技术栈演进:

基础 net/http
HTML解析
Colly框架
分布式爬虫
云原生部署

学习建议:

  1. 掌握基础:熟练使用net/http和HTML解析
  2. 框架实践:深入Colly+GoQuery组合应用
  3. 项目实战:构建完整爬虫系统
  4. 拓展进阶:研究分布式爬虫架构
  5. 工具互补:了解可视化工具辅助开发

资源推荐:

  • 官方文档:Go net/http包
  • Colly框架:GitHub仓库
  • GoQuery文档:官方指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 系统分区注意事项

ubuntu 系统分区大小,注意事项: 安装ubuntu系统时,需要进行分区,手动分区时,有一点需要注意。一开始我也没有注意,长时间使用后才发现的问题。 需要注意一点,如果不对 /usr 进行单独分区&…

AI知识库调用全攻略:四种实战方法与技术实现

本文详细解析AI如何调用知识库解决实际问题,涵盖四种核心调用方式(直接检索匹配、向量检索生成、工具调用知识库、多轮对话知识库),附具体业务样例与技术实现步骤,最后总结常见问题解决方案,助你快速搭建智…

WebRTC(一):整体架构

架构总览 模块划分 媒体采集模块 使用浏览器 API:getUserMedia()。采集摄像头(video)、麦克风(audio)。通过 MediaStreamTrack 管理单轨道。 媒体处理与编解码 编码器(发送端): …

商品中心—1.B端建品和C端缓存的技术文档二

大纲 1.商品中心的专业术语 2.商品中心的基本业务系统 3.商品中心整体架构设计以及运行流程 4.商品B端—商品编码生成逻辑 5.商品B端—商品核心数据模型 6.商品B端—转换建品请求数据为商品模型数据 7.商品B端—商品建品时商品编号补全与审核配置 8.商品B端—商品审核前…

网络之交换机

定义与作用 交换机是一种为所连接的IT设备提供网络通信的设备,主要作用是转发传输数据,实现网络设备之间的通信互联,还能对网络进行分段和隔离,划分多个虚拟网段,提高网络安全性,以及对不同端口、用户和应用…

AI不会杀死创作,但会杀死平庸

作为一个敲了8年Java代码的普通本科程序员,日常主要泡在会议后台管理系统的开发里。从2023年底被朋友拽着试了第一把AI工具到现在,电脑手机上的AI软件比外卖App还多——写代码的Copilot、画时序图的工具、聊天的ChatGPT、Deepseek,基本市面上…

Golang——8、协程和管道

协程和管道 1、协程1.1、进程、线程和协程1.2、goroutine的使用以及sync.WaitGroup1.3、启动多个协程1.4、设置Golang并行运行的时候占用的cup数量1.5、goroutine统计素数 2、管道2.1、管道的操作2.2、协程和管道协同2.3、单向管道2.4、多路复用之select2.5、解决协程中出现的异…

深入理解Python内置模块及第三方库的使用与管理

Python 内置模块与第三方库 在 Python 编程中,模块和库是帮助开发者高效实现各种功能的基础工具。Python 提供了丰富的内置模块以及第三方库,能够支持从基础的文件操作到复杂的数据分析和机器学习等任务。本篇文章将深入介绍 Python 的内置模块与第三方…

二分查找-P2249 【深基13.例1】查找

文章目录 参考代码二分标准模板 题目来源-洛谷网 参考代码 #include<bits/stdc.h> using namespace std; const int N 1e65; int m,n,a[N],b; int find(int t) {int l1,rn;while(l<r){int mid(lr)/2;//防止溢出 mid l (r-l) /2 ;if(a[mid]>t) rmid;//中间值比…

手写muduo网络库(一):项目构建和时间戳、日志库

引言 本文作为手写 muduo 网络库系列开篇&#xff0c;聚焦项目基础框架搭建与核心基础工具模块设计。通过解析 CMake 工程结构设计、目录规划原则&#xff0c;结合时间戳与日志系统的架构&#xff0c;为后续网络库开发奠定工程化基础。文中附完整 CMake 配置示例及模块代码。 …

NLP学习路线图(三十二): 模型压缩与优化

一、 核心压缩与优化技术详解 1. 知识蒸馏:智慧的传承(Knowledge Distillation, KD) 核心思想:“师授徒业”。训练一个庞大、高性能但笨重的“教师模型”(Teacher Model),让其指导训练一个轻量级的“学生模型”(Student Model)。学生模型学习模仿教师模型的输出行为(…

vue前端字典映射

1.界面展示 2.图中状态字段接收的数据如下 3.代码转换&#xff0c;添加计算属性代码 再在绑定属性的地方做转换 computed: {statusMap() {return {"-1": "已退号",1: "挂号",2: "接诊",3: "已完诊",};},},<m-input:spa…

基于 llama-factory进行模型微调

# GLM4-9B-chat Lora 微调. 介绍如何基于 llama-factory 框架&#xff0c;对 glm-4-9b-chat 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;[知乎|深入浅出 Lora](https://zhuanlan.zhihu.com/p/650197598)。 ## 环境配置 在完…

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI&#xff0c;理由是此举能提升性能和安全性&#xff0c;同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…

Go 并发编程深度指南

Go 并发编程深度指南 Go 语言以其内置的并发原语而闻名&#xff0c;通过 goroutine 和 channel 提供了一种高效、安全的并发编程模型。本文将全面解析 Go 的并发机制及其实际应用。 核心概念&#xff1a;Goroutines 和 Channels 1. Goroutines (协程) Go 的轻量级线程实现&…

vue和uniapp聊天页面右侧滚动条自动到底部

1.vue右侧滚动条自动到底部 <div ref"newMessage1"></div> <!-- 定义<div ref"newMessage1"></div>与<div v-for”item in list“>循环同级定义-->定义方法 scrollToBottomCenter(){this.$nextTick(() > {this.$re…

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …

JMeter函数整理

"_csvRead"函数 csvRead函数是从外部读取参数&#xff0c;csvRead函数可以从一个文件中读取多个参数。 下面具体讲一下如何使用csvread函数&#xff1a; 1.新建一个csv或者text文件&#xff0c;里面保存要读取的参数&#xff0c;每个参数间用逗号相隔。每行表示每一组…

深入理解 React Hooks

在当今的 React 开发中,Hooks 已经成为构建函数组件的核心工具。自 React 16.8 版本引入以来,Hooks 彻底改变了开发者编写 React 组件的方式,使得状态管理和副作用处理变得更加简洁和直观。本文将全面介绍 React 提供的各种 Hooks,从基础的 useState 和 useEffect,到高级的…

Doris-2:单虚拟机上非docker化安装Doris实验环境

Doris-2:单虚拟机上非docker化安装Doris实验环境 1.安装1.1.环境说明1.2.基础准备1.2.1.JDK1.2.2.操作系统配置(使用root或者有权账户)1.2.2.1.修改环境变量1.2.2.2.修改虚拟内存区域1.2.2.3.关闭swap1.2.2.4.关闭防火墙1.2.2.5.创建用户和组1.3.安装doris1.3.1.解压1.3.2.配置…