如何解决一个网站禁止我用PHP刮掉他们的图像

时间:2012-03-29 06:52:04

标签: php screen-scraping web-scraping

我正在搜索网站,搜索要下载的JPG 抓取网站的HTML页面效果很好 但是当我尝试使用 CURL,copy(),fopen()等获取JPG时,我得到 403 forbiden 状态。

我知道这是因为网站所有者不希望他们的图片被刮掉,所以我理解一个好的答案是就是不要这样做,因为他们不希望你

好的,但是我们说没关系,我试着解决这个问题,怎么能实现呢?

如果我使用浏览器获得相同的URL,我可以完美地打开图像,这不是我的IP被禁止或任何东西,我一次测试刮刀一个文件,所以它不会阻止我,因为我过于频繁地提出太多要求。

根据我的理解,可能是网站正在检查一些确认我正在使用浏览器并在下载JPG之前浏览其网站的cookie。
或者也许PHP正在使用一些用户代理来处理服务器可以检测和过滤的请求。

无论如何,有什么想法?

3 个答案:

答案 0 :(得分:3)

实际上这很简单 正如@Leigh建议的那样,它只使用CURLOPT_REFERER选项欺骗了一个http引用者 事实上,对于每个请求,我只提供了域名作为引用者并且它有效。

答案 1 :(得分:1)

您是否可以通过浏览器查看该页面?页面源的简单搜索不会找到所有图像吗?

`    $findme   = '.jpg';
$pos = strpos($html, $findme);

if ($pos === false) {
    echo "The string '$findme' was not found in the string '$html'";
} else {
    echo "Images found..

   ///grab image location code

} `

答案 2 :(得分:1)

基本图像检索:

使用默认情况下通常安装的GD库插件和许多Web主机。这是一个丑陋的黑客,但有些人可能会发现它可以通过这种方式有用。

$remote_img = 'http://www.somwhere.com/images/image.jpg';
$img = imagecreatefromjpeg($remote_img);
$path = 'images/';
imagejpeg($img, $path);

经典cURL图像抓取功能,用于从供稿页面HTML中提取图像的位置

function save_image($img,$fullpath){
$ch = curl_init ($img);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata=curl_exec($ch);
curl_close ($ch);
if(file_exists($fullpath)){
    unlink($fullpath);
}
$fp = fopen($fullpath,'x');
fwrite($fp, $rawdata);
fclose($fp);
}

如果基本的cURL图像抓取功能失败,那么捐赠者站点可能具有某种形式的服务器端防御措施,以防止检索,因此您可能会进一步继续违反服务条款。虽然很少有一些网站使用GD库模块“动态”创建图像,所以看起来像图像的链接实际上是一个PHP脚本,可能会检查像cookie,referer或会话值被传递的东西在创建和输出图像之前使用它。