簡體   English   中英

抓取大型網站的最佳方法是什么?

[英]What is the best approach to scrape a big website?

你好,我正在開發一個網頁抓取工具,我正在一個特定的網站上使用,這個網站有很多 URL,可能超過 1.000.000,為了抓取和獲取信息,我有以下架構。

一組用於存儲訪問過的站點,另一組用於存儲未訪問過的站點。

為了抓取網站,我使用了限制為 2000 個線程的多線程。

這種架構存在內存大小問題,永遠無法完成,因為程序超過了 URL 的內存

在將 URL 放入未訪問的集合之前,我首先檢查該站點是否已被訪問,如果該站點被訪問,則我將永遠不會存儲在未訪問的站點中。

為此,我使用 python,我認為可能更好的方法是將所有站點存儲在數據庫中,但我擔心這會很慢

我可以通過將訪問過的 URL 集存儲在 SQLite 等數據庫中來解決部分問題,但問題是未訪問過的 URL 集太大,超出了所有內存

關於如何使用另一種工具、語言、架構等改進這一點的任何想法?

謝謝

起初,我從不使用 Python 抓取頁面。 我的首選語言是 c#。 但是python應該不錯,或者更好。

好的,您檢測到的第一件事很重要。 僅對您的記憶進行操作是行不通的。 實施一種在硬盤上工作的方法很重要。 如果您只想處理內存,請考慮頁面的大小。

在我看來,您已經獲得了最好的(或好的)網絡抓取/抓取架構。 您需要某種列表,它代表您已經訪問過的 url,以及另一個列表,您可以在其中存儲找到的新 url。 只有兩個列表是最簡單的方法。 因為這意味着,您沒有在爬行中實施某種策略。 如果你不是在尋找類似的東西,好吧。 但是想一想,因為這可以優化內存的使用。 因此,您應該尋找諸如深而寬的爬行之類的東西。 或者遞歸爬取。 將每個分支表示為自己的列表或數組的維度。

此外,將您未訪問過的 url 也存儲在數據庫中有什么問題? 因為你只需要在每個線程上。 如果您將它放入 db 的問題是事實,它可能需要一些時間來瀏覽它,那么您應該考慮為頁面的每個部分使用多個表。

這意味着,您可以為 url 中的每個子字符串使用一個表:

www.example.com/

www.example.com/contact/

www.example.com/download/

www.example.com/content/

www.example.com/support/

www.example.com/news/

因此,如果您的 url 是:“wwww.example.com/download/sweeetcats/”,那么您應該將其放入 wwww.example.com/download/ 的表中。 當您有一組網址時,您必須首先查看正確的表格。 之后,您可以在表格中滑動。

最后,我只有一個問題。 為什么不使用已經支持這些功能的庫或框架? 我認為應該有一些可用於 python 的東西。

2000 個線程太多了。 即使是 1 也可能太多了。 您的抓取工具可能會被視為 DOS(拒絕服務)附件,並且您的 IP 地址將被阻止。

即使您被允許進入,2000 個線程也太多了。 你會在某個地方遇到瓶頸,如果你有一些理智的線程,那個阻塞點可能會導致比你能做到的更慢。 建議嘗試 10. 一種看待它的方式——每個線程將在獲取 URL(網絡密集型)和處理它(cpu 密集型)之間翻轉。 因此,CPU 數量的 2 倍是另一個可能的限制。

您需要一個隱藏的數據庫。 這將讓您置頂並重新啟動該過程。 更重要的是,它可以讓你修正錯誤,並釋放一個新的履帶,而不必扔掉所有的信息。

數據庫不會是慢的部分。 主要步驟:

  • 選擇一個頁面(並將其鎖定在數據庫中以避免冗余)。
  • 獲取頁面(這可能是最慢的部分)
  • 解析頁面(或者這可能是最慢的)
  • 將結果存儲在數據庫中
  • 重復直到沒有更多的頁面——這可能永遠不會,因為這些頁面會從你下面變出來。

(我多年前就這樣做了。我有一台 0.5GB 的小機器。在分析了大約 100 萬個頁面后我退出了。還有大約 100 萬個頁面等待掃描。而且,是的,我被指控進行了 DOS 攻擊。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM