我最近一直在做大量的网页解析,我的过程通常是这样的:
- 获取解析链接列表
- 将列表导入数据库
- 为每个链接下载整个网页并存储到 mysql
- 为每个抓取 session 添加索引
- 抓取相关部分(内容、元数据等)
- 第 4、5 步——冲洗/重复——因为刮除差异很常见。稍后来自同一页面的内容或修改您的 xpath 或清除所述内容或其他内容。
- 将抓取数据库导出到真实数据库并删除网页列和抓取索引
现在,最简单的答案当然是在下载网页的同时进行抓取,但我认为这不太适合模块化设计,因为我希望能够发展这个过程多一点。
让我举一些我一直遇到的问题的例子:对于 50k 页(行),我有一个大约 6gig 的数据库。请记住,我们将整个网页存储到一个列中,然后从中提取相关数据并将其存储到不同的列中。
在具有 6 g 内存的四核上,在表上添加索引可能需要 7-10 分钟。上帝禁止你搞砸某些事情,看着 mysqld 跳到 70% cpu 和你所有的 ram。这是为什么我有第 4 步——我做的每一个操作我都会在我做之前在列上添加一个索引——所以如果我想获取元数据,我会在标题列上添加一个索引,然后更新每个标题不为空的行。
我应该声明,我不会一次完成所有行——这往往真的把我搞砸了——因为它应该——你正在将 6gig 加载到内存中。 ;)
我想这个问题的解决方案是——获取总计数,然后每次迭代 100 左右的偏移量。
不过——我认为这里也存在一些存储问题。我应该将原始网页存储在文件系统上吗?我考虑过将页面存储到面向文档的数据库中,例如 mongo 或 couch。
编辑 在这里要明确一点——提出的任何解决方案都应该考虑到 50k 页只是一个用户的一个批处理这一事实。我还没有尝试拥有多个用户,但我希望能够一次存储多个批处理。
最佳答案
为什么不在插入数据之前将索引添加到表中?通过这种方式,索引是在行添加到表中时构建的。
关于mysql - 如何存储整个网页供以后解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171803/