我有一个每天抓取页面的脚本,我只想在内容发生变化时才能获取它,这样脚本运行得更快,流量也会减少。
我的想法是首先获取标题并比较内容长度,以便如果它不同我们获取整个文档,但它不是太精确,因为网站可能有动态部分,每次都会使内容长度不同
还有其他方式,比如使用某种DNS或其他方式吗?
答案 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)
为想要的人剪切并粘贴答案 检查远程文件是否比本地文件更新,并更新本地文件:
// $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 here和this answer 创建用于解决自动OIDC CA证书续订(this,and this)。