Go抓取網頁數據並存入MySQL和返回json數據<二>

上一節已經說明了要作什麼,以及整個小程序的目錄結構,接下來就開始編碼部分。
首先在入口文件中引入項目下的包crawldata,而後調用其中抓取數據的函數,暫時取名爲Crawl:git

package main

import (
    "fmt"
    "indiepic/crawldata"
)

func main () {
    // 使用crawldata包裏面的Crawl()抓取須要的數據存到數據庫
    crawldata.Crawl()
    fmt.Println("主函數")
}

而後就是實現包crawldata裏面的Crawl函數。將該函數放在crawldata.go文件中:github

package crawldata

import (
    "fmt"
)

func Crawl() {
    fmt.Println("包crawldata中的Crawl函數")
}

查看網站 http://www.gratisography.com/,而後審查元素找到某張圖片,在圖片主要包含了srcdata-originalwidthheightalt等信息,首先要明確一點的是這個網站使用了圖片的lazy加載(在每一個li標籤上能夠看出來),因此真正的圖片URLdata-original指定的值而不是srcsrc值會在圖片加載完成以後被賦爲data-original的值。另外在網站上有一個分類,因此需存儲一下每一張圖片的分類,在抓取的時候也是直接經過分類去抓取。
所以咱們須要定義一個結構體來表示每一條數據包含的數據,以及用於存儲所有數據的一個切片,而後在Crawl函數中使用。以下:數據庫

package crawldata

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "strconv"
    s "strings"
)

// 定義一個存儲一條數據的結構體
type ImageData struct {
    Src    string
    Tp     string
    Title  string
    Width  int
    Height int
}

// 定義切片用於存儲抓取的所有數據
type ImageDatas []ImageData

func Crawl() {
    fmt.Println("包crawldata中的Crawl函數")

    // 定義一個切片存儲全部數據
    var datas ImageDatas
    // 抓取數據
    imageDatas := CrawlData(&datas)
}

在上面的Crawl函數中又調用了一個CrawlData函數,該函數接受一個用於存儲數據的datas變量,並返回抓取後的全部數據。小程序

/*
   該函數用來抓取數據,並將存儲的值返回到主函數
*/
func CrawlData(datas *ImageDatas) (imageDatas ImageDatas) {
    imageDatas = *datas
    // 規定抓取時匹配的元素
    var types = [...]string{
        "people",
        "objects",
        "whimsical",
        "nature",
        "urban",
        "animals"}

    doc, err := goquery.NewDocument("http://www.gratisography.com/")
    if err != nil {
        fmt.Printf(err.Error())
    }

    for _, tp := range types {
        doc.Find("#container ul").Find(s.Join([]string{".", tp}, "")).Each(func(i int, s *goquery.Selection) {
            img := s.Find("img.lazy")
            src, _ := img.Attr("data-original")
            title, _ := img.Attr("alt")
            width, _ := img.Attr("width")
            height, _ := img.Attr("height")

            // 將寬度和高度的字符串類型轉爲數值型
            wd, error := strconv.Atoi(width)
            if error != nil {
                fmt.Println("字符串轉換成整數失敗")
            }
            hg, error := strconv.Atoi(height)
            if error != nil {
                fmt.Println("字符串轉換成整數失敗")
            }
            // fmt.Printf("Review %d: %s - %s - %s - %d - %d\n", i, src, tp, title, wd, hg)
            imageData := ImageData{src, tp, title, wd, hg}
            imageDatas = append(imageDatas, imageData)
        })
    }
    return
}

定義了一個數組types用於存放分類,而後根據分類去得到各分類下的圖片。數組

數據抓取使用 goquery,在運行以前須要使用以下命令獲取goqueryapp

go get github.com/PuerkitoBio/goquery

goquery的用法和jQuery很相似,直接經過網頁中的一些標籤、class、id等獲取,更多的使用方法能夠查看文檔。函數

這裏還使用了strconv中的函數轉換類型,使用strings處理字符串。這兩個都是GO的內置包,不須要其餘運行命令獲取。網站

Crawl函數中可使用for輸出看獲取到的數據,如:編碼

func Crawl() {
    // 定義一個切片存儲全部數據
    var datas ImageDatas
    // 抓取數據
    imageDatas := CrawlData(&datas)
    for i := 0; i < len(imageDatas); i++ {
        fmt.Println(imageDatas[i].Src, imageDatas[i].Title, imageDatas[i].Tp, imageDatas[i].Height, imageDatas[i].Width)
    }
    // 或者
    for _, imageData := range imageDatas {
        fmt.Println(imageData.Src, imageData.Title, imageData.Tp, imageData.Height, imageData.Width)
    }

    // 將數據插入數據庫
    // InsertData(&imageDatas)
}

下一步實現將獲取的數據插入數據庫的方法InsertData(&imageDatas)code

相關文章
相關標籤/搜索