Golang学习之获取网站Banner

走吧走吧,人总要学着自己长大;走吧走吧,人生难免经历苦痛挣扎;走吧走吧,为自己的心找一个家。——《爱的代价》

想写爬虫,想用Go获取网站Banner。
本文涉及,获取随机User-Agent、发起GET请求、XPath解析。

Random User-Agent

此时就要推荐一个库了,哈哈哈哈

https://github.com/EDDYCJY/fake-useragent

使用简单明了而且好用。

GET请求

之前写了一个POST请求的注意事项,GET请求倒没啥说的,挺简单。

本来想使用如下操作的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"io/ioutil"
"log"
"net/http"
)

func main() {
res, err := http.Get("http://www.google.com/robots.txt")
if err != nil {
log.Fatal(err)
}
robots, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", robots)
}

发现不得行,看文档最后有这么一句:

To make a request with custom headers, use NewRequest and DefaultClient.Do.

老实改成和POST一样的操作吧,加上Random UA。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func getHTTPBanner(url string) {
// 获取网站banner
randomUA := browser.Random()

client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", randomUA)

resp, err := client.Do(req)
if err != nil {
log.Fatal("Http get err:", err)
}
defer resp.Body.Close()
}

XPath

Python 有 BeautifulSoup 这样简单的库,当然也可以用 lxml,同样的,Golang中其实也有很多可以用来提取节点元素的方法,这里推荐阅读以下:

https://strconv.com/page/2/

其中对比了个Golang的库。

这里我使用的是: github.com/antchfx/htmlquery

获取页面HTML后,解析HTML,然后直接获取title节点,然后提取信息即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func getHTTPBanner(url string) {
// 获取网站banner
randomUA := browser.Random()

client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", randomUA)

resp, err := client.Do(req)
if err != nil {
log.Fatal("Http get err:", err)
}
defer resp.Body.Close()

doc, err := htmlquery.Parse(resp.Body)
if err != nil {
log.Fatal(err)
}

title := htmlquery.FindOne(doc, `/html/head/title/text()`)
fmt.Printf("[+] %s: %s\n", url, htmlquery.InnerText(title))
}

参考:https://strconv.com/posts/web-crawler-exercise-5/