1

パラメータとして入力した Web ページから画像をダウンロードする PHP 関数を作成しようとしています。ただし、Web ページ自体は一種のギャラリーであり、画像の非常に小さなサムネイル バージョンしかなく、ローカル コンピューターにダウンロードしたい大きな完全な jpeg 画像に直接リンクしています。したがって、画像は、関数に入れた Web ページ自体から直接ダウンロードされるのではなく、Web ページ上のこれらの jpeg 画像ファイルへの個々のリンクからダウンロードされます。

たとえば、次のようになります。

www.somesite.com/galleryfullofimages/

は画像ギャラリーの場所です。

そして、必要なギャラリーの各 jpeg 画像ファイルは、次のような場所にあります。

www.somesite.com/galleryfullofimages/images/01.jpg
www.somesite.com/galleryfullofimages/images/02.jpg
www.somesite.com/galleryfullofimages/images/03.jpg

私がこれまでにやろうとしてきたことは、file_get_contents関数を使用して Web ページの完全な html を文字列として取得し<a href="images/01.jpg">、引用符内のすべての要素を分離して配列内に配置しようとすることです。次に、この配列を使用して各画像を見つけ、ループですべてダウンロードします。

これは私がこれまでに行ったことです:

<?php

$link = "http://www.somesite.com/galleryfullofimages/";
$contents = file_get_contents($link);

$results = preg_split('/<a href="[^"]*"/', $contents);

?>

しかし、私はこの時点で立ち往生しています。私は正規表現もまったく初めてで、ご覧のとおり使用しようとしました。各画像リンクを分離して画像をダウンロードするにはどうすればよいですか? または、これを完全に行うより良い方法はありますか?cURLの使用についても読みました。しかし、私はそれを実装することもできないようです。

これがすべて理にかなっていることを願っています。どんな助けでも大歓迎です。

4

1 に答える 1

4

これは一般に、Web サイトの「スクレイピング」として知られています。すでにページのマークアップを取得しているので、良いスタートを切ることができます。

次に行う必要があるのは次のとおりです。

<?php
// Load the retrieved markup into a DOM object using PHP's
// DOMDocument::loadHTML method.
    $docObj = new DOMDocument();
    $docObj->loadHTML($contents);

// Create a XPath object.
    $xpathObj = new DOMXpath($docObj);

// Query for all a tags. You can get very creative here, depending on your
// understanding of XPath. For example, you could change the query to just
// return the href attribute directly. This code returns all anchor tags in
// the page, if the href attribute ends in ".jpg".
    $elements = $xpathObj->query('//a[ends-with(@href,".jpg")]');

// Process the discovered image URL's. You could use cURL for this,
// or file_get_contents again (since your host has allow_url_fopen enabled)
// to fetch the image directly and then store it locally.
    foreach ($elements as $domNode)
    {
        $url = $domNode->getAttribute('href');
    }
?>

DOMDocument::loadHTML
XPath
XPath::query
allow_url_fopen

于 2012-09-16T02:55:11.487 に答える