Golang 網路爬蟲架構gocolly/colly 三

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Golang 網路爬蟲架構gocolly/colly 三

熟悉了《Golang 網路爬蟲架構gocolly/colly 一》和《Golang 網路爬蟲架構gocolly/colly 二》之後就可以在網路上爬取大部分資料了。本文接下來將爬取中證指數有限公司提供的行業市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio)

 

定義資料結構體,

//證監會行業市盈率type ZhjhHyShyl struct {    Hydm string `json:"行業代碼"`    Hymc string `json:"行業名稱"`    Zxsj *float64 `json:"最新資料"`    Gpjs int `json:"股票家數"`    Ksjs int `json:"虧損家數"`    Jygy *float64 `json:"近一個月"`    Jsgy *float64 `json:"近三個月"`    Jlgy *float64 `json:"近六個月"`    Jyn *float64 `json:"近一年"`    Zhy []*ZhjhHyShyl `json:"細分行業"`}

  

 

 

接下來為gocolly調用準備,將使用者代理程式設定為Chrome瀏覽器,該值可以通過Fiddler工具查看

 

c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"

 

  

 

 

還可以利用Fiddler設定更多的Request Header,將爬蟲工具偽裝成瀏覽器。

 

接下來F12呼叫瀏覽器調試器查看目標資料的元素,拷貝jQuery選取器,然後改成相對路徑。

 

 

 

完成所有的資料抓取代碼:

 

package main import (    "encoding/json"    "fmt"    "log"    "strconv"    "strings"     "github.com/PuerkitoBio/goquery"     "github.com/gocolly/colly") //證監會行業市盈率type ZhjhHyShyl struct {    Hydm string `json:"行業代碼"`    Hymc string `json:"行業名稱"`    Zxsj *float64 `json:"最新資料"`    Gpjs int `json:"股票家數"`    Ksjs int `json:"虧損家數"`    Jygy *float64 `json:"近一個月"`    Jsgy *float64 `json:"近三個月"`    Jlgy *float64 `json:"近六個月"`    Jyn *float64 `json:"近一年"`    Zhy []*ZhjhHyShyl `json:"細分行業"`} func main() {     var err error    c := colly.NewCollector()    c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"     zjhHyShyl := make([]*ZhjhHyShyl, 0)    c.OnRequest(func(r *colly.Request) {        fmt.Printf("%+v\r\n%+v\r\n", *r, *(r.Headers))    })     c.OnHTML("td>table.list-div-table>tbody>tr", func(e *colly.HTMLElement) {         hyShy := ZhjhHyShyl{            Hydm: e.ChildText("td:first-child"),            Hymc: e.ChildText("td:nth-child(2)"),        }        zxsj, err := strconv.ParseFloat(e.ChildText("td:nth-child(3)"), 64)        if err == nil {            hyShy.Zxsj = &zxsj        }         gpjs, err := strconv.ParseInt(e.ChildText("td:nth-child(4)"), 10, 32)        if err == nil {            hyShy.Gpjs = int(gpjs)        }        ksjs, err := strconv.ParseInt(e.ChildText("td:nth-child(5)"), 10, 32)        if err == nil {            hyShy.Ksjs = int(ksjs)        }         jygy, err := strconv.ParseFloat(e.ChildText("td:nth-child(6)"), 64)        if err == nil {            hyShy.Jygy = &jygy        }        jsgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(7)"), 64)        if err == nil {            hyShy.Jsgy = &jsgy        }        jlgy, err := strconv.ParseFloat(e.ChildText("td:nth-child(8)"), 64)        if err == nil {            hyShy.Jlgy = &jlgy        }        jyn, err := strconv.ParseFloat(e.ChildText("td:nth-child(9)"), 64)        if err == nil {            hyShy.Jyn = &jyn        }        zjhHyShyl = append(zjhHyShyl, &hyShy)         hyShy.Zhy = make([]*ZhjhHyShyl, 0)        e.DOM.Parent().Parent().Next().Find("table.list-div-table>tbody>tr").Each(func(_ int, s *goquery.Selection) {            zhy := ZhjhHyShyl{                Hydm: strings.Trim(s.Find("td:nth-child(1)").Text(), "\r\n\t "),                Hymc: strings.Trim(s.Find("td:nth-child(2)").Text(), "\r\n\t "),            }             zxsj, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(3)").Text(), "\r\n\t "), 64)            if err == nil {                zhy.Zxsj = &zxsj            }             gpjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(4)").Text(), "\r\n\t "), 10, 32)            if err == nil {                zhy.Gpjs = int(gpjs)            }            ksjs, err := strconv.ParseInt(strings.Trim(s.Find("td:nth-child(5)").Text(), "\r\n\t "), 10, 32)            if err == nil {                zhy.Ksjs = int(ksjs)            }             jygy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(6)").Text(), "\r\n\t "), 64)            if err == nil {                zhy.Jygy = &jygy            }            jsgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(7)").Text(), "\r\n\t "), 64)            if err == nil {                zhy.Jsgy = &jsgy            }            jlgy, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(8)").Text(), "\r\n\t "), 64)            if err == nil {                zhy.Jlgy = &jlgy            }            jyn, err := strconv.ParseFloat(strings.Trim(s.Find("td:nth-child(9)").Text(), "\r\n\t "), 64)            if err == nil {                zhy.Jyn = &jyn            }             hyShy.Zhy = append(hyShy.Zhy, &zhy)         })    })     c.OnScraped(func(_ *colly.Response) {         bData, _ := json.MarshalIndent(zjhHyShyl, "", "\t")        fmt.Println(string(bData))     })     err = c.Visit("http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio?date=2017-12-27&type=zjh1")    if err != nil {        log.Fatal(err)    } } 

  

 

運行後的部分結果:

        

{                "行業代碼": "D",                "行業名稱": "電力、熱力、燃氣及水的生產和供應業",                "最新資料": 20.12,                "股票家數": 107,                "虧損家數": 5,                "近一個月": 19.51,                "近三個月": 19.7,                "近六個月": 19.87,                "近一年": 18.9,                "細分行業": [                        {                                "行業代碼": "44",                                "行業名稱": "電力、熱力生產和供應業",                                "最新資料": 18.75,                                "股票家數": 70,                                "虧損家數": 3,                                "近一個月": 18.28,                                "近三個月": 18.43,                                "近六個月": 18.55,                                "近一年": 17.44,                                "細分行業": null                        },                        {                                "行業代碼": "45",                                "行業名稱": "燃氣生產和供應業",                                "最新資料": 28.4,                                "股票家數": 22,                                "虧損家數": 2,                                "近一個月": 25.71,                                "近三個月": 25.33,                                "近六個月": 25.38,                                "近一年": 27.24,                                "細分行業": null                        },                        {                                "行業代碼": "46",                                "行業名稱": "水的生產和供應業",                                "最新資料": 27.78,                                "股票家數": 15,                                "虧損家數": 0,                                "近一個月": 27.88,                                "近三個月": 29.33,                                "近六個月": 30.56,                                "近一年": 29.64,                                "細分行業": null                        }                ]        },

 

轉載請註明出處:http://www.cnblogs.com/majianguo/p/8150060.html

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.