我正在尝试从 whoscored.com 中提取匹配数据。当我在 firefox 上查看源代码时,我在第 816 行找到了一个很大的 json 字符串,其中包含我想要的 matchid 数据。我的目标是最终得到这个 json。
为此,我尝试下载https://www.whoscored.com/Matches/ID/Live 的每一页,其中 ID 是比赛的 ID。我写了一个小的 Go 程序来 GET 请求每个 ID 到某个点:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
// http://www.whoscored.com/Matches/614052/Live is the match for
// Eveton vs Manchester
const match_address = "http://www.whoscored.com/Matches/"
// the max id we get
const max_id = 300
const num_workers = 10
// function that get the bytes of the match id from the website
func match_fetch(matchid int) {
url := fmt.Sprintf("%s%d/Live", match_address, matchid)
resp, err := http.Get(url)
if err != nil {
fmt.Println(err)
return
}
// if we sucessfully got a response, store the
// body in memory
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
// write the body to memory
pwd, _ := os.Getwd()
filepath := fmt.Sprintf("%s/match_data/%d", pwd, matchid)
err = ioutil.WriteFile(filepath, body, 0644)
if err != nil {
fmt.Println(err)
return
}
}
// data type to send to the workers,
// last means this job is the last one
// matchid is the match id to be fetched
// a matchid of -1 means don't fetch a match
type job struct {
last bool
matchid int
}
func create_worker(jobs chan job) {
for {
next_job := <-jobs
if next_job.matchid != -1 {
match_fetch(next_job.matchid)
}
if next_job.last {
return
}
}
}
该代码似乎可以工作,因为它用 html 填充了一个名为 match_data 的目录。问题是这个html和我在浏览器中得到的完全不同!这是我认为执行此操作的部分:(来自http://www.whoscored.com/Matches/614052/Live的 GET 请求正文。
我认为是这种情况的原因是页面中的 javascript 获取并将 DOM 编辑为我在查看源中看到的内容。如何让 golang 运行 javascript?有图书馆可以做到这一点吗?更好的是,我可以直接从服务器获取 JSON 吗?
慕妹3242003
富国沪深
相关分类