只蜘蛛网站和返回url

我正在寻找一种伪蜘蛛网站的方式。 关键是我实际上不需要内容,而是一个简单的URI列表。 我可以使用--spider选项使用Wget合理地接近这个想法,但是当通过grep输出pipe道时,我似乎无法find使它工作的正确的法术:

 wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:' 

grepfilter似乎对wget输出没有任何影响。 我有什么不对吗,还是有另一个工具,我应该尝试更适合提供这种有限的结果集?

UPDATE

所以我只是发现离线,默认情况下, wget写入到stderr。 我错过了在手册页(事实上,如果它在那里,我还没有find它)。 一旦我input返回标准输出,我接近我所需要的:

 wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:' 

如果有的话,我仍然会对其他更好的方法感兴趣。

我想要做的绝对最后一件事是自己下载和parsing所有的内容(即创build我自己的蜘蛛)。 一旦我得知Wget默认写入stderr,我可以将它redirect到标准输出并适当地过滤输出。

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

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

输出仍然需要略微精简(它会产生重复,如上所示),但它几乎在那里,我不必自己做任何parsing。

创build几个正则expression式来提取所有的地址

 <a href="(ADDRESS_IS_HERE)">. 

这是我将使用的解决scheme:

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

这将从网页输出所有http,https,ftp和ftps链接。 它不会给你的相关url,只有完整的url。

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

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

tr是unix字符转换器,在本例中用于将换行符和制表符转换为空格,并将单引号转换为双引号,以便简化正则expression式。

grep -i使search不区分大小写grep -o使其仅输出匹配的部分。

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

sed -e只是让你给它一个expression式。

在“ 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/ ... 

我使用了一个叫做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 

有点恶心,但让你更接近! 这只是第一级。 想象一下,把它包装成一个自我recursion的脚本!

看到这个问题/答案的另一种方式来做一个Python脚本: 如何使用Python的Scrapy模块列出我的网站的所有url?