我正在尝试使用CURL从特殊网站获取网页,但是它会出现此错误:
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上,错误编号是60,而不是104。
但是,在这些计算机上使用Chrome可以加载页面而没有任何问题。机器的CURL版本之一是7.58.0。
感谢您的帮助。
答案 0 :(得分:1)
问题不是此站点的证书。从调试输出中可以清楚地看到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
,Connection
和keep-alive
和{{ 1}}匹配User-Agent
。未能添加这些标头或具有错误的值将导致挂起。
以下适用于我的作品:
Mozilla
请注意,这是故意绕过漫游器检测的尝试。如果Akamai对漫游器检测进行了更改,它可能会停止工作。
另请注意,网站所有者出于某种原因已明确启用了漫游器检测。这意味着故意绕过检测以获取您自己的利益(例如,基于抓取的信息提供某些服务)可能会导致法律问题。