使用Go语言编写简单爬虫程序

步骤1:导入必要的包

首先,你需要导入以下包:

  • net/http: 用于发送HTTP请求。
  • io : 用于读取响应内容(在Go 1.16及后续版本中,使用io.ReadAll代替ioutil.ReadAll)。
  • regexp: 用于正则表达式匹配(如果需要从HTML中提取特定信息)。
  • fmt: 用于打印输出。
go 复制代码
import (
    "fmt"
    "io"
    "log"
    "net/http"
    "regexp"
)

步骤2:定义函数获取网页源码

创建一个函数来发送GET请求并获取网页源码:

go 复制代码
func fetch(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    return string(body), nil
}

示例:设置User-Agent头

部分网站可能会根据User-Agent头来限制爬虫访问。可以通过设置http.Client的请求头来模拟浏览器的User-Agent:

go 复制代码
func fetchWithUserAgent(url string) (string, error) {
    client := &http.Client{}
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return "", err
    }
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")

    resp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    return string(body), nil
}

步骤3:解析HTML内容

如果你需要从HTML中提取特定信息,可以使用正则表达式。例如,提取所有链接:

go 复制代码
func extractLinks(html string) []string {
    re := regexp.MustCompile(`href="([^"]+)"`)
    matches := re.FindAllStringSubmatch(html, -1)
    var links []string
    for _, match := range matches {
        links = append(links, match[1])
    }
    return links
}

示例:提取所有图片URL

你也可以使用正则表达式提取所有图片URL:

go 复制代码
func extractImages(html string) []string {
    re := regexp.MustCompile(`src="([^"]+)"`)
    matches := re.FindAllStringSubmatch(html, -1)
    var images []string
    for _, match := range matches {
        images = append(images, match[1])
    }
    return images
}

步骤4:运行爬虫

main函数中调用上述函数:

go 复制代码
func main() {
    url := "https://example.com"
    html, err := fetch(url)
    if err != nil {
        log.Fatal(err)
    }

    links := extractLinks(html)
    for _, link := range links {
        fmt.Println(link)
    }

    images := extractImages(html)
    fmt.Println("Images:")
    for _, image := range images {
        fmt.Println(image)
    }
}

完整代码

go 复制代码
package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "regexp"
)

func fetch(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    return string(body), nil
}

func fetchWithUserAgent(url string) (string, error) {
    client := &http.Client{}
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return "", err
    }
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")

    resp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }

    return string(body), nil
}

func extractLinks(html string) []string {
    re := regexp.MustCompile(`href="([^"]+)"`)
    matches := re.FindAllStringSubmatch(html, -1)
    var links []string
    for _, match := range matches {
        links = append(links, match[1])
    }
    return links
}

func extractImages(html string) []string {
    re := regexp.MustCompile(`src="([^"]+)"`)
    matches := re.FindAllStringSubmatch(html, -1)
    var images []string
    for _, match := range matches {
        images = append(images, match[1])
    }
    return images
}

func main() {
    url := "https://example.com"
    html, err := fetch(url)
    if err != nil {
        log.Fatal(err)
    }

    links := extractLinks(html)
    fmt.Println("Links:")
    for _, link := range links {
        fmt.Println(link)
    }

    images := extractImages(html)
    fmt.Println("Images:")
    for _, image := range images {
        fmt.Println(image)
    }
}

注意事项

  • User-Agent头 : 部分网站可能会根据User-Agent头来限制爬虫访问。可以通过设置http.Client的请求头来模拟浏览器的User-Agent。
  • robots.txt : 在爬取前,应检查目标网站的robots.txt文件,以确保爬虫行为合法。
  • 频率限制: 避免过快地发送请求,以免被目标网站封禁。
相关推荐
mldong31 分钟前
从 mldong 到 jeeflow:一个工作流引擎的独立进化
后端
陈随易1 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
Aaron - Wistron1 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
笨鸟先飞,勤能补拙1 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
卷无止境2 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境2 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
kyriewen3 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒3 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
Revolution614 小时前
React 组件重新渲染时,到底重新执行了什么
前端·react.js·面试