使用Golang从HowLongToBeat获取HTML内容

使用Golang从HowLongToBeat获取HTML内容 我正在向 howlongtobeat 网站发送请求,但没有收到 HTML 响应,只收到了表单数据值。

同样的请求在 Postman 中运行完美。

func HowLongToBeat() {
	form := url.Values{}
	form.Add("queryString", "doom")
	form.Add("t", "games")
	form.Add("sorthead", "popular")
	form.Add("sortd", "Normal Order")
	form.Add("plat", "")
	form.Add("length_type", "main")
	form.Add("length_min", "")
	form.Add("length_max", "")
	form.Add("detail", "0")
	form.Add("v", "")
	form.Add("f", "")
	form.Add("g", "")
	form.Add("randomize", "0")

	req, err := http.NewRequest("POST", "https://howlongtobeat.com/search_results?page=1", strings.NewReader(form.Encode()))

	req.Header.Add("Content-type", "application/x-www-form-urlencoded")
	req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")
	req.Header.Add("Accept", "*/*")
	req.Header.Add("origin", "https://howlongtobeat.com")
	req.Header.Add("referer", "https://howlongtobeat.com")

	if err != nil {
		//handle postform error
		fmt.Println(err)
	}

	defer req.Body.Close()
	body, err := ioutil.ReadAll(req.Body)

	if err != nil {
		//handle read response error
		fmt.Println(err)
	}

	fmt.Println(string(body))
            //this prints (detail=0&f=&g=&length_max=&length_min=&length_type=main&plat=&queryString=doom&randomize=0&sortd=Normal+Order&sorthead=popular&t=games&v=)
}

更多关于使用Golang从HowLongToBeat获取HTML内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢!

更多关于使用Golang从HowLongToBeat获取HTML内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @illud 要控制HTTP客户端头部、重定向策略以及其他设置,请创建一个Client:

client := &http.Client{
	CheckRedirect: redirectPolicyFunc,
}

resp, err := client.Get("http://example.com")
// ...

req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
// ...

favicon.ico

http package - net/http - Go Packages

Package http provides HTTP client and server implementations.

问题在于你过早关闭了请求体,并且没有实际执行HTTP请求。你需要使用http.Client来发送请求,然后读取响应体。以下是修正后的代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
)

func HowLongToBeat() {
    form := url.Values{}
    form.Add("queryString", "doom")
    form.Add("t", "games")
    form.Add("sorthead", "popular")
    form.Add("sortd", "Normal Order")
    form.Add("plat", "")
    form.Add("length_type", "main")
    form.Add("length_min", "")
    form.Add("length_max", "")
    form.Add("detail", "0")
    form.Add("v", "")
    form.Add("f", "")
    form.Add("g", "")
    form.Add("randomize", "0")

    req, err := http.NewRequest("POST", "https://howlongtobeat.com/search_results?page=1", strings.NewReader(form.Encode()))
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return
    }

    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")
    req.Header.Add("Accept", "*/*")
    req.Header.Add("Origin", "https://howlongtobeat.com")
    req.Header.Add("Referer", "https://howlongtobeat.com")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("发送请求失败:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应失败:", err)
        return
    }

    fmt.Println(string(body))
}

func main() {
    HowLongToBeat()
}

主要修改:

  1. 使用http.ClientDo方法发送请求
  2. defer req.Body.Close()改为defer resp.Body.Close()
  3. 从响应体resp.Body读取数据而不是请求体req.Body
  4. 添加了错误处理的return语句

这样就能正确获取HTML响应内容了。

回到顶部