我想抓取网页并保存关键字及其频率。例如,我想从 URL:http ://www.dmoz.org/Arts/ 抓取艺术类别,并保存一个单词列表及其频率。所以我想要以下输出
词频
电影 400
歌曲 100
杂志 120
实现这一目标的最简单方法是什么?任何语言的任何工具或库都会非常有帮助。
我想抓取网页并保存关键字及其频率。例如,我想从 URL:http ://www.dmoz.org/Arts/ 抓取艺术类别,并保存一个单词列表及其频率。所以我想要以下输出
词频
电影 400
歌曲 100
杂志 120
实现这一目标的最简单方法是什么?任何语言的任何工具或库都会非常有帮助。
好的,我们开始吧。
(小幅编辑,主要针对语法,20110316)
我只能抽出时间向您展示该问题的最简单、非生产就绪的解决方案。如果您需要一次性解决方案,那么这应该可以为您节省大量时间。如果您正在寻找生产级工具,那么您将希望完全不同,尤其是如何将 html 简化为纯文本。只需在 SO 上搜索“awk html parser”,看看这个解决方案有多么错误;-)(下面有更多关于这个)......无论如何......
1 -- 蜘蛛/捕获文本到文件
wget -nc -S -r -l4 -k -np -w10 --random-wait http://www.dmoz.org/Arts/ #noClobber #server Responses # -r recursive # -l4 4 levels # -k (convert) make links in downloaded HTML point to local files. # -np no-parent. don't ascend to the parent directory. # -w10 wait 10 secs between # --random-wait randomize that 10 secs above from 0-10
这会将所有 www.dmoz.org 文件放在当前目录的目录结构中,从顶部的 www.dmoz.org 开始。如果您愿意,可以将其 CD 下来以查看原始数据。
2 -- 制作一个简单的 html 剥离器脚本,如
$: cat rmhtml3 #! /bin/awk -f { gsub(/[{<].*[>}]/, "") gsub(" ", "") gsub(/[ \t][ \t]*/, " ") if ($0 !~ /^[ \t]*$/) { print $0 } }
这将使“在 awk 中解析 html”警察对我们失望 ;-),所以也许有人会推荐一个简单的命令行 xslt 处理器(或其他),它会比上面的工作更干净。我最近才弄清楚其中的一些,并正在寻找适合 unix 脚本环境的适当解决方案。或者您可以查看Wikipedia entry for webCrawlers 中列出的开源网络爬虫
3 -- 制作一个大的 unix 管道来获得你想要的输出。
find . -name '*.html' | xargs ./rmhtml3 \
| awk 'BEGIN {RS=" ";};{ print $0}' \
| sort | uniq -c \
| sort +0n | tail -50
您可以轻松地将其拆开,并查看每个阶段对流程的添加。
不寻常的一点是
awk 'BEGIN{RS=" ";};{print $0}'
这会将 awk RecordSeparator 重置为空格字符,以便每个单词都打印在单独的行上。
然后很容易对它们进行排序,获取 uniq 项的计数,按排序输出的前导数排序,并且只显示最后 50 个条目。(显然,您可以将其更改为您认为可能有用的任何数字。)
如果您不喜欢查看所有干扰词(the、at、it、....等),请将这些词放入文件中并使用
.... | fgrep -vif skipwords | sort | uniq -c ...
4 -- 让蜘蛛运行 1/2 小时后,我正在查看输出,我看到了一些您想要添加到管道中的其他内容,这些内容留给您作为练习 ;-)
sort -i # ignore upper-lower case while sorting
sed 's/[,]//g # delete all commas. Add any other chars you find inside the []
我希望这有帮助