Golang如何从网页中解析span标签的值?

Golang如何从网页中解析span标签的值? 我正在尝试从一个电子商务网站抓取热门产品名称列表。但结果是空的。想知道哪里出了问题。输出是:正在访问:https://www.amazon.in/gp/bestsellers/electronics/ref=zg_bs_nav_0/ 抓取结束:https://www.amazon.in/gp/bestsellers/electronics/ref=zg_bs_nav_0/

代码:

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"

    "github.com/gocolly/colly"
)

func main() {
    fetchURL := "https://www.amazon.in/gp/bestsellers/electronics/ref=zg_bs_nav_0/"
    fileName := "results.csv"
    file, err := os.Create(fileName)
    if err != nil {
        log.Fatal("ERROR: Could not create file %q: %s\n", fileName, err)
        return
    }
    defer file.Close()
    writer := csv.NewWriter(file)
    defer writer.Flush()

    writer.Write([]string{"Sl. No."})

    c := colly.NewCollector()

    c.OnRequest(func(r *colly.Request) {
        fmt.Println("Visiting: ", r.URL)
    })

    c.OnHTML(`.a-section a-spacing-none aok-relative`, func(e *colly.HTMLElement) {
        number := e.ChildText(".zg-badge-text")
        name := e.ChildText(".p13n-sc-truncated")

        writer.Write([]string{
            number,
            name,
        })
    })

    c.Visit(fetchURL)
    fmt.Println("End of scraping: ", fetchURL)
}

更多关于Golang如何从网页中解析span标签的值?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

如您所见,您问题中的代码难以阅读。本论坛提供了一个功能,可以以可读的方式缩进和格式化代码。只需编辑您的问题,选中代码并点击</>按钮即可完成!

func main() {
    fmt.Println("hello world")
}

更多关于Golang如何从网页中解析span标签的值?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的代码使用了错误的CSS选择器。Amazon的页面结构已经改变,你需要使用正确的选择器来定位产品元素。以下是修正后的代码:

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/gocolly/colly"
)

func main() {
    fetchURL := "https://www.amazon.in/gp/bestsellers/electronics/ref=zg_bs_nav_0/"
    fileName := "results.csv"
    
    file, err := os.Create(fileName)
    if err != nil {
        log.Fatalf("ERROR: Could not create file %q: %s\n", fileName, err)
    }
    defer file.Close()
    
    writer := csv.NewWriter(file)
    defer writer.Flush()

    // 写入CSV表头
    writer.Write([]string{"Rank", "Product Name"})

    c := colly.NewCollector(
        colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"),
    )

    c.OnRequest(func(r *colly.Request) {
        fmt.Println("Visiting: ", r.URL)
    })

    // 使用正确的选择器
    c.OnHTML("#zg-ordered-list li", func(e *colly.HTMLElement) {
        // 获取排名
        rank := e.ChildText(".zg-badge-text")
        
        // 获取产品名称 - 尝试多个可能的选择器
        var productName string
        
        // 尝试第一个选择器
        productName = e.ChildText(".p13n-sc-truncate")
        if productName == "" {
            // 尝试第二个选择器
            productName = e.ChildText(".p13n-sc-truncate-desktop-type2")
        }
        if productName == "" {
            // 尝试第三个选择器
            productName = e.ChildText("span div")
        }
        
        // 清理产品名称
        productName = strings.TrimSpace(productName)
        
        if rank != "" && productName != "" {
            writer.Write([]string{rank, productName})
            fmt.Printf("Found: Rank %s - %s\n", rank, productName)
        }
    })

    c.OnError(func(r *colly.Response, err error) {
        log.Printf("Request URL: %s failed with error: %v\n", r.Request.URL, err)
    })

    c.Visit(fetchURL)
    fmt.Println("End of scraping: ", fetchURL)
}

关键修改点:

  1. CSS选择器修正

    • 主选择器改为 #zg-ordered-list li 来定位产品列表项
    • 排名选择器使用 .zg-badge-text
    • 产品名称尝试多个可能的选择器:.p13n-sc-truncate.p13n-sc-truncate-desktop-type2span div
  2. 添加User-Agent:Amazon会检测爬虫,添加User-Agent可以避免被拒绝访问

  3. 错误处理:添加了 OnError 回调来捕获请求错误

  4. 数据清理:使用 strings.TrimSpace() 清理产品名称的空格

  5. 调试输出:添加了找到产品时的输出,方便调试

如果仍然无法获取数据,可能是Amazon的反爬机制阻止了请求。你可以尝试添加延迟或使用代理:

c := colly.NewCollector(
    colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"),
    colly.Async(true),
)

c.Limit(&colly.LimitRule{
    DomainGlob:  "*",
    Parallelism: 2,
    Delay:       5 * time.Second,
})

注意:在实际使用中,请确保遵守网站的robots.txt规则和服务条款。

回到顶部