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

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

我用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上,但他们是非常过时的或提供没有真实的的答案,除了“尝试代理。”这不是一个适当的解决方案。(更新代码)

  1. package main
  2. import (
  3. "compress/gzip"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. )
  10. func ReadAll(r io.Reader) ([]byte, error) {
  11. reader, err := gzip.NewReader(r)
  12. if err != nil {
  13. return nil, err
  14. }
  15. defer reader.Close()
  16. buff, err := io.ReadAll(reader)
  17. return buff, err
  18. }
  19. func main() {
  20. // url := "https://www.reaperscans.com"
  21. url := "http://localhost:8000"
  22. // agent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
  23. agent := "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0"
  24. client := &http.Client{}
  25. req, err := http.NewRequest("GET", url, nil)
  26. if err != nil {
  27. log.Fatalln(err)
  28. }
  29. // req.Header.Set("User-Agent", agent)
  30. // req.Header.Set("Accept-Encoding", "gzip, deflate")
  31. // req.Header.Set("Accept", "*/*")
  32. // req.Header.Set("Connection", "keep-alive")
  33. req.Header = http.Header{
  34. "User-Agent": {agent},
  35. "Accept-Encoding": {"gzip, deflate"},
  36. "Accept": {"*/*"},
  37. "Connection": {"keep-alive"},
  38. }
  39. // make the http request
  40. resp, err := client.Do(req)
  41. if err != nil {
  42. log.Fatalln(err)
  43. }
  44. defer resp.Body.Close()
  45. // fmt.Println(resp.Uncompressed)
  46. // body, err := io.ReadAll(resp.Body)
  47. // if err != nil {
  48. // log.Fatalln(err)
  49. // }
  50. // log.Println(string(body))
  51. // decompress the response
  52. reader, err := gzip.NewReader(resp.Body)
  53. if err != nil {
  54. log.Fatalln(err)
  55. }
  56. defer reader.Close()
  57. // read the decompressed resp body
  58. body, err := ioutil.ReadAll(reader)
  59. if err != nil {
  60. log.Fatalln(err)
  61. }
  62. // print it out bb
  63. fmt.Println(string(body))
  64. }

这是我的Python代码

  1. import requests
  2. request_headers = {
  3. 'User-Agent' : ('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'), }
  4. request = requests.get("https://www.asurascans.com", headers=request_headers)
  5. 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 ):

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

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

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

不工作(Go-Lang):

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

这就是我困惑的原因

nkoocmlb

nkoocmlb1#

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

相关问题