当前位置:   article > 正文

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

【数据基础】— 基于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的网页,并提取其标题和所有链接:

  1. // 爬取指定URL的网页,并提取其标题和所有链接
  2. package main
  3. import (
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "strings"
  9. "sync"
  10. "github.com/PuerkitoBio/goquery"
  11. )
  12. // fetchHTML 发送HTTP GET请求并返回HTML内容
  13. func fetchHTML(url string) (string, error) {
  14. resp, err := http.Get(url)
  15. if err != nil {
  16. return "", err
  17. }
  18. defer resp.Body.Close()
  19. if resp.StatusCode != http.StatusOK {
  20. return "", fmt.Errorf("HTTP error: %d", resp.StatusCode)
  21. }
  22. body, err := ioutil.ReadAll(resp.Body)
  23. if err != nil {
  24. return "", err
  25. }
  26. return string(body), nil
  27. }
  28. // parsePage 解析HTML页面并提取标题和链接
  29. func parsePage(html string) (string, []string, error) {
  30. doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
  31. if err != nil {
  32. return "", nil, err
  33. }
  34. title := doc.Find("title").Text()
  35. links := []string{}
  36. doc.Find("a").Each(func(i int, s *goquery.Selection) {
  37. href, exists := s.Attr("href")
  38. if exists {
  39. links = append(links, href)
  40. }
  41. })
  42. return title, links, nil
  43. }
  44. // crawlSite 爬取单个站点的函数
  45. func crawlSite(url string, wg *sync.WaitGroup) {
  46. defer wg.Done()
  47. html, err := fetchHTML(url)
  48. if err != nil {
  49. log.Printf("Error fetching URL %s: %v", url, err)
  50. return
  51. }
  52. title, links, err := parsePage(html)
  53. if err != nil {
  54. log.Printf("Error parsing HTML for URL %s: %v", url, err)
  55. return
  56. }
  57. fmt.Printf("Title: %s\n", title)
  58. for _, link := range links {
  59. fmt.Printf(" - Link: %s\n", link)
  60. }
  61. }
  62. func main() {
  63. var wg sync.WaitGroup
  64. // 假设我们只想爬取一个站点
  65. url := "http://example.com"
  66. wg.Add(1)
  67. go crawlSite(url, &wg)
  68. wg.Wait() // 等待所有goroutine完成
  69. }
  70. // 注意:如果你想要爬取多个站点或页面,你可以在main函数中为每个站点或页面启动一个新的goroutine,
  71. // 并适当地调整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渲染的页面等复杂情况。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/811438
推荐阅读
相关标签
  

闽ICP备14008679号