亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 表網絡抓取

Golang 表網絡抓取

Go
墨色風雨 2022-12-19 21:44:54
我有如下代碼從 html 表中抓取特定的單元格值。您可以訪問https://www.haremaltin.com/altin-fiyatlari網站并在檢查模式下搜索“satis__ATA_ESKI”以查看該值。我是 golang 的初學者并且盡我最大的努力但不幸的是我無法獲得那個價值。有人可以幫助我嗎?順便說一句,他們沒有社區 api。還有一件事,添加 time.sleep 以等待頁面加載。如果它返回“-”,那是因為頁面還沒有加載package mainimport ("fmt""log""net/http""github.com/PuerkitoBio/goquery")func main() {   url := "https://www.haremaltin.com/altin-fiyatlari"   resp, err := http.Get(url)   if err != nil {       log.Fatal(err)   }   defer resp.Body.Close()   if resp.StatusCode != 200 {       log.Fatalf("failed to fetch data: %d %s", resp.StatusCode, resp.Status)   }   doc, err := goquery.NewDocumentFromReader(resp.Body)   if err != nil {      log.Fatal(err)   }   doc.Find("tr__ATA_ESKI tr").Each(func(j int, tr *goquery.Selection) {      data := []string{}      tr.Find("td").Each(func(ix int, td *goquery.Selection) {           e := td.Text()           data = append(data, e)           fmt.Println(data)      })   })}
查看完整描述

3 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

您可以在下面看到答案,如果您愿意,可以

http://img1.sycdn.imooc.com//63a06b020001cb9313130483.jpg

查看為什么使用這種解決方案


順便說一句,我們可以使用迭代從地圖中獲取特定值。我也有一個代碼。但是,如果您有任何更簡單的方法,請發表評論


for _, v := range data { // we need value part of the map

    m, ok := v.(map[string]interface{}) // we need the convert the map 

                                    // into interface for iteration

    if !ok {

        fmt.Printf("Error %T", v)

    }

    for k, l := range m {

        if k == "ATA_ESKI"{ // the value we want is inside of this map

            a, ok := l.(map[string]interface{}) // interface convert again

            if !ok {

                fmt.Printf("Error %T", v)

            }

            for b,c := range a{

                if b == "satis"{ // the value we want

                    fmt.Println("Price is", c)

                }

            }

        }

    }

}

具有以下迭代的完整解決方案:


package main


import (

    "encoding/json"

    "fmt"

    "io/ioutil"

    "net/http"

    "strings"

)


func main() {

    fecthData()

}


func fecthData() (map[string]interface{}, error) {

    body := strings.NewReader("dil_kodu=tr")

    req, err := http.NewRequest("POST", 

"https://www.haremaltin.com/dashboard/ajax/doviz", body)

    if err != nil {

        // handle err

        return nil, err

    }

    req.Header.Set("X-Requested-With", "XMLHttpRequest")


    resp, err := http.DefaultClient.Do(req)

    if err != nil {

        // handle err

        return nil, err

    }

    defer resp.Body.Close()

    jsonData, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        panic(err)

        return nil, err

    }


    var data map[string]interface{}

    err = json.Unmarshal(jsonData, &data)

    if err != nil {

        return nil, err

    }


    for _, v := range data {

        m, ok := v.(map[string]interface{})

        if !ok {

            fmt.Printf("Error %T", v)

        }

        for k, l := range m {

            if k == "ATA_ESKI" {

                a, ok := l.(map[string]interface{})

                if !ok {

                    fmt.Printf("Error %T", v)

                }

                for b, c := range a {

                    if b == "satis" {

                        fmt.Println("Price", c)

                    }

                }

            }

        }

    }


    return data, nil

}


查看完整回答
反對 回復 2022-12-19
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

您可以通過 http Post 請求獲取。不要忘記將 X-Requested-With 標頭添加到請求中。


func fecthData() (map[string]interface{}, error) {

    body := strings.NewReader("dil_kodu=tr")

    req, err := http.NewRequest("POST", "https://www.haremaltin.com/dashboard/ajax/doviz", body)

    if err != nil {

        // handle err

        return nil, err

    }

    req.Header.Set("X-Requested-With", "XMLHttpRequest")


    resp, err := http.DefaultClient.Do(req)

    if err != nil {

        // handle err

        return nil, err

    }

    defer resp.Body.Close()

    jsonData, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        panic(err)

        return nil, err

    }

    var data map[string]interface{}

    err = json.Unmarshal(jsonData, &data)

    if err != nil {

        return nil, err

    }

    return data, nil

}


查看完整回答
反對 回復 2022-12-19
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

由于該表由 javascript 提供支持,我建議您使用不同的方法。這就是為什么。

你真正抓取的是

curl https://www.haremaltin.com/altin-fiyatlari > out.html

這個網頁。您可以在終端中運行此 curl 并獲得與 go 的 rest 請求完全相同的回復(精確是一個強詞,大多數時候,肯定是這種情況)

如您所見,out.html您創建的文件中沒有任何值,這就是您的 go 腳本未返回任何值的原因。

你需要運行 javascript 來填充頁面,這樣你就可以抓取它了。

我在幾個項目中使用了這個https://github.com/chromedp/chromedp并取得了巨大的成功。通過使用此工具,您的工作流程將類似于……

  1. 打開無頭瀏覽器

  2. 去網址

  3. 轉儲頁面 html

  4. 用 goquery 解析

  5. 打印您的回復


查看完整回答
反對 回復 2022-12-19
  • 3 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號