我正在尝试使用CURL从paricualr网站获取网页,但是它给出了这个错误:
curl -q -v -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://www.saiglobal.com/ --output ./Downloads/test.html
....
* SSL certificate verify ok.
} [5 bytes data]
> GET / HTTP/1.1
> Host: www.saiglobal.com
> User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
> Accept: */*
>
0 0 0 0 0 0 0 0 --:--:-- 0:11:53 --:--:-- 0* OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104
* stopped the pause stream!
0 0 0 0 0 0 0 0 --:--:-- 0:11:53 --:--:-- 0
* Closing connection 0
} [5 bytes data]
curl: (56) OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104我不知道发生了什么。我找不到很多关于错误消息的有用信息。在我的Mac上,errorno是60而不是104。
然而,在这些机器上使用Chrome可以毫无问题地加载页面。其中一台机器的CURL版本是7.58.0。
任何帮助都是非常感谢的。
发布于 2018-12-17 16:19:16
问题不在于此站点的证书。从调试输出中可以清楚地看到,TLS握手已成功完成,在此握手之外,证书无关紧要。
但是,可以看出,站点www.saiglobal.com是由Akamai CDN和Akamai features some kind of bot detection保护的CDN
$ dig www.saiglobal.com
...
www.saiglobal.com. 45 IN CNAME www.saiglobal.com.edgekey.net.
www.saiglobal.com.edgekey.net. 62 IN CNAME e9158.a.akamaiedge.net.众所周知,这种机器人检测使用一些启发式方法,以便将机器人与正常浏览器区分开来,检测到机器人可能会导致状态代码403访问被拒绝或导致站点简单挂起-参见Scraping attempts getting 403 error或Requests SSL connection timeout。
在这种特定的情况下,如果添加一些特定的HTTP头,特别是Accept-Encoding、Accept-Language、值为keep-alive的Connection和以某种方式匹配Mozilla的User-Agent,目前似乎会有所帮助。未添加这些标头或具有错误的值将导致挂起。
以下内容目前适用于我:
$ curl -q -v \
-H "Connection: keep-alive" \
-H "Accept-Encoding: identity" \
-H "Accept-Language: en-US" \
-H "User-Agent: Mozilla/5.0" \
https://www.saiglobal.com/请注意,这是故意尝试绕过bot检测。如果Akamai对机器人检测进行了更改,它可能会停止工作。
另请注意,网站所有者明确启用机器人检测是有原因的。这意味着为了自己的利益而故意绕过检测(比如提供一些基于抓取的信息的服务),你可能会陷入法律问题。
https://stackoverflow.com/questions/53810155
复制相似问题