ホームページ  >  記事  >  バックエンド開発  >  PHP を使用してインターネット上のすべての画像をダウンロードする

PHP を使用してインターネット上のすべての画像をダウンロードする

王林
王林オリジナル
2023-06-13 09:41:591757ブラウズ

インターネットの普及に伴い、写真は人々の日常生活に欠かせないものとなり、ソーシャルメディア、ニュース情報、個人の日記などにおいて、写真は非常に重要な役割を果たしています。そこで、PHP を使用してインターネット上のすべての画像をダウンロードし、画像に関連する機能をさらに提供する方法を自然に考えました。次の記事では、PHP を使用してインターネット上のすべての画像をダウンロードする具体的な方法とテクニックに焦点を当てます。

  1. インターネット上の画像リンクを取得する

インターネット上の画像をダウンロードするには、まず画像のソースを明確にする必要があります。一般に、Web ページ上の画像はimg タグが参照されるため、HTML ページのコードを解析することで画像リンクを取得できます。 PHP では、CURL または file_get_contents 関数を使用して、ページの HTML コードを取得できます。

$url = 'https://www.example.com';
$html = file_get_contents($url);

HTML コードを取得した後、正規表現を使用して、その中の画像リンクを照合できます。 .jpg、.jpeg、.png、.gif で終わるすべてのリンクを取得したいとします。次の正規表現を使用できます。

preg_match_all('/<img.*?src=["'](.+?.(?:jpg|jpeg|png|gif))["'].*?>/i', $html, $matches);
$links = array_unique($matches[1]);

上記のコードでは、preg_match_all 関数は正規表現を使用して HTML と一致させます。 img タグを入力し、$matches[1] を通じてすべての画像リンクを取得し、array_unique 関数を使用して重複リンクを削除します。

  1. 画像をダウンロードしてローカルに保存します

画像へのリンクを取得したら、curl または file_get_contents 関数を使用して画像をローカルにダウンロードできます。同じ名前のファイルがダウンロードされるのを避けるために、各ファイルに一意のファイル名を付けることができます。簡単な方法は、現在の時刻と MD5 値に基づいてファイル名を生成することです:

foreach ($links as $link) {
    $extension = pathinfo(parse_url($link, PHP_URL_PATH), PATHINFO_EXTENSION);
    $filename = md5($link . time()) . '.' . $extension;
    file_put_contents($filename, file_get_contents($link));
}

上記のコードでは、foreach ループを使用してすべての画像リンクを走査し、parse_url 関数を使用してパスを取得します。リンク内 (ドメイン名部分を除く) を使用し、次に pathinfo 関数を使用してパス内の拡張子を取得し、最後に file_get_contents 関数を使用して画像をローカルにダウンロードし、file_put_contents 関数を使用してダウンロードしたファイルの内容を保存します。ローカルファイル。各ファイル名は一意であるため、名前が重複することを心配する必要はありません。

  1. ダウンロード例外の処理

画像のダウンロード中に、画像のリンクが利用できない、ダウンロード速度が遅すぎる、などの異常な状況が発生することがあります。等このような異常事態によるプログラムへの悪影響を回避するために、ダウンロード処理で例外処理を行うことができます。たとえば、ファイルのダウンロードが失敗した場合、エラー メッセージを出力したり、ログを記録したりできます。

foreach ($links as $link) {
    $extension = pathinfo(parse_url($link, PHP_URL_PATH), PATHINFO_EXTENSION);
    $filename = md5($link . time()) . '.' . $extension;
    $content = @file_get_contents($link);
    if ($content !== false) {
        file_put_contents($filename, $content);
    } else {
        error_log('Failed to download ' . $link);
    }
}

上記のコードでは、エラー マスク @ を使用して file_get_contents 関数のエラー プロンプトをマスクし、判定構造体を使用してダウンロード結果を確認し、error_log 関数を使用してエラー情報を記録します。

  1. ダウンロード速度の制御

画像を大規模にダウンロードする場合は、ダウンロード速度の問題も考慮する必要があります。ダウンロード速度が速すぎると、サーバーに不要な負荷がかかる可能性があり、サーバーによる悪意のある攻撃とみなされる可能性もあります。したがって、ダウンロード速度を制限する必要があります。

ダウンロード速度を制御するには、スリープ機能を使用してプログラムを一定期間一時停止します。たとえば、画像のダウンロード後にプログラムがサーバーに大きな負荷を与えないように、画像のダウンロード後に 1 秒の一時停止を設定できます。

foreach ($links as $link) {
    $extension = pathinfo(parse_url($link, PHP_URL_PATH), PATHINFO_EXTENSION);
    $filename = md5($link . time()) . '.' . $extension;
    $content = file_get_contents($link);
    if ($content !== false) {
        file_put_contents($filename, $content);
    } else {
        error_log('Failed to download ' . $link);
    }
    sleep(1);
}

上記のコードでは、sleep 関数を使用します。プログラムを 1 秒間一時停止します。

概要

この記事では、PHP を使用してインターネット上のすべての画像をダウンロードする方法を詳しく説明しました。具体的なアイデアは、最初にすべての画像リンクを取得し、次にすべてのリンクをループし、file_get_contents 関数を使用して画像をダウンロードしてローカルに保存し、最後にダウンロード プロセスで例外処理と速度制御を実行することです。この記事では単純な PHP 実装のみを説明しますが、読者はこの記事の導入を通じてイメージ ダウンロードの実装プロセスをよりよく理解し、習得できるようになり、関連する問題が発生したときに読者がより良いアイデアと解決策を得るのに役立つと信じています。

以上がPHP を使用してインターネット上のすべての画像をダウンロードするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。