刚刚玩了一下 goquery 看到最近抓知乎数据的比较多。那我也抓一个玩玩。

我也不跟人家 比数据量什么的了。也不证明golang是最好的语言

只是单单的做练手了

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

type Book struct {
	Title  string //标题
	Img    string //图片地址
	Author string //作者
	Sell   string //价格
	Url    string //访问链接
}

func main() {
	var (
		url string = "https://www.zhihu.com/publications"
	)
	//使用 goquery 创建 dom 对象
	query, query_err := goquery.NewDocument(url)
	if query_err != nil {
		fmt.Println(query_err)
	}

	data_arr := make(map[int]Book, 100)
	//查看元素发现 他是一个大的 ul 那么我们直接 找到这个对象就好了。
	//每一本书的数据 为一个 li 那么直接对 li的元素进行遍历就好了
	//需要设置两个参数 i 为当前是第几个元素 s 为当时元素对象
	query.Find("ul[class=\"publications-list  weekly\"]").Eq(0).Find("li").Each(func(i int, s *goquery.Selection) {
		a := s.Find("a").Eq(0)
		a.Next()
		r := Book{}
		//获取对应 跳转链接
		r.Url, _ = a.Attr("href")
		//获取书的名字
		r.Title = a.Find(".publications-item-title").Eq(0).Text()
		//获取书的图片
		r.Img, _ = a.Find(".publications-item-image").Eq(0).Attr("src")
		//获取书的作者
		r.Author = a.Find(".publications-item-author").Eq(0).Text()
		//获取书的售价
		r.Sell = a.Find(".publications-item-promotion").Eq(0).Find("span").Eq(0).Text()
		data_arr[i] = r
	})
	for k, v := range data_arr {
		fmt.Println(k, v)
	}

}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐