基于Go1.19的站点模板爬虫

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

基于Go1.19的站点模板爬虫

引言

在互联网迅猛发展的今天,数据变得愈发重要。无论是市场分析、竞争情报收集,还是内容聚合,数据爬取都是获取信息的关键手段。作为一门高效、并发能力强的编程语言,Go(Golang)在实现网络爬虫方面表现优异。本文将基于Go1.19详细讲解如何构建一个站点模板爬虫,帮助开发者高效地从网站上提取所需的数据。

Go语言简介

Go语言由Google开发,于2009年正式发布。它是一门静态类型的编程语言,具有垃圾回收功能、内存安全、并发编程支持等特性。Go的语法简洁,运行效率高,特别适用于网络编程和并发编程。

爬虫基本概念

在进入代码实现之前,我们先了解一些基本概念:

  1. 爬虫:自动化程序,用于访问网站并提取数据。
  2. 爬取目标:需要从中提取数据的网站或网页。
  3. 解析器:用于解析网页内容的工具或代码。
  4. 数据存储:将提取的数据存储到数据库或文件中。
环境准备

在开始编写代码之前,确保你的开发环境已经安装了Go1.19。如果还没有安装,可以从Go的官方网站下载并安装最新版本。

创建项目

首先,我们创建一个新的Go项目。打开终端并执行以下命令:

mkdir site_template_crawler
cd site_template_crawler
go mod init site_template_crawler

这将创建一个新的Go模块,并初始化项目目录。

安装依赖

我们将使用以下两个Go库来构建爬虫:

  1. Colly:一个强大的Go爬虫框架。
  2. Goquery:一个用来解析HTML的库,语法类似于jQuery。

安装它们:

go get -u github.com/gocolly/colly/v2
go get -u github.com/PuerkitoBio/goquery
编写爬虫代码

现在我们编写爬虫代码。创建一个名为main.go的文件,并添加以下内容:

package main

import (
    "fmt"
    "log"

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

// 定义站点模板
type SiteTemplate struct {
    URL         string
    Title       string
    Description string
    Keywords    []string
}

func main() {
    // 初始化爬虫
    c := colly.NewCollector()

    // 在每次访问网页时调用
    c.OnHTML("html", func(e *colly.HTMLElement) {
        template := SiteTemplate{
            URL: e.Request.URL.String(),
            Title: e.DOM.Find("title").Text(),
            Description: e.DOM.Find("meta[name='description']").AttrOr("content", "No description"),
            Keywords: []string{},
        }

        e.DOM.Find("meta[name='keywords']").Each(func(index int, item *goquery.Selection) {
            content := item.AttrOr("content", "")
            if content != "" {
                template.Keywords = append(template.Keywords, content)
            }
        })

        fmt.Printf("Crawled URL: %s\n", template.URL)
        fmt.Printf("Title: %s\n", template.Title)
        fmt.Printf("Description: %s\n", template.Description)
        fmt.Printf("Keywords: %v\n", template.Keywords)
    })

    // 错误处理
    c.OnError(func(r *colly.Response, err error) {
        log.Printf("Request URL: %v failed with response: %v\nError: %v", r.Request.URL, r, err)
    })

    // 设置起始点
    startURL := "http://example.com"
    c.Visit(startURL)
}

在这里插入图片描述

解析站点模板

在上面的代码中,我们定义了一个SiteTemplate结构体来存储从网页中提取的数据。通过colly.NewCollector()创建一个新的爬虫实例,并在每次访问网页时使用c.OnHTML来解析网页内容。

提取数据

我们使用Goquery库来提取网页中的特定元素,例如title标签和meta标签中的内容。通过e.DOM.Find方法,我们可以选择需要的HTML元素,并获取其属性值。

运行爬虫

保存文件并在终端中运行以下命令来启动爬虫:

go run main.go

如果一切顺利,你将看到爬虫从指定的URL中提取并打印出网页的标题、描述和关键词。

数据存储

通常,我们不会只将数据打印到控制台,而是需要将其存储到数据库或文件中。这里,我们简单介绍如何将数据存储到JSON文件中。

main.go文件中添加以下导入:

import (
    "encoding/json"
    "os"
)

然后修改main.go文件中的c.OnHTML回调函数:

// 定义爬取结果存储的文件
outputFile, err := os.Create("output.json")
if err != nil {
    log.Fatalf("Failed to create output file: %v", err)
}
defer outputFile.Close()

encoder := json.NewEncoder(outputFile)
encoder.SetIndent("", "  ")

c.OnHTML("html", func(e *colly.HTMLElement) {
    template := SiteTemplate{
        URL: e.Request.URL.String(),
        Title: e.DOM.Find("title").Text(),
        Description: e.DOM.Find("meta[name='description']").AttrOr("content", "No description"),
        Keywords: []string{},
    }

    e.DOM.Find("meta[name='keywords']").Each(func(index int, item *goquery.Selection) {
        content := item.AttrOr("content", "")
        if content != "" {
            template.Keywords = append(template.Keywords, content)
        }
    })

    fmt.Printf("Crawled URL: %s\n", template.URL)
    fmt.Printf("Title: %s\n", template.Title)
    fmt.Printf("Description: %s\n", template.Description)
    fmt.Printf("Keywords: %v\n", template.Keywords)

    // 将数据写入文件
    if err := encoder.Encode(template); err != nil {
        log.Printf("Failed to write data to file: %v", err)
    }
})

在这里插入图片描述

处理并发请求

为了提高爬取效率,我们可以利用Colly的并发支持。只需简单设置最大并发请求数:

c.Limit(&colly.LimitRule{
    DomainGlob:  "*",
    Parallelism: 5,
})

通过这种方式,我们可以同时发起多个请求,加快数据爬取的速度。

总结

本文详细介绍了如何使用Go1.19构建一个站点模板爬虫,包括环境准备、依赖安装、代码编写、数据提取和存储。通过这一教程,读者可以掌握基本的Go爬虫开发技巧,并应用于实际项目中。Go语言的高效性和并发能力使其成为开发网络爬虫的理想选择,特别是对于大规模数据爬取任务。

希望本文对你有所帮助。如果你对爬虫开发有任何问题或建议,欢迎在评论区讨论。

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农阿豪@新空间代码工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值