-2

SimpleHTMLDOMを使用してページをスクレイピングしています (私のサーバー以外のサーバーで)。

基本的な実装は

try {
    $html = file_get_html(urldecode(trim($url)));
} catch (Exception $e) {
    echo $url;
}

foreach ($html->find('img') as $element) {
  $src = "";
  $src = $element->src;
    if (preg_match("/\.(?:jpe?g|png)$/i", $src)) {
        $images[] = $src;
    }
}

これは正常に機能しますが、小さなアバター、アイコン、ボタンの画像など、ページからすべての画像を返します。もちろん、これらは避けたいと思います。

次に、次のようにループ内に挿入しようとしました

...

if (preg_match("/\.(?:jpe?g|png)$/i", $src)) {
    $size = getimagesize($src);
    if ($size[0] > 200) {
        $images[] = $src;
    }
}
...

のようなページでうまく機能しますhttp://cnn.com。しかし、それ以外の場合は、多数のエラーが返されます。例えば

http://www.huffingtonpost.com/2012/05/27/alan-simpson-republicans_n_1549604.html

のようなエラーの束を与えます

<p>Severity: Warning</p>
<p>Message:  getimagesize(/images/snn-logo-comments.png): failed to open stream: No such file or directory
<p>Severity: Warning</p>
<p>Message:  getimagesize(/images/close-gray.png): failed to open stream: No such file or directory

一部の画像の相対 URL が原因で発生しているようです。ここでの問題は、これによりスクリプトがクラッシュし、画像が読み込まれず、Ajax ボックスが永久に読み込まれることです。

これをトラブルシューティングする方法はありますか?

4

3 に答える 3

1

問題は、画像の URL がサイトのルートに対して相対的であるため、サーバーがそれらを理解してフェッチし、サイズを確認できないことです。この質問を参照して、相対 URL から絶対 URL を取得する方法を理解できます。

于 2012-05-28T22:41:49.853 に答える
0

画像サイズチェックで試したアプローチは正しいです。

ただし、すべてのサイトで機能させるには、何らかの相対URL解析を追加する必要があります。

そのためのライブラリなどがあるかどうかはわかりませんが、その方法の概要は次のとおりです。

  • スクレイピングしているURLのドメイン部分を見つけます
  • /で始まるURLはすべて絶対URLであると想定します。ドメインとパスを連結するだけでこれらを取得できます
  • /で始まらないURLは相対的であると想定します。予想されるパスを見つけるために、URL内の..マーカーを解析する必要がある場合があります
  • ドキュメント内のタグを確認し<base>ます。ドキュメントにタグがある場合、<base>すべての相対パスがタグで定義されたパスに固定されます。

相対パスと絶対パスを使用できるものに変換するライブラリを見つけることができるかもしれませんが、ほとんどの場合、それらは<base>最後のポイントで述べたタグを考慮していません。

于 2012-05-28T22:44:00.273 に答える