【Go语言爬虫系列01】爬虫入门与Colly框架基础

Go分布式爬虫笔记(二十三)_go分布式爬虫框架 RuleName: “解析阳台房”,Name: “解析网站URL”,// 动态解析JS中的正则表达式。// 任务名称,应保证唯一性。// 网站是否可以重复爬取。Name: “解析阳台房”,// 用于动态规则添加请求。//获取当前任务对应的规则。// 新的任务加入队列中。// 解析内容并输出结果。// 全局爬虫任务实例。// 获取初始化任务。 阅读详情
AI摘要

本文是Go语言爬虫系列首篇,介绍了网络爬虫基本概念、工作原理与伦理法律边界,阐述了Go语言开发爬虫的优势,讲解了Colly框架的安装、核心架构。通过实战案例展示如何创建新闻网站爬虫,还介绍了爬虫限速与并发控制技术,最后开发了完整的新闻聚合爬虫。

📚 原创系列: “Go语言爬虫系列”

🔄 转载说明: 本文最初发布于"Gopher部落"微信公众号,经原作者授权转载。

🔗 关注原创: 欢迎扫描文末二维码,关注"Gopher部落"微信公众号获取第一手Go技术文章。

📑 Go语言爬虫系列导航

本文是【Go语言爬虫系列】的第1篇,点击下方链接查看更多文章

🚀 Go爬虫系列:共12篇
  1. 爬虫入门与Colly框架基础 👈 当前位置
  2. HTML解析与Goquery技术详解
  3. Colly高级特性与并发控制
  4. 爬虫架构设计与实现(即将发布)
  5. 反爬虫策略应对技术(即将发布)
  6. 模拟登录与会话维持(即将发布)
  7. 动态网页爬取技术(即将发布)
  8. 分布式爬虫设计与实现(即将发布)
  9. 数据存储与处理(即将发布)
  10. 爬虫性能优化技术(即将发布)
  11. 爬虫安全与合规性(即将发布)
  12. 综合项目实战:新闻聚合系统(即将发布)

📖 文章导读

本文作为Go语言爬虫系列的第一篇,将为您介绍:

  1. 网络爬虫的基本概念、工作原理与伦理法律边界
  2. Go语言爬虫开发的优势及常用工具库概览
  3. Colly框架的安装、核心组件与基本架构
  4. 实战案例:创建您的第一个新闻网站爬虫
  5. 爬虫性能调优:限速与并发控制基础知识

一、爬虫基础概念与伦理边界

1.1 什么是网络爬虫?

网络爬虫(Web Crawler),也称为网络蜘蛛(Spider)或网页采集器,是一种按照特定规则自动浏览并提取网络信息的程序。它模拟人类浏览网页的行为,但速度更快、范围更广,可以高效地从互联网获取和处理大量数据。

爬虫工作原理:

爬虫通常以一个或多个起始URL开始,获取页面内容后,从中提取有价值的数据以及新的URL链接。这些新链接被添加到待爬取队列中,程序循环执行这个过程,像蜘蛛一样在网络上不断"爬行",构建起一张信息网络。爬虫可以配置成广度优先或深度优先的搜索策略,根据具体需求决定爬取路径。

爬虫的基本工作流程包括:

  1. URL规划:确定爬取的起始页面和范围
  2. 网页下载:发送HTTP请求并获取网页内容
  3. 内容解析:从HTML中提取有价值的数据
  4. 数据存储:将提取的信息保存到数据库或文件
  5. URL发现:从当前页面中发现新的链接并加入待爬取队列

1.2 爬虫的应用场景

网络爬虫在现代互联网生态中有广泛的应用:

  • 搜索引擎索引:Google、百度等搜索引擎通过爬虫构建网页索引
  • 数据分析与挖掘:市场研究、舆情分析、竞品监控
  • 内容聚合:新闻聚合、商品比价、求职信息整合
  • 学术研究:社会网络分析、互联网行为研究
  • 测试与监控:网站可用性检测、内容变更监控

1.3 爬虫的法律与伦理边界

在开发和使用爬虫时,必须意识到其法律和伦理边界,以避免潜在的法律风险:

法律限制:

  • 尊重网站的 robots.txt 协议,该文件指明了哪些内容允许爬取
  • 遵守网站的服务条款和使用协议
  • 避免采集个人隐私信息,尊重数据保护法规(如欧盟GDPR)
  • 不得利用爬虫从事违法活动,如攻击网站安全

伦理注意事项:

  • 控制爬取频率,避免对目标网站造成过大负担
  • 标识您的爬虫(如设置明确的User-Agent)
  • 考虑数据的版权问题,特别是商业使用时
  • 遵循"最低必要"原则,只采集必要的数据

提示:开发爬虫前,建议先阅读目标网站的robots.txt文件(通常位于网站根目录,如https://example.com/robots.txt)和服务条款,确保您的爬虫行为合规。

二、Go语言爬虫开发优势

2.1 为什么选择Go开发爬虫?

Go语言凭借其独特的特性,成为开发爬虫程序的理想选择:

  1. 并发性能优秀:Go的goroutine和channel使并发爬取变得简单高效
  2. 内存占用低:相比Python等语言,Go的内存效率更高,适合大规模爬虫
  3. 静态类型:编译时类型检查减少运行时错误,提高程序稳定性
  4. 丰富的标准库:内置net/http等网络库,简化HTTP请求处理
  5. 交叉编译能力:可轻松构建不同平台的可执行文件,部署方便

2.2 Go爬虫生态概览

Go语言拥有丰富的爬虫相关库,各具特色:

库名称主要特点适用场景
Colly高性能、易用API、事件驱动通用网页爬虫,本系列主推
Goquery类jQuery选择器,DOM解析HTML内容提取,与Colly配合使用
Chromedp无头浏览器控制,支持JS渲染动态网页爬取,需JavaScript渲染
Soup简洁API,快速上手简单页面解析,原型开发
Gocrawl可定制化程度高复杂爬虫逻辑

本系列教程将主要使用Colly作为核心框架,配合其他库构建完整的爬虫系统。

三、Colly框架入门

3.1 Colly简介

Colly 是Go语言中最流行的爬虫框架之一,由Gergely Brautigam创建,具有以下特点:

  • 高性能:可以在几分钟内爬取数百万个网页
  • 简洁API:易于学习和使用的接口设计
  • 事件驱动:基于回调函数的灵活控制
  • 并发支持:内置并发爬取能力
  • 灵活扩展:支持中间件和自定义设置

3.2 安装Colly

使用Go Modules安装Colly非常简单:

# 初始化模块(如果尚未初始化)
go mod init myspider

# 安装Colly
go get -u github.com/gocolly/colly/v2

如果您使用的是较旧的Go版本(<1.11),可以使用以下命令:

go get -u github.com/gocolly/colly

3.3 Colly核心架构

Colly基于事件驱动模型,主要组件包括:

  • Collector:爬虫的核心控制器,管理爬取过程
  • 事件回调:如OnRequest、OnResponse、OnHTML等处理不同阶段的逻辑
  • Context:在不同回调间共享数据
  • Queue:管理待爬取的URL队列
  • Storage:存储已访问URL信息,防止重复爬取

Colly架构工作流程:

  1. 初始化:创建Collector实例,配置参数和回调函数
  2. 请求发起:调用Visit方法触发爬取,执行OnRequest回调
  3. 接收响应:获取HTTP响应后,执行OnResponse回调
  4. 内容解析:使用OnHTML/OnXML回调解析响应内容
  5. 数据处理:在回调中提取和处理数据
  6. 链接发现:分析页面中的链接,加入待爬取队列
  7. 完成通知:页面处理完成后,执行OnScraped回调

Collector对象通过事件分发机制,将不同阶段的处理逻辑解耦,使代码组织更清晰,扩展性更好。

四、第一个Colly爬虫程序

4.1 基本示例:Hello Crawler

让我们从一个简单的例子开始,了解Colly的基本用法:

package main

import (
	"fmt"
	"log"

	"github.com/gocolly/colly/v2"
)

func main() {
	// 创建一个新的收集器实例
	c := colly.NewCollector(
		// 设置用户代理,模拟浏览器
		colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"),
	)

	// 在请求发送前的回调
	c.OnRequest(func(r *colly.Request) {
		fmt.Println("正在访问:", r.URL)
	})

	// 在收到响应后的回调
	c.OnResponse(func(r *colly.Response) {
		fmt.Println("访问完成:", r.Request.URL)
		fmt.Println("响应大小:", len(r.Body), "字节")
	})

	// 在发生错误时的回调
	c.OnError(func(r *colly.Response, err error) {
		log.Println("访问出错:", r.Request.URL, "错误信息:", err)
	})

	// 使用CSS选择器提取HTML元素
	c.OnHTML("title", func(e *colly.HTMLElement) {
		fmt.Println("页面标题:", e.Text)
	})

	// 开始爬取
	c.Visit("https://go-colly.org/")
}

运行此代码,您将看到Colly访问官网并提取页面标题的过程。这个简单的例子展示了Colly的核心工作流程。

4.2 实战案例:爬取新闻网站

接下来,让我们创建一个更实用的例子——爬取新闻网站的文章列表:

package main

import (
	"encoding/json"
	"fmt"
	"os"
	"time"

	"github.com/gocolly/colly/v2"
)

// 定义新闻文章结构
type NewsItem struct {
	Title     string    `json:"title"`
	Link      string    `json:"link"`
	Summary   string    `json:"summary,omitempty"`
	Category  string    `json:"category,omitempty"`
	Timestamp time.Time `json:"timestamp,omitempty"`
}

func main() {
	// 创建新闻条目切片
	var newsItems []NewsItem

	// 初始化收集器
	c := colly.NewCollector(
		colly.AllowedDomains("news.example.com"), // 替换为您要爬取的网站
		colly.MaxDepth(1),                        // 只爬取入口页面
	)

	// 定义新闻条目选择器和解析逻辑
	c.OnHTML("article.news-item", func(e *colly.HTMLElement) {
		// 创建新闻项
		item := NewsItem{
			Title:    e.ChildText("h2.title"),
			Link:     e.ChildAttr("a.read-more", "href"),
			Summary:  e.ChildText("p.summary"),
			Category: e.ChildText("span.category"),
		}

		// 解析时间(示例格式)
		dateStr := e.ChildText("time.published")
		if dateStr != "" {
			// 根据网站的日期格式调整解析方式
			parsedTime, err := time.Parse("2006-01-02 15:04", dateStr)
			if err == nil {
				item.Timestamp = parsedTime
			}
		}

		// 追加到结果集
		newsItems = append(newsItems, item)
		fmt.Printf("发现新闻: %s\n", item.Title)
	})

	// 请求事件处理
	c.OnRequest(func(r *colly.Request) {
		fmt.Println("正在访问:", r.URL)
	})

	// 错误处理
	c.OnError(func(r *colly.Response, err error) {
		fmt.Println("请求错误:", r.Request.URL, "错误:", err)
	})

	// 开始爬取 (替换为目标新闻网站)
	c.Visit("https://news.example.com/latest")

	// 将结果保存为JSON文件
	file, err := os.Create("news.json")
	if err != nil {
		fmt.Println("创建文件失败:", err)
		return
	}
	defer file.Close()

	encoder := json.NewEncoder(file)
	encoder.SetIndent("", "  ") // 美化输出
	if err := encoder.Encode(newsItems); err != nil {
		fmt.Println("编码JSON失败:", err)
		return
	}

	fmt.Printf("爬取完成,共获取 %d 条新闻,已保存到 news.json\n", len(newsItems))
}

注意:上述代码中的 news.example.com 是一个示例域名,实际使用时需替换为您要爬取的真实新闻网站。同时,CSS选择器需要根据目标网站的HTML结构进行调整。

五、Colly回调函数详解

Colly的强大之处在于其事件驱动的回调系统,让我们详细了解各个回调函数的用途:

5.1 关键回调函数

回调函数触发时机常见用途
OnRequest发送HTTP请求前设置请求头、打印日志、修改请求参数
OnResponse收到HTTP响应后处理原始响应数据、检查状态码
OnHTML解析HTML元素时提取网页中特定元素的内容
OnXML解析XML元素时处理XML格式的响应
OnJSON解析JSON响应时处理JSON格式的API响应
OnError发生错误时错误处理和记录
OnScraped页面爬取完成后清理工作、统计信息收集

5.2 回调函数使用示例

// 创建收集器
c := colly.NewCollector()

// 在请求前设置请求头
c.OnRequest(func(r *colly.Request) {
    r.Headers.Set("X-Requested-With", "XMLHttpRequest")
    fmt.Println("正在访问:", r.URL.String())
})

// 检查响应状态
c.OnResponse(func(r *colly.Response) {
    fmt.Printf("已访问: %s (状态码: %d)\n", r.Request.URL, r.StatusCode)
    // 可以在这里保存响应内容
    // r.Save("response.html")
})

// 解析HTML内容
c.OnHTML("div.content", func(e *colly.HTMLElement) {
    // e.DOM 是一个 goquery.Selection 对象
    fmt.Println("找到内容:", e.Text)
    
    // 遍历子元素
    e.ForEach("p", func(_ int, el *colly.HTMLElement) {
        fmt.Println("段落:", el.Text)
    })
    
    // 获取属性
    imgSrc := e.ChildAttr("img", "src")
    fmt.Println("图片链接:", imgSrc)
})

// 处理错误
c.OnError(func(r *colly.Response, err error) {
    fmt.Printf("请求 %s 失败: %s\n", r.Request.URL, err)
})

// 页面爬取完成后执行
c.OnScraped(func(r *colly.Response) {
    fmt.Println("爬取完成:", r.Request.URL)
})

5.3 选择器语法

Colly的OnHTML方法使用CSS选择器语法来定位元素,这与jQuery非常相似:

  • article - 选择所有<article>元素
  • div.content - 选择class为"content"的div元素
  • #main - 选择id为"main"的元素
  • a[href] - 选择有href属性的所有链接
  • ul > li - 选择ul的直接子元素li
  • h1 + p - 选择紧跟在h1后面的p元素

六、爬虫限速与并发控制

6.1 为什么需要限速?

爬虫限速是一种负责任的爬取实践,有以下几个重要原因:

  1. 尊重服务器资源:避免对目标网站造成过大负载
  2. 规避反爬机制:过快的请求可能触发网站的反爬措施
  3. 遵守robots.txt:许多网站在robots.txt中规定了爬取频率
  4. 确保稳定性:控制请求速率可以提高爬虫的稳定性

6.2 Colly限速配置

Colly提供了简单的限速控制机制:

c := colly.NewCollector()

// 配置限速规则
c.Limit(&colly.LimitRule{
    // 匹配的域名
    DomainGlob: "*",
    // 并行请求数
    Parallelism: 2,
    // 请求间隔
    Delay: 5 * time.Second,
    // 随机化延迟,在设定值的50%-150%之间随机
    RandomDelay: 2 * time.Second,
})

// 对特定域名设置不同的规则
c.Limit(&colly.LimitRule{
    DomainGlob: "*.example.com",
    Parallelism: 1,
    Delay: 2 * time.Second,
})

6.3 并发爬取

对于大规模爬取,Colly支持异步并发模式:

c := colly.NewCollector(
    // 启用异步模式
    colly.Async(true),
)

// 设置并发限制
c.Limit(&colly.LimitRule{
    DomainGlob:  "*",
    Parallelism: 4, // 同时爬取4个页面
    Delay:       1 * time.Second,
})

// 添加多个URL
for i := 1; i <= 10; i++ {
    c.Visit(fmt.Sprintf("https://example.com/page/%d", i))
}

// 等待所有爬取任务完成
c.Wait()

提示:设置并发数时,需要平衡速度与资源消耗。过高的并发可能导致内存占用过大,甚至被目标网站封禁IP。

七、完整实例:新闻聚合爬虫

让我们结合前面学到的知识,开发一个更完整的新闻聚合爬虫,包含错误处理、限速和数据存储:

package main

import (
	"encoding/csv"
	"fmt"
	"os"
	"strings"
	"time"

	"github.com/gocolly/colly/v2"
)

// 新闻数据结构
type NewsArticle struct {
	Title     string
	URL       string
	Source    string
	Category  string
	PublishAt string
	Summary   string
}

func main() {
	// 创建CSV文件保存结果
	file, err := os.Create("news_data.csv")
	if err != nil {
		fmt.Println("创建CSV文件失败:", err)
		return
	}
	defer file.Close()

	// 设置CSV写入器
	writer := csv.NewWriter(file)
	defer writer.Flush()

	// 写入CSV表头
	writer.Write([]string{"标题", "链接", "来源", "分类", "发布时间", "摘要"})

	// 创建收集器
	c := colly.NewCollector(
		colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"),
		colly.MaxDepth(2),
	)

	// 设置限速
	c.Limit(&colly.LimitRule{
		DomainGlob:  "*",
		Parallelism: 2,
		Delay:       1 * time.Second,
		RandomDelay: 500 * time.Millisecond,
	})

	// 在HTML中查找新闻条目
	c.OnHTML("article.news-item", func(e *colly.HTMLElement) {
		article := NewsArticle{
			Title:     strings.TrimSpace(e.ChildText("h3.news-title")),
			URL:       e.ChildAttr("a.news-link", "href"),
			Source:    strings.TrimSpace(e.ChildText("span.source")),
			Category:  strings.TrimSpace(e.ChildText("span.category")),
			PublishAt: strings.TrimSpace(e.ChildText("time.publish-date")),
			Summary:   strings.TrimSpace(e.ChildText("p.summary")),
		}

		// 处理相对URL
		if !strings.HasPrefix(article.URL, "http") && article.URL != "" {
			article.URL = e.Request.AbsoluteURL(article.URL)
		}

		// 检查是否爬取到有效内容
		if article.Title != "" {
			fmt.Printf("发现新闻: %s\n", article.Title)
			// 保存到CSV
			writer.Write([]string{
				article.Title,
				article.URL,
				article.Source,
				article.Category,
				article.PublishAt,
				article.Summary,
			})
		}

		// 查找"阅读更多"链接,进入详情页
		detailURL := e.ChildAttr("a.read-more", "href")
		if detailURL != "" {
			detailURL = e.Request.AbsoluteURL(detailURL)
			c.Visit(detailURL)
		}
	})

	// 在详情页查找更多内容
	c.OnHTML("div.article-detail", func(e *colly.HTMLElement) {
		fmt.Println("访问详情页:", e.Request.URL)
		// 这里可以提取文章详细内容
	})

	// 查找分页链接
	c.OnHTML("a.pagination__next", func(e *colly.HTMLElement) {
		nextPage := e.Attr("href")
		if nextPage != "" {
			fmt.Println("发现下一页:", nextPage)
			c.Visit(e.Request.AbsoluteURL(nextPage))
		}
	})

	// 请求前处理
	c.OnRequest(func(r *colly.Request) {
		fmt.Println("正在访问:", r.URL.String())
	})

	// 响应处理
	c.OnResponse(func(r *colly.Response) {
		fmt.Printf("收到响应: %s (状态码: %d)\n", r.Request.URL, r.StatusCode)
	})

	// 错误处理
	c.OnError(func(r *colly.Response, err error) {
		fmt.Printf("请求失败 %s: %v\n", r.Request.URL, err)
		// 如果是服务器错误,可以尝试重试
		if r.StatusCode >= 500 && r.StatusCode < 600 {
			fmt.Println("服务器错误,将在稍后重试...")
			retryURL := r.Request.URL.String()
			time.Sleep(5 * time.Second)
			c.Visit(retryURL)
		}
	})

	// 开始爬取,记得替换为实际要爬取的新闻网站
	c.Visit("https://news.example.com")

	fmt.Println("爬取完成,结果已保存到 news_data.csv")
}

注意:以上代码需要根据实际爬取的网站调整CSS选择器。运行前,请替换news.example.com为实际目标网站。

📝 练习与思考

为了巩固所学内容,建议尝试以下练习:

  1. 练习1:修改本文中的示例代码,使其能够爬取一个真实的新闻网站(如优快云首页或其他开放的新闻网站)。记得遵守网站的robots.txt规则。

  2. 练习2:扩展爬虫功能,增加提取新闻图片URL的能力,并将图片下载到本地。

  3. 思考题:如果目标网站有反爬机制(如频繁变化的CSS类名),您会如何调整爬虫代码以提高稳定性?

💡 小结

在本文中,我们学习了:

  1. 网络爬虫的基本概念、工作原理及伦理法律考量
  2. Go语言作为爬虫开发语言的优势
  3. Colly框架的安装和基础架构
  4. 如何使用Colly的回调函数处理爬虫各个环节
  5. 爬虫的限速与并发控制技术
  6. 通过实战案例,创建了一个完整的新闻聚合爬虫

掌握这些基础知识后,您已经能够开发简单但功能完备的Go爬虫程序。网络爬虫是一个强大的数据获取工具,但请记住:技术能力越大,责任越大。在开发爬虫时,请始终遵守法律法规和道德准则,尊重网站所有者和用户的权益。

下篇预告

在下一篇文章中,我们将深入探讨HTML解析与Goquery技术详解,学习如何更高效地从复杂HTML页面中精确提取数据,掌握CSS选择器的高级用法,以及处理各种特殊情况的技巧。敬请期待!


👨‍💻 关于作者与Gopher部落

"Gopher部落"专注于Go语言技术分享,提供从入门到精通的完整学习路线。

🌟 为什么关注我们?

  1. 系统化学习路径:本系列12篇文章循序渐进,带你完整掌握Go爬虫开发
  2. 实战驱动教学:理论结合实践,每篇文章都有可操作的代码示例
  3. 持续更新内容:定期分享最新Go生态技术动态与大厂实践经验
  4. 专业技术社区:加入我们的技术交流群,与众多Go开发者共同成长

📱 关注方式

  1. 微信公众号:搜索 “Gopher部落” 或 “GopherTribe”
  2. 优快云专栏:点击页面右上角"关注"按钮

💡 读者福利

关注公众号回复 “Go爬虫” 即可获取:

  • 完整Go爬虫学习资料
  • 本系列示例代码
  • 项目实战源码

期待与您在Go语言的学习旅程中共同成长!

Go 优雅的爬虫框架 - Colly Colly 是一款用 Go 语言编写的优雅网络爬虫框架,速度快、灵活且易于使用配置可以写在里面,也可以写在外面。 阅读详情

相关推荐

2024年Go最全Go分布式爬虫(二十四)_go语言实现分布式爬虫pdf,终局之战

输出方法。

2401_84919754的博客 1004

Go 爬虫三种框架的基本使用介绍

Colly 是一个简单而又强大的 Go 爬虫框架,其使用起来非常方便。在 Colly 中,我们可以通过注册回调函数来处理页面中的数据,同时还可以使用 CSS 选择器进行页面元素的定位。Colly 还支持异步请求、代理、Cookie 管理等功能,是一个非常实用的爬虫框架。我们已经成功地使用Go语言的http包和goquery包创建了一个简单的网页爬虫。我们首先使用http包发起了GET请求,接下来使用ioutil包读取响应体的内容,并使用goquery包解析了HTML代码。

m0_64288219的博客 4892

GO语言基础教程(252)go-colly框架之go-colly框架的实现过程:Go语言爬虫实战:如何用go-colly优雅地“挖数据”?

Go语言的go-colly框架是一个快速且优雅的爬虫工具,单核每秒可发起超过1K请求,采用回调函数机制简化爬虫开发。本文深度解析colly的实现原理,从Collector对象的核心结构到五大回调函数的执行流程。通过完整实战示例,展示如何配置并发控制、请求延迟和Robots协议遵守等关键特性,帮助开发者快速构建高效可靠的网络爬虫,解决大规模数据抓取的常见难题。

jxf_jxfcsdn的博客 668

网络爬虫——GO

这里写目录标题go-colly网络爬虫框架goquery HTML解析goquery主要的结构怎么使用goquery常用选择器 go-colly网络爬虫框架 go-colly是用Go实现的网络爬虫框架。go-colly快速优雅,在单核上每秒可以发起1K以上请求;以回调函数的形式提供了一组接口,可以实现任意类型的爬虫。 Colly 特性: 清晰的API 快速(单个内核上的请求数大于1k) 管理每个域的请求延迟和最大并发数 自动cookie 和会话处理 同步/异步/并行抓取 高速缓存 自动处理非Unicode

weixin_52001449的博客 7030

Golang Colly批量爬取小红书图片

Golang colly 小红书

frinder的专栏 1483

go爬虫框架-colly实战(三)--全景卡通图片抓取下载

原文连接:Hzy 博客 今天尝试来利用colly抓取一个图片网站并下载下来,还是挺好玩的。 接下来直接上代码了。 完整代码可以在我的github上,会一直更新一些学习go遇到的一些小问题,写一些小示例! github 注意: 需要添加cookies,否则会拒绝访问。 一次请求好像最多就200个图片,及时参数调的在大也没有用,所以只好循环了。 逻辑,使用一个收集器,抓取页面,在利用另一个收...

hzeyuan.cn 1874

Golang 网络爬虫框架gocolly/colly 四

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,...

0x8g1T9E- 6124

DrMOS电路仿真

将驱动电路与功率MOS集成化后既是DrMOS。把驱动芯片以及上下桥MOSFET封装在一起,这样每一相供电就有了单独的驱动芯片,并且这种高度整合的MOSFET可以通过更高的电流、发热比传统的MOSFET也小很多且更节能 自举升压同步BUCK高低侧栅驱动电路原理及仿真 ...

Srambler的博客 5038

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、...

稻草人技术博客 1899

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4941

RK3568 NFS rootfs配置与调试实战指南(已验证)

本文提供了在RK3568开发板上配置NFS rootfs的完整实战指南。通过详细步骤讲解如何配置uboot的bootargs参数、编译支持NFS的内核,并在PC端搭建TFTP与NFS服务器,最终实现从网络挂载根文件系统,从而极大提升驱动调试和应用程序开发的迭代效率。

weixin_29175469的博客 281

Golang 网络爬虫框架gocolly/colly 五 获取动态数据

Golang 网络爬虫框架gocolly/colly 五 获取动态数据 gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种,一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高;二,利用正则表达式,要提取...

weixin_30872499的博客 1298

C# WinForm项目目录结构详解:从入门到精通(附常见问题解决方案)

本文详细解析了C# WinForm项目目录结构,从解决方案与项目基础结构到核心文件功能,再到关键目录解析,帮助开发者快速掌握WinForm项目组织方式。文章还提供了常见问题解决方案,如引用丢失、配置文件不生效等,是WinForm开发从入门到精通的实用指南。

dream的博客 647

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使...

稻草人技术博客 2565

C# 与欧姆龙 PLC 实战:通过 Ethernet/IP 协议进行设备控制与监控

本文介绍了如何通过C#和Ethernet/IP协议实现与欧姆龙PLC的通信。Ethernet/IP是基于以太网的工业协议,适用于工业设备间的实时数据交换。文章详细讲解了使用EthernetIPSharp库建立连接、读写数据的步骤,并提供了示例代码。此外,还探讨了实时监控、报警系统等高级功能,为工业自动化控制系统开发提供了实用指导。该方法简化了PLC通信开发,提高了系统可靠性和智能化程度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 811

rosbag分析传感器数据的时间同步情况方法

ROS传感器时间同步分析流程:通过rosbaginfo初步检查bag文件信息,使用rqt_bag可视化时间线分布,采用rostopicecho或Python脚本提取各传感器时间戳并计算时间差统计值(均值/最大差/标准差),最后分析接收与采样时间延迟。量化评估同步精度,识别固定偏移或随机抖动问题,确保多传感器数据对齐,为后续融合处理提供可靠数据基础。

start_up_go的博客 201

1、Go爬虫(http、goquery和colly)

go语言使用net/http、goquery和colly框架实现爬虫

m0_73293551的博客 1270

RK3576 USB3.0 DWC3控制器调试:PHY初始化失败排查指南

DWC3 是 Synopsys 公司推出的 USB3.0/3.1 控制器 IP,支持双角色(DRD)模式,可配置为 Host、Device 或 OTG。

小灰灰的博客 1175

go语言爬虫比python高_写爬虫还在用 python?快来试试 go 语言的爬虫框架吧

今天为大家介绍的是一款 go 语言爬虫框架 -- colly。01 开始首先,你可以使用一下命令安装 colly。goget-ugithub.com/gocolly/colly/...其次,构建 Collector,添加事件,然后访问:packagemainimport("fmt""github.com/gocolly/colly")funcmain(){//...

weixin_42297665的博客 745

【入门AUTOSAR网络管理测试】CANoe测试T_WakeUp时间

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中T_WakeUp时间如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 2135

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

金融数据爬取终极指南:使用Colly框架进行股票市场分析

Colly是Golang生态中一款优雅的网页爬取与数据采集框架,专为高效提取结构化信息设计。对于股票市场分析、金融数据监控等场景,Colly提供了简洁API与强大功能,帮助开发者快速构建稳定的数据采集系统。 ## 为什么选择Colly进行金融数据爬取? 金融数据采集面临三大核心挑战:网站反爬机制、数据实时性要求、多源数据整合。Colly框架通过以下特性完美应对这些挑战: - **轻量级高性能

gitblog_00787的博客 341

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Go爬虫colly官方示例三【cryptocoinmarketcap】- 爬取加密数字货币最新市值

文章目录示例介绍示例介绍备注输出 转载请标明出处: http://blog.youkuaiyun.com/qq_27818541/article/details/111936648 本文出自:【BigManing的博客】 示例介绍 首先访问入口主URL 提取课程分类URL 访问课程分类URL ,获取课程详情信息 示例介绍 package main import ( "encoding/csv" "log" "os" "github.com/gocolly/colly/v2" ) func main

BigManing的博客 1454

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

c++ skia 判断jpg图片是完整的_go爬虫框架-colly实战(三)--全景卡通图片抓取下载

原文连接:Hzy 博客今天尝试来利用colly抓取一个图片网站并下载下来,还是挺好玩的。 接下来直接上代码了。 完整代码可以在我的github上. 会一直更新一些学习go遇到的一些小问题,还有写一些小demo!github注意:需要添加cookies,否则会拒绝访问。一次请求好像最多就200个图片,及时参数调的在大也没有用,所以只好循环了。 逻辑,使用一个收集器,抓取页面,在利用另一个收集器来,...

weixin_36338765的博客 158

Go爬虫colly官方示例十三【openedx_courses】- 抓取开放课程信息

文章目录示例介绍示例代码涉及到的标签输出 转载请标明出处: http://blog.youkuaiyun.com/qq_27818541/article/details/112489172 本文出自:【BigManing的博客】 示例介绍 访问课程主页 爬取url,只访问/courses/ 开头的page 获取课程详情页面,根据div锁定目标对象,组装数据 示例代码 package main import ( "encoding/json" "fmt" "strings" "time" "gith

BigManing的博客 553
上一篇: 【Go语言学习系列24】函数式编程在Go中的应用
下一篇: 【Go语言爬虫系列02】HTML解析与Goquery技术详解
Gopher部落
博客等级 码龄2年 784粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gopher部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值