【问题标题】:Update a MySQL table from an HTML table with thousands of rows从包含数千行的 HTML 表更新 MySQL 表
【发布时间】:2013-07-30 06:33:02
【问题描述】:

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

上述 HTML 表格包含过去 3 天的行。我想将它们全部存储在我的 mysql 表中,并每隔一小时左右更新一次表(这可以通过 cron 完成吗?)

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

我没有获取任何结果,只是抓取和写入。

请指教一下?

【问题讨论】:

  • 你写过代码吗?您的架构中的示例也会有所帮助!
  • 我所拥有的所有代码是,抓取 HTML 表格行,并将它们一次写入一个表格。但是,我真正担心的是更新表和性能问题。
  • 制作一个输出 CSV 的刮刀。然后使用 LOAD DATA INFILE 或类似方法将 CSV 加载到 mysql 中。此外,如果您在提交使用数据之前需要进一步过滤或监控事物,那么使用单独的表进行上传,然后执行 INSERT/SELECT 进行复制,可能是可取的。
  • 我会先做一个临时实现,对其进行基准测试,并在必要时重写以优化。在你有事情担心之前不要担心!
  • @Paul 我不必写入任何文件。一切都必须独立运行,不需要任何其他层。

标签: python mysql beautifulsoup mysql-python


【解决方案1】:

我的建议不是逐行更新值,而是尝试在临时表中使用批量插入,然后根据一些时间键将数据移动到实际表中。如果您有关键列,可以很好地阅读您添加的最近行。

【讨论】:

    【解决方案2】:

    您可以采用以下方法:

    出于讨论的目的,让 ma​​ster 成为抓取数据的最终目的地。 那么我们可以采取以下步骤:

    1. 从网页中抓取数据。
    2. 将这些抓取的数据存储在 MySQL 中的临时表中,例如 temp
    3. 执行 EXCEPT 操作以仅提取存在于 ma​​ster 中但不存在于 temp 中的那些行。
    4. 将步骤 3 中获得的行保留在 ma​​ster 表中。

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

    【讨论】:

    • 这样做的问题是,虽然 HTML 表将有过去 3 天的记录,但数据库将有从它开始的记录。
    • @KaranGoel 我已经更新了我的答案 - 如果您有基于时间的列,您可以根据时间进行比较以确定是否需要将记录插入数据库。当您的数据没有基于时间戳的属性时,基于 SET 的方法效果很好。
    猜你喜欢
    • 2020-05-08
    • 2017-09-06
    • 1970-01-01
    • 2015-01-04
    • 2021-04-04
    • 1970-01-01
    • 2011-11-22
    • 2016-04-23
    • 2015-06-13
    相关资源
    最近更新 更多