豆瓣爬虫-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)
}