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 关注
- 145 浏览
添加回答
举报