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

【数据基础】— 基于Go1.19的站点模板爬虫的实现

目录

1. 定义目标站点

2. 使用Go的库

3. 发送HTTP请求

4. 解析HTML并提取数据

5. 存储数据

6. 并发处理

示例代码


基于Go 1.19的站点模板爬虫实现通常涉及几个关键步骤:定义目标站点、解析HTML页面、提取所需数据、存储数据以及可能的并发处理。下面我将详细描述这些步骤,并提供一个简化的示例代码。

1. 定义目标站点

首先,你需要明确你想要爬取的网站及其页面结构。这包括URL、页面中的元素(如类名、ID等),以及你希望提取的数据类型(如文本、链接、图片等)。

2. 使用Go的库

在Go中,net/http 包用于发送HTTP请求,golang.org/x/net/html(或者更常见的,第三方库如goquery,它基于golang.org/x/net/html但提供了更方便的jQuery风格的API)用于解析HTML。

3. 发送HTTP请求

使用net/http客户端发送GET请求到目标URL,并获取响应体。

4. 解析HTML并提取数据

使用goquery(或其他HTML解析库)来解析HTML内容,并使用CSS选择器定位并提取所需的数据。

5. 存储数据

将提取的数据存储到文件、数据库或内存中,具体取决于你的需求。

6. 并发处理

为了加速爬虫的速度,你可以使用Go的并发特性(goroutines和channels)来并行处理多个页面或任务。

示例代码

以下是一个简单的Go爬虫示例,使用goquery来爬取网页标题:

安装goquery

go get github.com/PuerkitoBio/goquery

爬取指定URL的网页,并提取其标题和所有链接:

//  爬取指定URL的网页,并提取其标题和所有链接
package main  import (  "fmt"  "io/ioutil"  "log"  "net/http"  "strings"  "sync"  "github.com/PuerkitoBio/goquery"  
)  // fetchHTML 发送HTTP GET请求并返回HTML内容  
func fetchHTML(url string) (string, error) {  resp, err := http.Get(url)  if err != nil {  return "", err  }  defer resp.Body.Close()  if resp.StatusCode != http.StatusOK {  return "", fmt.Errorf("HTTP error: %d", resp.StatusCode)  }  body, err := ioutil.ReadAll(resp.Body)  if err != nil {  return "", err  }  return string(body), nil  
}  // parsePage 解析HTML页面并提取标题和链接  
func parsePage(html string) (string, []string, error) {  doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))  if err != nil {  return "", nil, err  }  title := doc.Find("title").Text()  links := []string{}  doc.Find("a").Each(func(i int, s *goquery.Selection) {  href, exists := s.Attr("href")  if exists {  links = append(links, href)  }  })  return title, links, nil  
}  // crawlSite 爬取单个站点的函数  
func crawlSite(url string, wg *sync.WaitGroup) {  defer wg.Done()  html, err := fetchHTML(url)  if err != nil {  log.Printf("Error fetching URL %s: %v", url, err)  return  }  title, links, err := parsePage(html)  if err != nil {  log.Printf("Error parsing HTML for URL %s: %v", url, err)  return  }  fmt.Printf("Title: %s\n", title)  for _, link := range links {  fmt.Printf("  - Link: %s\n", link)  }  
}  func main() {  var wg sync.WaitGroup  // 假设我们只想爬取一个站点  url := "http://example.com"  wg.Add(1)  go crawlSite(url, &wg)  wg.Wait() // 等待所有goroutine完成  
}  // 注意:如果你想要爬取多个站点或页面,你可以在main函数中为每个站点或页面启动一个新的goroutine,  
// 并适当地调整wg.Add和wg.Wait的调用。

在这个示例中,fetchHTML 函数负责发送HTTP GET请求并返回HTML内容。parsePage 函数使用goquery库来解析HTML并提取标题和所有链接。crawlSite 函数是一个goroutine-safe的函数,用于爬取单个站点的数据。在main函数中,我们为要爬取的站点启动了一个goroutine,并等待它完成。

请注意,这个示例仅展示了如何爬取单个站点的数据。如果你想要爬取多个站点或页面,你可以修改main函数,为每个站点或页面启动一个新的goroutine,并适当管理sync.WaitGroup以确保主goroutine在所有爬取任务完成后才退出。

此外,还需要注意遵守目标网站的robots.txt规则,以及合理设置HTTP请求头(如User-Agent)以避免被网站封禁。在实际应用中,你可能还需要处理重定向、cookies、JavaScript渲染的页面等复杂情况。

http://www.lryc.cn/news/395668.html

相关文章:

  • Angular进阶之九: JS code coverage是如何运作的
  • el-table 鼠标移入更改悬停背景颜色
  • 【《无主之地3》风格角色渲染在Unity URP下的实现_角色渲染(第四篇) 】
  • 【linux服务器篇】-Redis-RDM远程连接redis
  • 【pytorch15】链式法则
  • C#用链表和数组分别实现堆栈
  • 【AI原理解析】—强化学习(RL)原理
  • java解析请求的字符串参数Content-Disposition: form-data;和拼接的键值对
  • 活动回顾|2024 MongoDB Developer Day圆满收官!
  • MySQL资源组的使用方法
  • python--实验7 函数(1)
  • 【力扣】数组中的第K个最大元素
  • WTM的项目中EFCore如何适配人大金仓数据库
  • 互联网3.0时代的变革者:华贝甄选大模型创新之道
  • Tomcat的安全配置
  • [笔记] 卷积 - 01 变速箱需要放置多少个加速度传感器?
  • Maya崩溃闪退常见原因及解决方案
  • 编码与梦想:我的CSDN创作5周年
  • Vue2 基础十Vuex
  • 【大模型】驾驭未知领域:LLM如何处理域外或无意义的提示
  • Docker容器 为MySQL创建新用户和授权
  • openssh9.8p1更新 修复漏洞(CVE-2024-6387)
  • 超市收银系统源码
  • word 使用手册
  • vue学习day03-指令修饰符、v-bind对于样式控制的增强、v-model应用于其他表单元素
  • JRE、JVM、JDK分别是什么。
  • 台灯护眼是真的吗?台灯怎么选对眼睛好?一文带你读懂!
  • 【学术会议征稿】第五届计算机工程与智能控制学术会议(ICCEIC 2024)
  • 【Golang】slice切片
  • 开源网安模糊测试平台SFuzz全新升级,从标准到实践助力车企安全出海