周末无聊,之前看完了GO 的教程不知到写点什么,思来想去,爬虫不是很有趣吗? 实现效果如下(因为没什么有用的数据 就懒得存数据库了 嘻嘻 你们感兴趣的同学可以自己实现)
之前打算爬boss直聘的数据,没想到才一次就挂了,IP被封了(下次出教程)
所以爬个简单点 https://studygolang.com/topics 看到网上好多教程都是爬这个呢哈哈
其实很简单的,主要用的库就是goquery 提供的api 和jquery 差不多
以下是接口文档
https://gowalker.org/github.com/PuerkitoBio/goquery#Selection_FindNodes
进入代码
package main
import (
"net/http"
"github.com/PuerkitoBio/goquery"
"log"
"fmt"
"strconv"
"os"
)
const (
baseUrl string = "https://studygolang.com/topics?p="
)
func main() {
var page int = 1
var count int =getPageCount()
for {
str := baseUrl + strconv.Itoa(page)
response := getResponse(str)
if (response.StatusCode == 403) {
fmt.Println("IP 已被禁止访问")
os.Exit(1)
}
if (response.StatusCode == 200) {
dom, err := goquery.NewDocumentFromResponse(response)
if err != nil {
log.Fatalf("失败原因", response.StatusCode)
}
dom.Find(".topics .topic").Each(func(i int, content *goquery.Selection) {
title := content.Find(".title a").Text()
fmt.Println(title)
})
}
page++
if page >= count{
fmt.Println("--------------------------------数据拉取完成共"+strconv.Itoa(page)+"条------------------------------------")
os.Exit(1)
}
}
}
/** * 返回response */
func getResponse(url string) *http.Response {
client := &http.Client{}
request, _ := http.NewRequest("GET", url, nil)
request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0")
response, _ := client.Do(request)
return response
}
/** * 得到文章总数 */
func getPageCount() int {
response := getResponse(baseUrl)
dom, err := goquery.NewDocumentFromResponse(response)
if err != nil {
log.Fatalf("失败原因", response.StatusCode)
}
resDom := dom.Find(".text-center .pagination-sm li a")
//len := resDom.Length()
count,_ := strconv.Atoi(resDom.Eq(resDom.Length()-2).Text())
return count
}
赶紧动手自己写一个吧