仅限蜘蛛网站和返回网址

时间:2010-05-10 16:37:18

标签: grep uri wget web-crawler

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

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

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

更新

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

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

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

3 个答案:

答案 0 :(得分:47)

我想要做的绝对最后事情是自己下载并解析所有内容(即创建我自己的蜘蛛)。一旦我得知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

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

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

答案 1 :(得分:21)

创建一些正则表达式以从所有

中提取地址
<a href="(ADDRESS_IS_HERE)">.

以下是我将使用的解决方案:

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链接。它不会给你相对的网址,只提供完整的网址。

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

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

答案 2 :(得分: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

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