go-spider

  1. 豆瓣爬虫测试

豆瓣爬虫测试

package main

import (
	"fmt"
	"github.com/antchfx/htmlquery"
	"io/ioutil"
	"net/http"
	"strings"
)

/*
	豆瓣 top  爬取
	目标:
		1. 获取表单名称,评价分数,评论人数

	总结:
		1. go 无官方的 xpath库
		2. go 的http请求很原始
		3. github.com/antchfx/htmlquery 能用,但没python的 lxml 库爽
*/

func get_html_string() string {
	url := "https://movie.douban.com/top250"

	// 创建一个新的 http 请求, 方式为 GET
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		fmt.Println(err)
	}
	// 设置 自定义 header
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36")

	// 发起请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
	}
	defer resp.Body.Close()

	// 检验状态响应码
	if resp.StatusCode != http.StatusOK {
		fmt.Printf("status code error: %d %s", resp.StatusCode, resp.Status)
	}

	// 读取响应内容
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
	}
	// 打印响应内容
	//fmt.Printf("%s", string(body))
	return string(body)
}

type my_data struct {
	name   string
	people string
	url    string
}

func get_items_xpath(html string) []my_data {
	doc, err := htmlquery.Parse(strings.NewReader(html))
	if err != nil {
		fmt.Println(err)
	}

	// 使用xpath查询元素
	lis := htmlquery.Find(doc, "//*[@id='content']/div/div[1]/ol/li")

	fmt.Println(len(lis), lis)
	var data []my_data
	for _, li := range lis {
		nameNode := htmlquery.FindOne(li, `./div/div[2]/div[1]/a/span[1]/text()`)
		peopleNode := htmlquery.FindOne(li, `./div/div[2]/div[2]/div/span[4]/text()`)
		urlNode := htmlquery.FindOne(li, `./div/div[2]/div[1]/a/@href`)
		name := htmlquery.InnerText(nameNode)
		people := htmlquery.InnerText(peopleNode)
		url := htmlquery.InnerText(urlNode)

		data = append(data, my_data{name, people, url})
	}

	return data
}

func main() {
	html_string := get_html_string()
	data := get_items_xpath(html_string)
	fmt.Println(data)
}

学习完go的练手玩具

github