当前位置: 首页 > news >正文

基于 Go1.19 的站点模板爬虫:构建与实战

引言

随着互联网的发展,网络爬虫已成为数据抓取和分析的重要工具。Go(Golang)语言凭借其高效、简洁的特性,成为构建爬虫的热门选择之一。本文将引导你使用 Go1.19 版本,构建一个基于站点模板的网页爬虫,以抓取指定网站的结构化数据。

环境准备

确保你的开发环境已安装 Go1.19 或更高版本。可以通过以下命令检查 Go 的版本:

Bash

深色版本

1go version

如果尚未安装 Go,可以从官方网站(https://golang.org/dl/)下载并按照指示进行安装。

工程结构

为了组织代码和资源,我们首先创建项目目录结构:

深色版本

1.
2├── cmd
3│   └── crawler.go
4├── internal
5│   ├── scraper
6│   │   └── scraper.go
7│   └── templates
8│       └── site.tmpl
9└── go.mod

cmd 目录下的 crawler.go 用于启动爬虫。internal/scraper 包含爬虫的核心逻辑,internal/templates 存放站点模板。

依赖管理

在项目根目录下创建或更新 go.mod 文件,添加所需的依赖包:

Go

深色版本

1module github.com/yourusername/gocrawler
2
3go 1.19
4
5require (
6    golang.org/x/net v0.0.0-20230511212614-fa735b7d40e0
7    gopkg.in/yaml.v3 v3.0.1
8)

然后运行以下命令以下载并安装依赖:

Bash

深色版本

1go mod download

爬虫核心逻辑

解析模板

internal/scraper/scraper.go 中,我们需要定义一个函数来解析站点模板,提取出需要爬取的数据点:

Go

深色版本

1package scraper
2
3import (
4	"fmt"
5	"html/template"
6	"io/ioutil"
7	"net/http"
8	"strings"
9
10	"gopkg.in/yaml.v3"
11)
12
13type SiteTemplate struct {
14	URL   string            `yaml:"url"`
15	Query map[string]string `yaml:"query"`
16}
17
18func LoadSiteTemplate(filename string) (*SiteTemplate, error) {
19	data, err := ioutil.ReadFile(filename)
20	if err != nil {
21		return nil, err
22	}
23
24	var templateConfig SiteTemplate
25	err = yaml.Unmarshal(data, &templateConfig)
26	if err != nil {
27		return nil, err
28	}
29
30	return &templateConfig, nil
31}
32
33func FetchAndParse(url string, query map[string]string) (string, error) {
34	client := &http.Client{}
35	req, err := http.NewRequest("GET", url, nil)
36	if err != nil {
37		return "", err
38	}
39
40	for k, v := range query {
41		req.URL.RawQuery = strings.Join([]string{req.URL.RawQuery, fmt.Sprintf("%s=%s", k, v)}, "&")
42	}
43
44	resp, err := client.Do(req)
45	if err != nil {
46		return "", err
47	}
48	defer resp.Body.Close()
49
50	bodyBytes, err := ioutil.ReadAll(resp.Body)
51	if err != nil {
52		return "", err
53	}
54
55	return string(bodyBytes), nil
56}
57
58func ParsePage(htmlContent string, template *template.Template) (map[string]interface{}, error) {
59	var data = make(map[string]interface{})
60	err := template.Execute(funcMap, htmlContent, &data)
61	if err != nil {
62		return nil, err
63	}
64
65	return data, nil
66}

爬虫启动器

cmd/crawler.go 中,我们将定义爬虫的入口函数:

Go

深色版本

1package main
2
3import (
4	"log"
5	"os"
6
7	"github.com/yourusername/gocrawler/internal/scraper"
8)
9
10func main() {
11	templatePath := "./internal/templates/site.tmpl"
12	siteTemplate, err := scraper.LoadSiteTemplate(templatePath)
13	if err != nil {
14		log.Fatalf("Error loading template: %v", err)
15	}
16
17	tmpl, err := template.ParseFiles(templatePath)
18	if err != nil {
19		log.Fatalf("Error parsing template: %v", err)
20	}
21
22	htmlContent, err := scraper.FetchAndParse(siteTemplate.URL, siteTemplate.Query)
23	if err != nil {
24		log.Fatalf("Error fetching page: %v", err)
25	}
26
27	parsedData, err := scraper.ParsePage(htmlContent, tmpl)
28	if err != nil {
29		log.Fatalf("Error parsing page: %v", err)
30	}
31
32	log.Printf("Parsed Data: %+v", parsedData)
33}

定义站点模板

internal/templates/site.tmpl 文件中,定义你的站点模板,使用 HTML 模板语法和 {{ . }} 占位符来提取数据:

Html

深色版本

1<!-- Example template -->
2<html>
3<head>
4<title>{{ .Title }}</title>
5</head>
6<body>
7<h1>Welcome to {{ .SiteName }}</h1>
8<ul>
9{{ range .Posts }}
10<li><a href="{{ .URL }}">{{ .Title }}</a></li>
11{{ end }}
12</ul>
13</body>
14</html>

运行爬虫

最后,从项目根目录运行爬虫:

Bash

深色版本

1go run ./cmd/crawler.go

结论

本文介绍了如何使用 Go1.19 构建一个基于站点模板的网页爬虫。通过定义模板和解析规则,我们可以灵活地抓取不同网站的数据。虽然示例中仅展示了基本的爬虫框架,但你可以在此基础上扩展更多功能,如错误处理、日志记录、并发控制等,以满足更复杂的需求。希望这篇文章能为你的爬虫开发之旅提供有益的启示!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • IDEA的常见代码模板的使用
  • 数据仓库的一致性维度
  • 如何在 Mac 上下载安装植物大战僵尸杂交版? 最新版本 2.2 详细安装运行教程问题详解
  • AWS服务器购买:如何选择合适的AWS云服务器
  • 大语言模型-检索测评指标
  • Docker 修改默认镜像的存储位置
  • 【考研数学】线代满分经验分享+备考复盘
  • 【Qt】事件处理
  • 图论建模技巧搜集
  • Matlab学习笔记1
  • 扩容升级丨极海正式推出G32A1465系列汽车通用MCU,驱动智驾再进阶
  • 【转盘案例-弹框-修改Bug-完成 Objective-C语言】
  • 【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算
  • arm 内联汇编基础
  • 如何在Linux上部署Ruby on Rails应用程序
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • AngularJS指令开发(1)——参数详解
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • es6(二):字符串的扩展
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • LeetCode29.两数相除 JavaScript
  • Nodejs和JavaWeb协助开发
  • Python_OOP
  • ReactNativeweexDeviceOne对比
  • SwizzleMethod 黑魔法
  • ubuntu 下nginx安装 并支持https协议
  • 从重复到重用
  • 仿天猫超市收藏抛物线动画工具库
  • 基于游标的分页接口实现
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 线性表及其算法(java实现)
  • 学习笔记:对象,原型和继承(1)
  • 原生js练习题---第五课
  • ionic入门之数据绑定显示-1
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 透过事物看本质的能力怎么培养?
  • #数据结构 笔记三
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)(1.13) SiK无线电高级配置(五)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (day 12)JavaScript学习笔记(数组3)
  • (pojstep1.3.1)1017(构造法模拟)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (安卓)跳转应用市场APP详情页的方式
  • (差分)胡桃爱原石
  • (九)c52学习之旅-定时器
  • (算法)硬币问题
  • (一)Thymeleaf用法——Thymeleaf简介
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • ***检测工具之RKHunter AIDE
  • .NET CORE 第一节 创建基本的 asp.net core