只蜘蛛网站和返回url
我正在寻找一种伪蜘蛛网站的方式。 关键是我实际上不需要内容,而是一个简单的URI列表。 我可以使用--spider
选项使用Wget合理地接近这个想法,但是当通过grep
输出pipe道时,我似乎无法find使它工作的正确的法术:
wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'
grep
filter似乎对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?