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
如您所见,您问题中的代码难以阅读。本论坛提供了一个功能,可以以可读的方式缩进和格式化代码。只需编辑您的问题,选中代码并点击</>按钮即可完成!
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)
}
关键修改点:
-
CSS选择器修正:
- 主选择器改为
#zg-ordered-list li来定位产品列表项 - 排名选择器使用
.zg-badge-text - 产品名称尝试多个可能的选择器:
.p13n-sc-truncate、.p13n-sc-truncate-desktop-type2、span div
- 主选择器改为
-
添加User-Agent:Amazon会检测爬虫,添加User-Agent可以避免被拒绝访问
-
错误处理:添加了
OnError回调来捕获请求错误 -
数据清理:使用
strings.TrimSpace()清理产品名称的空格 -
调试输出:添加了找到产品时的输出,方便调试
如果仍然无法获取数据,可能是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规则和服务条款。

