1

我正在尝试创建一个 PHP 函数,该函数从您作为参数输入的网页下载图像。然而,网页本身虽然是一种画廊,只有非常小的图像缩略图版本,每个都直接链接到我想下载到本地计算机的较大的完整 jpeg 图像。所以图像不会直接从我放入函数的网页本身下载,而是从网页上这些 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函数将网页的完整 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

这通常称为“抓取”网站。您已经在检索页面的标记,因此您有了一个良好的开端。

这是您接下来需要做的事情:

<?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 回答