为图像和镜像目录刮取.xml文件wget / grep / curl(?)

问题描述 投票:-1回答:1

我怎样才能为所有图像刮取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个回答
0
投票

任何体面的编程/脚本语言都完全有能力做到这一点,你知道任何编程语言吗?

这是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正则表达式也可能会接近,但就像bug一样用regex解析html是)

(另请注意,上面的代码没有针对ram使用进行优化,它会将整个文件放入ram中,然后将其刷新到磁盘,所以如果你有4GB ram,没有交换,并尝试以这种方式下载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 );
    }
}

(根据你的意见,你有这个问题)

© www.soinside.com 2019 - 2024. All rights reserved.