java - 最简单的工具(Windows平台)来抓取网络并节省文字?

标签 java open-source web-crawler scraper word-frequency

我想抓取网页并保存关键字及其频率。例如,我想从URL中抓取艺术类别:http://www.dmoz.org/Arts/并保存单词列表及其出现频率。所以我想要以下输出

词频
电影 400
歌曲100
杂志120

实现这一目标的最简单方法是什么?任何语言的任何工具或库都会非常有帮助。

最佳答案

好的,我们开始吧。

(少量编辑,主要针对语法,20110316)

我只能抽出时间向您展示该问题的最简单的、非生产就绪的解决方案。如果您需要一次性解决方案,那么这应该可以节省您大量时间。如果您正在寻找生产级工具,那么您会想要完全不同的方式,尤其是如何将 html 简化为直接文本。只需在此处搜索“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 stripper 脚本,例如

$: cat rmhtml3

#! /bin/awk -f
{
        gsub(/[{<].*[>}]/, "")
        gsub("&nbsp;", "")
        gsub(/[ \t][ \t]*/, " ")
        if ($0 !~ /^[ \t]*$/) {
                print $0
        }
}

这会给我们带来“甚至不关心在 awk 中解析 html”的警察;-),所以也许有人会推荐一个简单的命令行 xslt 处理器(或其他),它会比上面的工作更干净。我最近刚刚弄清楚其中的一些问题,并且正在寻找适合 unix 脚本环境的正确解决方案。或者您可以查看 Wikipedia entry for webCrawlers 中列出的开源网络爬虫。

3 -- 创建一个大的 unix-pipeline 来获得你想要的输出。

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 []

希望这有帮助

关于java - 最简单的工具(Windows平台)来抓取网络并节省文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874679/

相关文章:

java - 如何检查给定的 BST 是否有效?

java - 如何让 JTextArea 粘在窗口上

java - JavaEE 的 MusicBrainz 替代方案

lucene - 推荐使用 Lucene 或 Solr 的爬虫工具?

ruby - 使用 Anemone Web Spider 进行 HTTP 基本身份验证

java - 时间不会在 Applet 中重新绘制

java - 整数的 JTextfield 监听器

.net - FOSS 智能字符识别 (ICR)

javascript - 我应该如何组织一个JS开源库项目?

html - VBA Excel点击 "submit"后提取新的网页数据