我有以下代码:
for i := 0; i < 1; i++ {
wait := rand.Int63n(150) + 300
time.Sleep(time.Millisecond * time.Duration(wait))
//
useragent := "--user-agent='Mozilla/5.0 (X11; CrOS armv7l 8872.76.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.105 Safari/537.36'"
outDirectory := "--output-document=temp/review-" + strconv.Itoa(i) + ".html"
header := "--header=\"Content-Type: application/x-www-form-urlencoded;charset=utf-8\""
uri := "https://play.google.com/store/getreviews"
payload := "--post-data=id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i)
cmd := exec.Command("wget", useragent, outDirectory, header, uri, payload)
fmt.Println(strings.Join(cmd.Args, " "))
bytes, _ := cmd.CombinedOutput()
fmt.Println(string(bytes))
}
fmt.Println("Finished crawling")
如果我从
更改有效负载线payload := "--post-data=id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i)
到
payload := "--post-data=\"id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i) + "\""
即使运行相应的wget
:
wget --user-agent='Mozilla/5.0 (X11; CrOS armv7l 8872.76.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.105 Safari/537.36' --output-document=temp/review-0.html --header="Content-Type: application/x-www-form-urlencoded;charset=utf-8" https://play.google.com/store/getreviews --post-data="id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=0"
它与没有转义引号的后期数据具有相同的响应。
为什么Golang os.Exec会导致这种行为?
答案 0 :(得分:2)
在shell中执行命令时,shell会处理引号,并且它们不会传递给您正在执行的程序。在Go中执行命令时,不涉及shell处理,因此引用了引号。由于程序不期望它们,它们直接在请求体中传递,服务器响应错误。
与您的问题无关,但如果您没有特定的理由使用wget,那么使用built-in HTTP client可以获得更好的性能,而不是为每个请求分配wget。< / p>