2013-07-30 47 views
1

我在网络上有一个html文件,它几乎每分钟更新一次表格中的新行。在任何时候,该文件都包含近15000行,我想创建一个包含表中所有数据的MySQL表,然后再从可用数据中计算出更多。从数千行的HTML表格中更新MySQL表格

该HTML表格包含,比如最近3天的行。我想将它们全部存储在我的mysql表中,并且每隔一小时左右更新一次表(可以通过cron来完成)?

对于连接到DB,我使用的是MySQLdb,它工作正常。但是,我不确定最佳做法是什么。我可以使用bs4刮取数据,使用MySQLdb连接到表格。但我应该如何更新表格?我应该使用什么逻辑来刮取使用最少资源的页面?

我没有取得任何结果,只是刮和写。

任何指针,请?

+0

你有写过任何代码吗?你的模式的例子也会有帮助! – jsalonen

+0

我所有的代码是,刮取HTML表格行,并一次写入表格。但是,我真正担心的是更新表格和性能问题。 –

+0

制作一个输出CSV的刮板。然后使用LOAD DATA INFILE或类似的方法将CSV加载到mysql中。另外,如果您在提交使用数据之前需要进一步过滤或监视事情,那么使用单独的表进行上传,然后执行INSERT/SELECT进行复制可能是明智的。 – Paul

回答

0

我的建议是逐行更新值,而不是尝试在临时表中使用Bulk Insert,然后根据某个定时键将数据移动到实际表中。如果您有关键列,可以很好地读取最近添加的行。

0

您可以采取以下办法:

为了讨论的目的,让是最终目的地的刮数据。 然后我们可以采取以下步骤:

  1. 从网页上刮去数据。
  2. 在MySQL中的临时表中存储这个被刮取的数据,如temp
  3. 执行EXCEPT操作以仅提取主文件夹中存在的那些行,但不包含临时文件中的那些行。
  4. 主表表内保留在步骤3中获得的行。

请参阅this链接了解如何在MySQL中执行SET操作。另外,建议将所有这些逻辑放在存储过程中,并将其传递给要处理的数据集(不确定这部分是否可用于MySQL) 向方法中添加一个步骤 - 基于在下面的讨论中,我们可以使用基于时间戳的列来确定需要放置到表中的最新行。基于SET的操作的上述方法运行良好,以防没有基于时间戳的列。

+0

这样做的问题在于,尽管HTML表格将具有最后3天的记录,但数据库自从它开始时就会有记录。 –

+0

@KaranGoel我已经更新了我的答案 - 如果您有基于时间的列,您可以根据时间进行比较以确定是否需要将记录插入到数据库中。基于SET的方法在没有基于时间戳的数据属性时效果很好。 –