2013-07-30 46 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的方法在沒有基於時間戳的數據屬性時效果很好。 –