【问题标题】:How to get a CSV from a site with a 503 error with CloudFlare protection?如何使用 CloudFlare 保护从出现 503 错误的站点获取 CSV?
【发布时间】:2023-03-07 16:00:02
【问题描述】:

我创建了一个 PHP 脚本,它使用 fopenfgetcsv 从外部站点获取 CSV 以将数据存储到数组中。

外部站点偶尔会抛出 503 错误。发生这种情况时,fopen 将不起作用并返回网站不可用的错误。

有问题的外部站点通过浏览器继续正常工作,因为它使用 Cloud Flare 进行保护。

在这种情况下,还有什么方法可以获取 CSV?我想通过在我的脚本中以某种方式模仿浏览器来获取文件......?可能不可能,但需要确认。

【问题讨论】:

    标签: php csv fopen http-status-code-503


    【解决方案1】:

    Cloudflare 支持网站说:

    另一方面,带有“cloudflare-nginx”的 503 Service Temporarily Unavailable 错误消息意味着您正在达到 Cloudflare 数据中心的连接限制。请联系 Cloudflare 支持并提供以下信息: link

    如果该站点与浏览器一起使用,它可能只允许来自浏览器的连接以节省带宽,但我认为,当您的服务器联系该站点时,已达到连接限制,因此它不依赖于您的服务器。

    您仍然可以尝试使用 curl 来模拟正常的浏览器并尝试它是否有效。

        <?php $url="https://example.com";
     $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
     $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     curl_setopt($ch, CURLOPT_VERBOSE, true); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
     curl_setopt($ch, CURLOPT_URL,$url);
     $result=curl_exec($ch);
     var_dump($result);
    ?>
    

    但仍然无法加载 JavaScript,网站可能会注意到它。

    【讨论】:

    • 因此,当尝试此操作时,它 var 会转储出 Cloud Flares 重定向消息,因此它会检查浏览器,然后尝试重定向,然后您会得到 404,我认为是因为用户不匹配。跨度>
    【解决方案2】:

    您无法使用 User-Agent 等绕过 CloudFlare 保护,因为如果可能的话,CloudFlare 将根本没有任何安全性。

    可能发生的情况是后端失败,但 CloudFlare 可以允许浏览器使用缓存的响应,或者失败是间歇性的,浏览器仍然可以工作,因为这是下一个调用。您的 CSV-scraper 很可能会成功而浏览器失败,而您不知道,因为何时抓取成功...您根本不检查浏览器,因为您已经没有理由。

    至于你能做什么,是的,你可以用浏览器模仿人类。为此,您可以缓存任何成功的响应以及时间戳,并在遇到错误时在短暂的暂停后重试

    function scrapeCSV($retries = 3) {
        if (0 === $retries) {
            // return an invalid response to signify an error
            return null;
        }
        $fp = @fopen(...);
        if (!$fp) {
           // failed.
           sleep(1);
           return scrapeCSV($retries - 1);
        }
        ...
        return $csv;
    }
    

    更新

    要“像浏览器一样”访问二级缓存,您可能需要混合使用两种不同的解决方案:how to "fake" a browser connectionhow to read from curl as if it was a stream (i.e. fopen)

    如果您一举恢复整个 CSV,并在将其作为本地文件稍后对其进行解析,那么您只需要第一个答案(有一个更受欢迎、更详细和程序化的答案)在我链接的那个下方回答 - 我链接的那个是我的;-))。

    【讨论】:

    • 当我偶尔说的时候,我的意思是外部站点可能会关闭几个小时。如果您通过浏览器访问外部站点,Cloud Flare 甚至会告诉您它正在检查您的浏览器并将您重定向到他们的版本。
    • 好吧,那怕是缓存了。或者,您可以尝试通过使用 curl 并设置遵循重定向的选项来利用 CloudFlare 的二级缓存。您可能仍需要验证您获得的数据是否有意义。
    • 如果我尝试 curl 我会被重定向到这个 404 地址:localhost/cdn-cgi/l/…
    • 我添加了一些提示,应该帮助您完成。让我知道结果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2022-01-07
    • 2022-01-06
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多