从存档网站提取并打印所有链接(不是下载内容)

从存档网站提取并打印所有链接(不是下载内容)

我想从存档网站提取并打印所有链接(不是下载内容),即www.foosite.com/archive 遍历所有文件夹和子文件夹。

场景:我在一个像这样的网络存档中 www.foosite.com/archive ,其中包含带有可下载文件的目录和子目录,例如

-man.pdf -.listing.txt |-Books/ |-my_book.pdf |-new_books.pdf |-Classics/ |-Songs |-annie's.song.mp3 |-summer.of.69.mp3 -robot.txt ................ 我将(递归地)遍历所有目录并获取所有(可下载)文件路径(url),例如 https://www.asite.com/man.pdf https://www.asite.com/read.txt https://www.asite.com/Books/my_book.pdf https://www.asite.com/Books/new_books.pdf https://www.asite.com/Classics/..... https://www.asite.com/Classics/........ https://www.asite.com/Songs/annie's.song.mp3 ....... https://www.asite.com/terms.txt ............................

但是我的 shell 脚本,我尝试用 来模拟简单的网页浏览技术lynx,输出陷入了无限递归(认为问题更多的是语法问题而不是实现问题)。

代码:

#!/bin/bash

links=`/usr/bin/lynx -dump -listonly -nonumbers $1`

function dump_primary_links() {

        for link in $links 
        do
            echo "$link" | grep -P "\/$" > /dev/null
            # if link ends with "/" that's a directory 

            if [  $? -eq 0  ]; then
                echo "primary link:$link"
                print_directory_items $link
                 # now recursively traverse the directory 
            else
                echo "$link" # else a normal link

            fi

        done


    }



function print_directory_items() {
    # get contents of directory 
    lst=`/usr/bin/lynx -dump -listonly -nonumbers $link`


     for lnk in $lst 
        do
            echo "$lnk" | grep -P "\/$" > /dev/null 
            # if there is a directory in $lst then travel directory recursively 

            if [  $? -eq 0  ]; then

                link=$lnk
                print_directory_items $link
            else
                echo "$lnk" # directory contents
            fi
       done

    }


get_link

注意:我知道 python(请求和 Beautifulsoup 或 Scrapy)在这种情况下会是很好的解决方案,但我只想一个简单的 UNIX 浏览模拟或“Web 目录遍历”

答案1

您可以使用 镜像网站wget,但您也可以告诉它充当网络蜘蛛,这样它就不会下载任何内容。

所以你可以这样做,但请确保保存日志:

wget --no-directories --mirror --spider "$url" 2>&1 | tee "$log"

就我而言,在日志中我发现了类似这样的内容:

Spider mode enabled. Check if remote file exists.
--2017-12-19 07:19:23--  URL

然后我用来grep检索 URL:

grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' "$log"

例子:

$ wget --no-directories --mirror --spider https://utw.me/file/scripts/ 2>&1 | tee log.txt
...
$ grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' log.txt
...
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2001.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2002.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2003.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2004.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2005.ass
...

答案2

我认为你在寻找过程中陷入了困境https://www.asite.com/Books/(从https://www.asite.com/) 和https://www.asite.com/(来自它的子目录之一)。

wgetcurl并且lynx可以在多种条件下选择向下/获取项目(不要离开初始站点、最大深度为 X、使用 ftp 等)。

附注:

  • 你没有显示完整的代码。
  • print_directory_items用一个参数来调用,但没有抓住它(它在本地被称为$1
  • 优于$( )反引号

相关内容