我可以使用网络浏览器导航到网站。但是尝试使用curl 发出GET 请求会挂起。例如,该命令卡curl -vL my_url
在以下日志中:
* Host $url:443 was resolved.
* IPv6: ***
* IPv4: ***
* Trying ***:443...
* Connected to $url (***) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/cert.pem
* CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF
* ALPN: server accepted http/1.1
* Server certificate:
* subject: C=**; ST=***; L=***; O=***; CN=***
* start date: Nov 17 05:09:32 2023 GMT
* expire date: Nov 17 14:59:59 2024 GMT
* subjectAltName: host "***" matched cert's "***"
* issuer: C=**; O=***; CN=***
* SSL certificate verify ok.
* Certificate level 0: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/1.x
> GET / HTTP/1.1
> Host: ***
> User-Agent: curl/8.6.0
> Accept: */*
>
* old SSL session ID is stale, removing
这是什么原因呢?抱歉,我不能透露网站网址。我希望以上内容能够透露一些信息。我尝试添加浏览器中的所有请求标头,但行为没有改变。
DNS 查找显示以下信息:
*** is an alias for ***.edgekey.net.
***.edgekey.net is an alias for ***.akamaiedge.net.
***.akamaiedge.net has address ***
***.akamaiedge.net has IPv6 address ***
***.akamaiedge.net has IPv6 address ***
编辑:根据进一步调查,不仅仅是curl,我尝试过的所有非浏览器客户端(postman、curl、wget、openssl s_client 来获取SSL 证书)都会超时。我尝试使用与curl/postman 完全相同的请求标头作为浏览器来获取页面,但没有成功。
答案1
正如其他人指出的那样,检查网站的 robots.txt 中是否有此内容
User-Agent: curl
Disallow: /
如果它在那里,那么你就不能在该特定网站上使用curl
如果是这样的话你就不能这样做任何爬行
User-agent: *
Disallow: /
要找到它,只需在网址后输入 /robots.txtexample.com/robots.txt
答案2
我设法通过添加以下标头来使curl 请求正常工作。请注意,所有这些都是必需的,仅用户代理标头还不够:
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0
> Accept-Language: en-US,en;q=0.5
> Accept-Encoding: gzip, deflate, br
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
我通过查看浏览器开发人员控制台的网络选项卡中的请求标头来获取它们。
Accept header 也可以简单地是Accept: */*
.
答案3
我跟踪的网站也遇到同样的问题(这就是我最初提出你的问题的原因)。奇怪的是,我多年来一直跟踪这个网站(使用curl
)没有任何问题 - 但现在这是一个“问题”!也许这是一个趋势?
不管怎样 - 自从阅读你的问题后,我找到了一个适合我的解决方案:lynx
-“命令行”网页浏览器。lynx
有很多选择,因此您可能需要投入一些时间阅读man lynx
等。以下是对我有用的方法:
lynx -dump -accept_all_cookies 'https://wherever.com/viewtopic.php?t=abc123' > my-dump.txt