当Python请求和Curl工作时,Go lang中发出的请求会被阻塞

yshpjwxd  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(69)

我用golang做了一个web scraper,用http包。我发送了一个GET请求,但它被Cloudflare阻止了。我一直想把我的工具移植到Go上,但每次我尝试的时候,我都被困在发出正确的Web请求上。下面是一个示例用户代理,我同时使用Python 3请求模块、curl、httpx和命令行工具。“Mozilla/5.0(X11; Linux x86_64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/101.0.4951.54 Safari/537.36”
为curl、wget、Python请求设置用户代理可以很好地工作,并且会像预期的那样返回html主体,但是当我在Go-lang中做同样的事情时,它给出了典型的“no-javascript”并启用cookie响应主体。这是我的Go代码,我也尝试了很多其他的方法和解决方案,我发现在SO上,但他们是非常过时的或提供没有真实的的答案,除了“尝试代理。”这不是一个适当的解决方案。(更新代码)

package main

import (
    "compress/gzip"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net/http"
)

func ReadAll(r io.Reader) ([]byte, error) {
    reader, err := gzip.NewReader(r)
    if err != nil {
        return nil, err
    }
    defer reader.Close()
    buff, err := io.ReadAll(reader)
    return buff, err
}

func main() {
    // url := "https://www.reaperscans.com"
    url := "http://localhost:8000"
    // agent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
    agent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0"
    client := &http.Client{}

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatalln(err)
    }

    // req.Header.Set("User-Agent", agent)
    // req.Header.Set("Accept-Encoding", "gzip, deflate")
    // req.Header.Set("Accept", "*/*")
    // req.Header.Set("Connection", "keep-alive")
    req.Header = http.Header{
        "User-Agent":      {agent},
        "Accept-Encoding": {"gzip, deflate"},
        "Accept":          {"*/*"},
        "Connection":      {"keep-alive"},
    }

    // make the http request
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    // fmt.Println(resp.Uncompressed)

    // body, err := io.ReadAll(resp.Body)
    // if err != nil {
    //  log.Fatalln(err)
    // }
    // log.Println(string(body))

    // decompress the response
    reader, err := gzip.NewReader(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }
    defer reader.Close()

    // read the decompressed resp body
    body, err := ioutil.ReadAll(reader)
    if err != nil {
        log.Fatalln(err)
    }

    // print it out bb
    fmt.Println(string(body))

}

这是我的Python代码

import requests

request_headers = { 
'User-Agent' : ('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'), } 
request = requests.get("https://www.asurascans.com", headers=request_headers)
print(request.text)

它也适用于curl
curl -A“blahblah”https://www.asurascans.com > output.html
是的,你可以直接使用“blah”作为用户代理,并获得一个成功的请求。所以我有点困惑,我不能在Go-lang做这件事。
我真的很想学习使用Go,但我找不到任何解决方案来解决这个基本问题。
有一些专门的软件包,我不热衷于使用,因为他们不应该是必要的,他们不可能仍然工作,我不想绕过cloudflare超越使用用户代理,这在Python,wget和 curl 工作得很好。
有什么建议吗?
更新:

  • 运行Python简单服务器以回显头,以便按照建议进行调试。我能够调整我的golang头文件,使其与Python Requests模块和Curl完全匹配,但问题仍然存在。我甚至可以在Curl和Python中使用滑稽的错误头文件,它也会起作用,但在go lang中什么都不起作用。

作品( curl ):

127.0.0.1 - - [24/Apr/2023 13:03:49] "GET / HTTP/1.1" 200 -
ERROR:root:Host: localhost:8000
User-Agent: UWU
Accept: */*
X-Something: yeah

从字面上看,这是可行的,并给我的响应文本,从完全相同的网站,Go是有麻烦的
Works(python):

127.0.0.1 - - [24/Apr/2023 13:04:59] "GET / HTTP/1.1" 200 -
ERROR:root:Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

不工作(Go-Lang):

127.0.0.1 - - [24/Apr/2023 13:06:03] "GET / HTTP/1.1" 200 -
ERROR:root:Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive

这就是我困惑的原因

nkoocmlb

nkoocmlb1#

所以基本上cloudflare抓住了你伪造浏览器或模仿一个,不是吗?所以你有一个带有http客户端的应用程序,它使用实际浏览器的用户代理。cloudflare waf肯定会抱怨的。
相反,为您的应用程序使用自定义用户代理,以便它在CF上看起来是真实的。说“我的应用1.0”

相关问题