2015-09-14 101 views
0

任務:Node.js的網頁抓取優化

  1. 從網頁
  2. 刮HTML解析HTML
  3. 清潔數據(刪除空白,執行基本的正則表達式)
  4. 的堅持數據到SQL數據庫。

目標是儘快完成這4個任務,下面是一些可能的示例方法。

樣品可能途徑

多步驟1:刮所有頁面和存儲HTML作爲.txt文件。在將所有HTML存儲爲文本後,運行一個單獨的模塊來解析/清除/保留數據。

多步驟2:刮/解析/清理數據,並存儲在.txt文件。運行一個單獨的模塊將數據插入到數據庫中。

單步:刮/解析/清潔/堅持所有在一個步驟中的數據。

假設:

  1. 被用於刮
  2. 磁盤空間1個專用服務器是無限
  3. 互聯網連接你的平均家庭連接
  4. 內存(8GB)
  5. 沒有評分限制任何網頁
  6. 用戶想刮100萬頁es

我還沒有用node.js進行足夠的測試來建立最佳實踐,但對於優化這些任務的任何見解都將不勝感激。

很明顯,有一些沒有答案的問題(一個典型頁面有多少html,你的解析有多少,請求/響應延遲,正在使用什麼框架來解析數據等),但是一個高最佳實踐/關鍵考慮將是有益的。謝謝。

+1

如果您使用的是node.js,那麼您肯定會想要獲得多個CPU,因此您可能需要對node.js進行集羣或將解析和其他工作分載到子進程。在初始實施時,需要進行大量測量,以確定您的瓶頸在哪裏,以及您在首次實施後應該改進哪些方向。這通常是事先不能完全預測的事情。做一些工作,測量,適應,再次測量,再次適應。你的績效評估過程也同樣重要。 – jfriend00

回答

2

有了這樣的問題,您只能預見什麼才能真正控制瓶頸的某些方面。所以,你從一個聰明但不復雜的實現開始,並花費相當長的時間來弄清楚如何衡量你的性能以及瓶頸在哪裏。

然後,根據瓶頸位置的知識,您提出了一個建議的設計更改,實施該更改並查看您在整體吞吐量方面的差異有多大。然後你再次測量儀器,再次測量,看看你的新瓶頸在哪裏,想出一個關於如何擊敗瓶頸,執行,測量,理論,迭代等的新理論......

你真的不想要過度設計或過度複雜的第一個實現,因爲在你認爲真正的瓶頸將在哪裏很容易出錯。

所以,我可能會用這樣的設計開始了:

創建一個Node.js的過程,它不是絕對沒有,但下載的網頁,並將其寫入到磁盤中。異步I/O在任何地方都不會使用,並且可以配置一次同時有多少個同時下載的頁面。不要解析,只需將原始數據寫入磁盤即可。你會想找到一些非常快速的方式來存儲哪個URL是哪個文件。這可能與將信息附加到文本文件中一樣簡單,或者可能是數據庫寫入,但想法是您只希望它速度很快。

然後,創建另一個Node.js的過程,反覆地從盤劫掠的文件,分析它們,清理數據,並一直持續到您的SQL數據庫。

運行本身的第一node.js的過程,並讓它運行,直到它收集或者1000個網頁或15分鐘(以先到者爲準)來衡量你多少產量是最初能。在運行時,請記下計算機上的CPU利用率和網絡利用率。如果您已經處於第一個node.js過程可能需要的位置,那麼您已完成第一個node.js過程。如果你想讓它變得更快,那麼你需要弄清楚你的瓶頸在哪裏。如果你是CPU綁定的(對於這個I/O任務不太可能),那麼你可以對這些node.js進程進行集羣和運行,爲每個進程提供一組要獲取的URL和一個單獨的地方來編寫他們收集的數據。很可能你是I/O綁定的。這可能是因爲您沒有完全飽和現有的網絡連接(node.js流程花費太多時間等待I/O),或者您已經飽和了網絡連接,現在它已成爲瓶頸。你將不得不弄清楚它是哪一個。如果您添加更多同步網頁抓取並且性能不會增加或甚至下降,那麼您可能已經飽和了您的網絡連接。您還需要注意node.js中的文件I/O子系統飽和,該文件使用限制線程池來實現異步I/O。

對於第二個node.js進程,您遵循類似的過程。給它1,000個網頁,看看它可以多快處理它們。由於您確實有I/O讀取磁盤文件並寫入數據庫,因此您一次需要解析多個頁面,以便在讀取或寫入一個頁面時最大限度地利用CPU出。您可以編寫一個node.js進程來同時處理多個分析項目,也可以將一個node.js進程集羣化。如果您的服務器中有多個CPU,那麼您將希望至少擁有與CPU一樣多的進程。與URL提取器進程不同,解析代碼可能會被嚴格優化以加快速度。但是,像其他性能問題一樣,不要試圖過度優化代碼,直到知道自己受CPU限制,並且它阻礙了你。

然後,如果你的SQL數據庫可以在另一臺電腦,或至少使用另一個磁盤,這可能是一件好事,因爲它從您的其他磁盤寫入那裏分離出來的磁盤寫入。

你在哪裏最初幾個步驟後去將完全取決於你的前幾個步驟學習什麼。衡量瓶頸所在的能力和設計快速實驗以測試瓶頸理論的能力對於快速發展並且不會浪費開發時間來優化錯誤非常重要。

僅供參考,一些家庭互聯網連接ISP可能掀起一番報警與你的數據請求的數量和速度。從一個ISP到另一個ISP,他們對這些信息的處理方式可能會有很大差異。我認爲大多數人最終都有能力限制你的連接,以保護共享同一管道的其他人的服務質量,但我不知道他/她是否會這樣做。

這聽起來像是一個非常有趣的項目,試圖優化和充分利用的。它將成爲一箇中等到高級軟件課程的最終項目。