簡體   English   中英

Python中的分布式計算-Web搜尋器

[英]Distributed computing in Python - web crawler

我的目標是建立一個分布式搜尋器,一次可以處理多個網站,也可以處理多個查詢。 為此,我使用“ requests”和“ BeautifulSoup”等標准包在Python中構建了一個Web搜尋器。 工作正常。 為了使其分布,我使用了rabbitMQ。 它有1個以上的過程可幫助我進行爬網,從而使我可以使系統更快。

我的系統在工作池模型中工作:

  • 我有一個主服務器接收查詢並為每個查詢開始新的爬網。
  • 開始抓取時,通過將查詢輸入搜索引擎來收集一些URL。
  • 從現在開始,主服務器使用RabbitMQ將URL發送到可用的worker /進程,並等待從它們接收更多的URL。

但是,我在這種體系結構中有一個巨大的瓶頸,它不是主要的服務器... RabbitMQ不允許我一次消耗多個消息(channel.basic_qos()函數不起作用!)。 我想要的是為每個查詢建立一個私有隊列(就像我現在所擁有的),並能夠盡快同時處理這兩個查詢。 通過這種方式,並行化工作程序代碼,以便它可以處理最大數量的url,而不是一次處理1個url。

在這里我應該用什么來代替RabbitMQ? 我專門接觸了rabbitMQ的開發人員,但我想做的事無法解決,所以我試圖找到一個不同的“分發包”。 也許卡夫卡?

首先,您必須確定程序的限制。 是I / O綁定還是CPU綁定?

例如,如果程序的簡單非並行版本可以使網絡連接飽和,則制作並行版本沒有用。

對於網絡爬蟲而言,通常是網絡是最終的瓶頸。

但是,假設您有足夠的網絡容量。 在那種情況下,我建議使用multiprocessing.Pool 充當工作進程的函數將URL作為輸入,並從URL返回已處理的數據。 您創建一個池,並使用imap_unordered方法將輔助函數應用於URL列表。

def worker(url):
   rv = requests.get(url)
   # Do whatever processing is needed.
   result = ...
   return (url, result)

urls = ['www.foo.com', ...]
p = multiprocessing.Pool()
for url, result in p.imap_unordered(worker, urls):
    print('The URL ', url, 'returned ', result)

默認情況下, Pool將使用與CPU核心數量一樣多的工作線程。 使用更多的工人通常沒有用。

請注意,工作程序的返回值必須從工作程序進程返回到父進程。 因此它必須是可腌制的。 如果您必須返回大量數據,則可能成為IPC瓶頸。 在這種情況下,最好將其寫入例如基於RAM的文件系統,然后僅返回數據文件的文件名。

暫無
暫無

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

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