3 回答

TA貢獻1803條經驗 獲得超3個贊
您可以在下面看到答案,如果您愿意,可以
查看為什么使用這種解決方案
順便說一句,我們可以使用迭代從地圖中獲取特定值。我也有一個代碼。但是,如果您有任何更簡單的方法,請發表評論
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
}

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
}

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并取得了巨大的成功。通過使用此工具,您的工作流程將類似于……
打開無頭瀏覽器
去網址
轉儲頁面 html
用 goquery 解析
打印您的回復
- 3 回答
- 0 關注
- 196 瀏覽
添加回答
舉報