cURL - 如果页面自上次获取后发生了变化,如何获取页面?

时间:2016-04-30 07:54:11

标签: php caching curl web-scraping

我有一个每天抓取页面的脚本,我只想在内容发生变化时才能获取它,这样脚本运行得更快,流量也会减少。

我的想法是首先获取标题并比较内容长度,以便如果它不同我们获取整个文档,但它不是太精确,因为网站可能有动态部分,每次都会使内容长度不同

还有其他方式,比如使用某种DNS或其他方式吗?

3 个答案:

答案 0 :(得分:2)

我找了2天以上的答案,没有人能给我普遍的答案。

所以我实现了etag和if-modified-since标题(如Matt Raines和sowa帖子),同样为了降低流量,我使用了像gzip这样的压缩。

还有请求标题范围,所以我可以抓住页面的一部分,因为有人告诉我,但我认为它只用于文件而不是网页。

谢谢大家的时间

答案 1 :(得分:0)

curl_setopt($curl, CURL_HTTPHEADER, ["If-Modified-Since: 2016-04-30 21:00:00"]);是否有效?我对本月早些时候最后一次修改的资源收到304 Not Modified响应。

答案 2 :(得分:0)

使用远程更新本地文件,iff远程更新

为想要的人剪切并粘贴答案 检查远程文件是否比本地文件更新,并更新本地文件

    // $remotePath = 'http://blahblah.com/file.ext'; 
    // $localPath = '/usr/whatever/app/file.ext';

    $headers = get_headers( $remotePath , 1 );
    $remote_mod_date = strtotime( $headers['Last-Modified'] );
    $local_mod_date = filemtime( $localPath );

    if ( $local_mod_date >= $remote_mod_date ) {
        // Local version up to date 
    } else {
        // Remote file is newer
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $remotePath);
        // other options here, eg: curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $result = curl_exec($ch);

        if (curl_errno($ch)) {
            // handle error : curl_error($ch) 
        }

        curl_close ($ch);

        if ( $result ) {
            // Update local file with remote file contents
            file_put_contents( $localPath, $result );
        } 
    }

感谢OP question herethis answer 创建用于解决自动OIDC CA证书续订(thisand this)。