赞
踩
目录
基于Go 1.19的站点模板爬虫实现通常涉及几个关键步骤:定义目标站点、解析HTML页面、提取所需数据、存储数据以及可能的并发处理。下面我将详细描述这些步骤,并提供一个简化的示例代码。
首先,你需要明确你想要爬取的网站及其页面结构。这包括URL、页面中的元素(如类名、ID等),以及你希望提取的数据类型(如文本、链接、图片等)。
在Go中,net/http
包用于发送HTTP请求,golang.org/x/net/html
(或者更常见的,第三方库如goquery
,它基于golang.org/x/net/html
但提供了更方便的jQuery风格的API)用于解析HTML。
使用net/http
客户端发送GET请求到目标URL,并获取响应体。
使用goquery
(或其他HTML解析库)来解析HTML内容,并使用CSS选择器定位并提取所需的数据。
将提取的数据存储到文件、数据库或内存中,具体取决于你的需求。
为了加速爬虫的速度,你可以使用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渲染的页面等复杂情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。