上一節已經說明了要作什麼,以及整個小程序的目錄結構,接下來就開始編碼部分。
首先在入口文件中引入項目下的包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/,而後審查元素找到某張圖片,在圖片主要包含了src
、data-original
、width
、height
、alt
等信息,首先要明確一點的是這個網站使用了圖片的lazy
加載(在每一個li
標籤上能夠看出來),因此真正的圖片URL
是data-original
指定的值而不是src
,src
值會在圖片加載完成以後被賦爲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,在運行以前須要使用以下命令獲取goquery
app
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