仅限蜘蛛网站和返回网址

Rob*_*son 58 grep uri wget web-crawler

我正在寻找伪蜘蛛网站的方法.关键是我实际上并不想要内容,而是一个简单的URI列表.我可以使用该选项与Wget合理地接近这个想法--spider,但是当通过a输出输出时grep,我似乎无法找到合适的魔法来使其工作:

wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'
Run Code Online (Sandbox Code Playgroud)

grep过滤器似乎完全没有对影响wget输出.我有什么不对或者是否有其他工具我应该尝试更适合提供这种有限的结果集?

UPDATE

所以我发现离线时默认情况下会wget写入stderr.我在手册页中错过了(事实上,如果它在那里我仍然没有找到它).一旦我把回归到stdout,我就更接近我需要的东西了:

wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'
Run Code Online (Sandbox Code Playgroud)

如果有的话,我仍然会对其他/更好的手段感兴趣.

Rob*_*son 48

绝对最后我想要做的就是下载和分析所有的内容我自己的(即创建自己的蜘蛛).一旦我得知Wget默认写入stderr,我就能将它重定向到stdout并适当地过滤输出.

wget --spider --force-html -r -l2 $url 2>&1 \
  | grep '^--' | awk '{ print $3 }' \
  | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
  > urls.m3u
Run Code Online (Sandbox Code Playgroud)

这给了我一个内容资源列表(不是图像,CSS或JS源文件的资源)被蜘蛛网的URI.从那里,我可以将URI发送到第三方工具,以便处理以满足我的需求.

输出仍然需要稍微简化(它产生重复,如上所示),但它几乎在那里,我不必自己进行任何解析.

  • `wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2>&1 | grep -Eio http.+ mp3`对我来说是个不错的魔术票.谢谢! (4认同)
  • 我通常将该输出传递给`sort | uniq`删除重复项,仅供参考. (4认同)
  • 我知道这个答案已经过了5年但是你能加快这个过程吗?拥有200个网址的网站需要几秒甚至几分钟 (2认同)

Jay*_*lor 21

创建一些正则表达式以从所有地址中提取地址

<a href="(ADDRESS_IS_HERE)">.
Run Code Online (Sandbox Code Playgroud)

这是我将使用的解决方案:

wget -q http://example.com -O - | \
    tr "\t\r\n'" '   "' | \
    grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
    sed -e 's/^.*"\([^"]\+\)".*$/\1/g'
Run Code Online (Sandbox Code Playgroud)

这将从网页输出所有http,https,ftp和ftps链接.它不会给你相对的网址,只提供完整的网址.

有关管道命令系列中使用的选项的说明:

wget -q使它没有过多的输出(安静模式).wget -O - 使得下载的文件回显到stdout,而不是保存到磁盘.

tr是unix字符转换器,在此示例中用于将换行符和制表符转换为空格,以及将单引号转换为双引号,以便我们可以简化正则表达式.

grep -i使搜索不区分大小写的grep -o使它只输出匹配的部分.

sed是Stream EDitor unix实用程序,它允许进行过滤和转换操作.

sed -e只是让你给它一个表达式.

在" http://craigslist.org " 上运行这个小脚本产生了很长的链接列表:

http://blog.craigslist.org/
http://24hoursoncraigslist.com/subs/nowplaying.html
http://craigslistfoundation.org/
http://atlanta.craigslist.org/
http://austin.craigslist.org/
http://boston.craigslist.org/
http://chicago.craigslist.org/
http://cleveland.craigslist.org/
...
Run Code Online (Sandbox Code Playgroud)

  • 我想指出的是,@ Rob想从网站而不是从网页获取所有URL。 (2认同)

Ric*_*ick 6

我使用了一种名为xidel的工具

xidel http://server -e '//a/@href' | 
grep -v "http" | 
sort -u | 
xargs -L1 -I {}  xidel http://server/{} -e '//a/@href' | 
grep -v "http" | sort -u
Run Code Online (Sandbox Code Playgroud)

有点hackish,但让你更近!这只是第一级.想象一下将它打包成一个自递归脚本!