我怎样才能为所有图像刮取xml文件(Wordpress导出),然后在本地保存它们,镜像他们的目录?
例如,将<img src="http://example.com/wp-content/uploads/2015/image.jpg"/>
保存到我的Mac Desktop/ScrapedImages/wp-content/uploads/2015/image.jpg
上的文件夹中
保留他们的目录很重要。
提前谢谢了。
任何体面的编程/脚本语言都完全有能力做到这一点,你知道任何编程语言吗?
这是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 );
}
}
(根据你的意见,你有这个问题)