【问题标题】:Scrape .xml file for images and mirror directories wget/grep/curl(?)为图像和镜像目录刮取 .xml 文件 wget/grep/curl(?)
【发布时间】:2018-02-28 10:27:27
【问题描述】:

如何为所有图像抓取一个 xml 文件(Wordpress 导出),然后将它们保存在本地,镜像它们的目录?

例如,将 <img src="http://example.com/wp-content/uploads/2015/image.jpg"/> 保存到我的 Mac 上的文件夹 Desktop/ScrapedImages/wp-content/uploads/2015/image.jpg

保留他们的目录很重要。

非常感谢。

【问题讨论】:

  • 任何像样的编程语言或脚本语言都可以做到这一点,你知道任何编程语言吗?
  • 不知道为什么有人对此投了反对票,这个真正的问题几乎已经得到了回答。

标签: xml macos curl grep wget


【解决方案1】:

任何体面的编程/脚本语言都可以做到这一点,你知道任何编程语言吗?

这是一个使用 PHP 的示例:

<?php
$domd=@DOMDocument::loadHTMLFile("export.xml");
foreach($domd->getElementsByTagName("img") as $img){
    $src=$img->getAttribute("src");
    if(empty($src)){
        continue;
    }
    $path=parse_url($src,PHP_URL_PATH);
    if(!is_dir('.'.dirname($path)))
        mkdir('.'.dirname($path).'/', 0777, TRUE);
    file_put_contents('.'.$path,file_get_contents($src));
}

您标记的所有工具都无法自行执行此操作(尽管 wget 的镜像功能已接近,但您需要一个 Web 服务器首先将其提供给 wget。一个聪明的 grep 正则表达式也可以接近,但大约就像用正则表达式解析 html 一样有问题)

(另请注意,上面的代码没有针对内存使用进行优化,它会将整个文件放入内存中,然后再将其刷新到磁盘,所以如果你有 4GB 内存,并且没有交换,并尝试下载一个 5GB 的图像方式,你会遇到 OOM 崩溃。可以通过 fread/fwrite 循环轻松缓解)

编辑:如果您在 php 中有 allow_url_fopen=Off,则可以使用以下函数替换 file_get_contents:

function curl_get_contents(string $url): string {
    try {
        $ch = curl_init ();
        if (! $ch) {
            throw new \RuntimeException ( 'curl_init failed!' );
        }
        if (! curl_setopt_array ( $ch, array (
                CURLOPT_URL => $url,
                CURLOPT_ENCODING => '',
                CURLOPT_RETURNTRANSFER => true 
        ) )) {
            throw new \RuntimeException ( 'curl_setopt_array failed! errno: ' . curl_errno ( $ch ) . ". error: " . curl_error ( $ch ) );
        }
        $ret = curl_exec ( $ch );
        if (! is_string ( $ret )) {
            throw new \RuntimeException ( 'curl_exec failed! errno: ' . curl_errno ( $ch ) . ". error: " . curl_error ( $ch ) );
        }
        return $ret;
    } finally{
        curl_close ( $ch );
    }
}

(通过你的cmets,你有这个问题)

【讨论】:

  • 谢谢你,我试了一下,它似乎镜像了目录,但图像的文件大小都是 0kb。
  • @Mark 哦,你可能在 php.ini 中有allow_url_fopen=Off 然后,我使用 curl 添加了一个替代的 fetch 函数,试试吧
  • 对不起,我没有从该选项中得到任何结果,只是一个空白屏幕。 $url = 'gw-news-export.xml';设置xml文件的URL是否正确?
  • P.S.我的 phpinfo 说 allow_url_fopen=On
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2011-06-29
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多