我用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
这就是我困惑的原因
1条答案
按热度按时间nkoocmlb1#
所以基本上cloudflare抓住了你伪造浏览器或模仿一个,不是吗?所以你有一个带有http客户端的应用程序,它使用实际浏览器的用户代理。cloudflare waf肯定会抱怨的。
相反,为您的应用程序使用自定义用户代理,以便它在CF上看起来是真实的。说“我的应用1.0”