解析大量HTML数据并将其存储在DB中

时间:2014-07-03 19:16:11

标签: python database multithreading python-3.x dictionary

我需要从网页解析大约5.000.000条记录(用户数据)。我编写了一个python函数,我将每个记录都作为字典。示例输出:

{'key1': 'value1', 'key2': ['value2'], 'key3:': ['value3a', 'value3b'], 'key4': value4}

它的字典当然是无序的,但更糟糕的是 - 键不是固定的。我也可以得到这样的输出:

{'key2': ['value2'], 'key3:': ['value3a', 'value3b', 'value3c', 'value3d'], 'key4': value4}

{'key3:': ['value3a'], 'key4': value4}

或事件只是一个空字典{}。所以它可能是一个具有普通键值对的字典,键值是列表或只是空字典。字典,元组等没有字典

现在,我想将每条记录存储在数据库中。一个问题是获取整个数据大约需要30天,所以我使用5个线程(现在只有#6; 6天)),它运行我的get_data解析函数:

threading.Thread(target=get_data, args=(userId1, userId120)).start()
threading.Thread(target=get_data, args=(userId120, userId125)).start()
threading.Thread(target=get_data, args=(userId100, userId150)).start()
threading.Thread(target=get_data, args=(userId150, userId200)).start()
threading.Thread(target=get_data, args=(userId200, userId250)).start()

之前我没有使用任何数据库,因此我不想等待6天,并以错误的方式完成整个过程。作为输出,我想得到一个数据库,如:

 key1  |  key2  |      key3
------------------------------------
value1 | value2 | (value3a,value3b)
 NULL  | value2 | (value3a,..,..,..)
 NULL  |  NULL  |      NULL

其中(value3a,value3b)存储在一个单元格中,但可以直接访问该列表中的任何值。

所以我的问题是:我应该使用什么数据库来存储数据以及如何处理多线程,而不是固定数量的键和一个单元格中的一些值?

2 个答案:

答案 0 :(得分:0)

我建议使用multiprocessing.Pool - 它很容易启动N个工作人员并提交一长串工作供他们运行。 threading库很有趣但是较低级别且难以使用。

任何经典的SQL或NoSQL数据库都能够满足您的要求。 Sqlite3是最简单的,但它主要通过单个线程使用,所以我不推荐这个应用程序。 MySQL或Postgres或MongoDB都没关系。由于您不处理资金,后者可能最简单,因为它非常快速,灵活且易于入手。

玩得开心!

答案 1 :(得分:0)

PostgreSQL的最新版本有一些" No-SQL"可以通过各种方式处理列表值列的功能:作为键/值存储,作为JSON数据,作为数组。它也可以在值内索引。这些功能仅在DBMS的最新版本中有所改进(9.2有些,在当前的9.3中更多,在即将到来的9.4中更多)。

通常(99%的postgres用户,以及任何其他关系型dbms),您以这种方式存储数据。相反,您规范化数据(UNfactor列表),以便每一行中每行最多只有一个值。在关系模型中,聚合这些值是查询的工作,例如,在SQL中使用GROUP BY子句。