67

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

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

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

更新

所以我刚刚发现离线时,默认情况下会wget写入stderr。我在手册页中错过了它(事实上,如果它在那里,我仍然没有找到它)。一旦我将返回值通过管道传输到标准输出,我就更接近了我需要的东西:

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

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

4

3 回答 3

62

我最不想做的就是自己下载并解析所有内容(即创建我自己的蜘蛛)。一旦我了解到 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 发送到第三方工具进行处理以满足我的需求。

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

于 2010-05-14T11:52:24.923 回答
24

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

<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 - 使下载的文件回显到标准输出,而不是保存到磁盘。

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

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

sed 是流编辑器 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/
...
于 2010-05-10T17:06:33.950 回答
7

我使用了一个名为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,但让你更接近!这只是第一级。想象一下把它打包成一个自递归脚本!

于 2013-05-09T16:37:05.213 回答