是什么导致了golang os.Exec行为(转义双引号)?
我有以下代码:是什么导致了golang os.Exec行为(转义双引号)?,go,wget,Go,Wget,我有以下代码: 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) Chrom
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")
到
它将返回服务器错误500,即使在运行相应的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"
它将具有与post数据相同的响应,不带转义引号
为什么Golang os.Exec会导致这种行为?在shell中执行命令时,shell会处理引号,而引号不会传递给正在执行的程序。当您在Go中执行命令时,不涉及shell处理,因此引号被传递。由于程序不需要它们,因此它们直接在请求体中传递,服务器响应时出错
与您的问题无关,但如果您没有使用wget的具体原因,那么使用wget将获得比为每个请求提供wget更好的性能。我不确定您指的是什么“bug”。在一种情况下,您通过一个shell执行
wget
,它将为您解释引号,而在另一种情况下,您直接执行一个二进制文件,它不像shell那样对参数进行lex处理。这是两件不同的事情,所以你本质上是在问“为什么shell像shell一样解析引号?是的,就是这样;对问题进行了编辑,这样就不会暗示这是Golang功能或bug。考虑过删除这个问题,但有人可能会像我一样产生类似的误解。如果有人认为这不是一个有用的问题答案,也许我们应该删除它。谢谢;没有想到“中间没有壳”的事。我使用的是wget,因为在很多情况下性能并不是那么重要,因为网站有每秒请求的限制。相反,通过构建“wget脚本”,我可以与不使用Golang的人共享它们。因此,在某种意义上,我正在试验一种与编程语言无关的刮取过程:wget(uri+params)->类似jQuery的HTML处理器->json。根据wget和jQuery风格的配置以及解释这些配置的声明性程序,将允许更广泛的重用性。但最终我只是为了好玩而编写代码。
payload := "--post-data=\"id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i) + "\""
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"