我想使用此网站完成的计算:http://www.isewase.de/dwz/.
因此,我在网站本身输入数据时检查了 POST 请求,例如:
dwz_name: 1000-100
geb: 1990
punkte: 1
dwz[]: 1300
dwz[]: 1400
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
dwz[]:
Los: DWZ berechnen!
name:
kennwort:
或(查看来源):
dwz_name=1000-100&geb=1990&punkte=1&dwz%5B%5D=1300&dwz%5B%5D=1400&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&Los=DWZ+berechnen%21&name=&kennwort=
所以我尝试用这个小程序复制它:
// test.go
package main
import (
"fmt"
"strings"
"github.com/gocolly/colly"
)
func main() {
dwz := [18]string{
"1300",
"1400",
}
dwzStr := strings.Join(dwz[:], "&dwz[]=") // (a)
// dwzStr := strings.Join(dwz[:], "&dwz%5B%5D=") // (b)
c := colly.NewCollector()
c.OnHTML("body > form > fieldset:nth-child(4) > dl > dd:nth-child(8)", func(h *colly.HTMLElement) {
fmt.Println(h.Text)
})
c.Post("http://www.isewase.de/dwz/", map[string]string{
"dwz_name": "1000-100",
"geb": "1900",
"punkte": "1",
"dwz[]": dwzStr,
"Los": "DWZ berechnen!",
"name": "",
"kennwort": "",
})
}
结果(
(a)
和(b)
)
> go run test.go
1040 (+40)
这正是您在使用
1300
输入第一个选项时从网站收到的结果。
但是由于
colly.Post
想要 map[string]string
作为第二个参数,我不知道如何以另一种方式将数组/切片传递到 POST 请求中。
您应该能够使用
c.Request
,以便您可以手动设置请求正文:
form := url.Values{}
form.Add("dwz_name", "1000-100")
form.Add("geb", "1900")
form.Add("punkte", "1")
form.Add("Los", "DWZ berechnen!")
form.Add("name", "")
form.Add("kennwort", "")
form.Add("dwz[]", "1300")
form.Add("dwz[]", "1400")
header := http.Header{}
header.Add("Content-Type", "application/x-www-form-urlencoded")
err := c.Request(
http.MethodPost,
"http://www.isewase.de/dwz/",
strings.NewReader(form.Encode()),
nil,
header,
)