go-spider

豆瓣爬虫-try

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)
}
github