Golang实战【简易爬虫】

时间:2022-07-30 20:38:18

周末无聊,之前看完了GO 的教程不知到写点什么,思来想去,爬虫不是很有趣吗? 实现效果如下(因为没什么有用的数据 就懒得存数据库了 嘻嘻 你们感兴趣的同学可以自己实现)

之前打算爬boss直聘的数据,没想到才一次就挂了,IP被封了(下次出教程)
所以爬个简单点 https://studygolang.com/topics 看到网上好多教程都是爬这个呢哈哈

Golang实战【简易爬虫】

其实很简单的,主要用的库就是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
}

赶紧动手自己写一个吧