我想用这个网站做的计算: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,
)

Go相关问答推荐

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

重新赋值变量时未清除动态类型-这是错误吗?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

Go 中的sync.Cond 与 Wait 方法

在 GoLang 中对自定义 struct 体数组进行排序

一个Go module可以和之前的非module模块发布在同一个路径下吗?

Go Programming Language书上的例子server2错了吗?

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

获取 nil 指针类型的 reflect.Value

Neptune 在连接到启用 IAM 的 Neptune 实例时抛出握手错误错误

无法将 graphql-ws 连接到 gqlgen

使用 os/exec 和在命令行执行之间的结果莫名其妙地不同

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

如何在切片增长时自动将切片的新元素添加到函数参数

NaN 是 golang 中的可比类型吗?

如何使用 math/big 对 bigInt 进行取模?

具有相同提前返回语句的函数的不同基准测试结果

通用函数与外部包中的常见成员一起处理不同的 struct ?

当 git clone 工作时,Go mod tidy 在私有存储库上失败

在 golang 中联合一个接口和类型