2015-04-01 73 views
-1

我想从多个网站存档集合。我希望能够维持他们是某种组织。所以将它们存储在镜像目录结构中是理想的。下面是我尝试镜像网站下载特定的文件类型与BASH

wget -m -x -e robots=off --no-parent --accept "*.ext" http://example.com 

当使用“-m”选项它有它去多远任何限制吗? (将它徘徊断了的网站?永远继续?)如果是这样,是它更好地使用

wget -r -x -e robots=off --no-parent --accept "*.ext" --level 2 http://example.com 

这是做到这一点的最合理的方式是什么?我知道“wget”有一个--spider选项,它是否稳定?

编辑

这是我已经找到了解决办法。

我正在查找的文件被标记并存储在服务器端的单个dir中。当尝试变化wget。我能够获得链接和各种文件的结构,但是我一直在使用循环运行链接时遇到问题。所以我想出了这个工作。它有效,但速度很慢。有关如何提高效率的任何建议?

的网站&文件,我试图让

home 
    ├──Foo 
    │ ├──paul.mp3 
    │ ├──saul.mp3 
    │ ├──micheal.mp3 
    │ ├──ring.mp3 
    ├──Bar 
     ├──nancy.mp3 
     ├──jan.mp3 
     ├──mary.mp3 

所以首先我创建的结构, 与我想

taglist.txt 
foo 
bar 
文件的标签文件

剧本

#!/bin/bash 

#this script seems to work until the download part 


URL="http://www.example.com" 
LINK_FILE=taglist.txt 

while read TAG; do 
    mkdir "$TAG" 
    cd "$TAG" 

     # Get the URLs from the page 
     wget -q $URL/$TAG -O - | \tr "\t\r\n'" ' "' | \grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \sed -e 's/^.*"\([^"]\+\)".*$/\1/g' > tmp.urls.txt 
     # Clean and sort URLs 
     grep -i 'http://www.example.com/storage_dir/*' tmp.urls.txt | sort -u > tmp.curls.txt 
      # Download the page with the URL 
      while read TAPE_URL; do 
      #wget -r -A.mp3 $TAPE_URL 
      wget -O tmp.$RANDOM $TAPE_URL 
      done <tmp.curls.txt 
      # Find all the .mp3 links in the files 
      grep -r -o -E 'href="([^"#]+)[.mp3]"' * | cut -d'"' -f2 | sort | uniq > $TAG.mp3.list 
      # Clean Up 
      rm tmp.* 
      # Download the collected URLs 
      wget -i $TAG.mp3.list 
    cd .. 
done <"$LINK_FILE" 

回答

0

通过阅读man页面wget,你会看到以下问题的答案:

  • -m相当于-r -N -l inf --no-remove-listing,这意味着它将(A)递归,(B) (C)不限于任何递归深度,并且(D)保留占位符文件以确保所有文件都已被提取,只从服务器下载文件(如果它比已有版本更新)。

  • 是的,递归将跟随链接到他们可能去的任何地方,这就是为什么默认递归深度为5的原因。然而,通过使用-m,您将关闭深度限制,因此您可能会下载整个Internet到你的电脑。这就是为什么您应该阅读man页面的递归接受/拒绝选项部分。它会告诉你如何限制递归。例如,您可以指定仅遵循特定域中的链接。

  • -r--level 2肯定会限制您的递归,但它会(A)不保证您不会访问其他网站,并且(B)几乎肯定会错过您想要镜像的大量网站

  • --spider不适用于下载文件;它只是用于访问页面。

注意,即使与-m指令,你将最有可能仍无法捕捉你需要真正反映整个网站的所有文件。您需要使用-p选项来获取您访问的每个页面的所有页面先决条件。