mysql - 如何存储整个网页供以后解析?

标签 mysql parsing storage screen-scraping

我最近一直在做大量的网页解析,我的过程通常是这样的:

  1. 获取解析链接列表
  2. 将列表导入数据库
  3. 为每个链接下载整个网页并存储到 mysql
  4. 为每个抓取 session 添加索引
  5. 抓取相关部分(内容、元数据等)
  6. 第 4、5 步——冲洗/重复——因为刮除差异很常见。稍后来自同一页面的内容或修改您的 xpath 或清除所述内容或其他内容。
  7. 将抓取数据库导出到真实数据库并删除网页列和抓取索引

现在,最简单的答案当然是在下载网页的同时进行抓取,但我认为这不太适合模块化设计,因为我希望能够发展这个过程多一点。

让我举一些我一直遇到的问题的例子:对于 50k 页(行),我有一个大约 6gig 的数据库。请记住,我们将整个网页存储到一个列中,然后从中提取相关数据并将其存储到不同的列中。

在具有 6 g 内存的四核上,在表上添加索引可能需要 7-10 分钟。上帝禁止你搞砸某些事情,看着 mysqld 跳到 70% cpu 和你所有的 ram。这是为什么我有第 4 步——我做的每一个操作我都会在我做之前在列​​上添加一个索引——所以如果我想获取元数据,我会在标题列上添加一个索引,然后更新每个标题不为空的行。

我应该声明,我不会一次完成所有行——这往往真的把我搞砸了——因为它应该——你正在将 6gig 加载到内存中。 ;)

我想这个问题的解决方案是——获取总计数,然后每次迭代 100 左右的偏移量。

不过——我认为这里也存在一些存储问题。我应该将原始网页存储在文件系统上吗?我考虑过将页面存储到面向文档的数据库中,例如 mongo 或 couch。

编辑 在这里要明确一点——提出的任何解决方案都应该考虑到 50k 页只是一个用户的一个批处理这一事实。我还没有尝试拥有多个用户,但我希望能够一次存储多个批处理。

最佳答案

为什么不在插入数据之前将索引添加到表中?通过这种方式,索引是在行添加到表中时构建的。

关于mysql - 如何存储整个网页供以后解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171803/

相关文章:

C读取csv文件

iphone - iPhone应用程序存储解决方案

android - Libgdx 外部存储在 Android 上导致 NullPointerException

Mysqli 选择平均计数查询

mysql - 如何连接 2 个表,以便从一个表返回所有数据并与第二个表中的数据配对

python - 如何解析以相同字符开头的简约替代方案

date - Golang 日期解析

c# - 由于数据包格式意外,握手失败

MySQL 选择是否属于 id 的所有值都存在于另一个表中

Python 存储数据