簡體   English   中英

Python中的多步驟並發HTTP請求

[英]Multi-step, concurrent HTTP requests in Python

我需要在Python中進行一些三步式的Web抓取。 我最初抓取了幾個基本頁面,我需要從這些頁面上獲取一些選擇鏈接,並檢索它們指向的頁面,然后再重復一次。 訣竅是我想異步完成所有操作,以便盡快觸發每個請求,並且不會在單個請求上阻止整個應用程序。 我該怎么做?

到目前為止,我一直在使用eventlet一步eventlet ,如下所示:

urls = ['http://example.com', '...']
def scrape_page(url):
    """Gets the data from the web page."""
    body = eventlet.green.urllib2.urlopen(url).read()
    # Do something with body
    return data

pool = eventlet.GreenPool()
for data in pool.imap(screen_scrape, urls):
    # Handle the data...

但是,如果我擴展此技術並包括一個嵌套的GreenPool.imap循環,它將阻塞直到該組中的所有請求完成,這意味着該應用程序無法根據需要啟動更多請求。

我知道我可以用Twisted或其他異步服務器來做到這一點,但是我不需要這么大的庫,我寧願使用輕量級的東西。 我願意接受建議。

這是一個主意...但是請原諒我,因為我不知道eventlet。 我只能提供一個粗略的概念。

考慮您的“步驟1”生產者。 創建一個隊列,並讓您的步驟1工作人員將他們找到的所有新URL放入隊列。

創建另一個工人池。 讓這些工作人員從隊列中拉出URL並進行處理。 如果在他們的處理過程中發現另一個URL,請將其放入隊列。 他們將繼續為以后的工作加油。

從技術上講,這種方法可以使其輕松地遞歸超過1,2,3+個步驟。 只要他們找到新的url並將它們放在隊列中,工作就會不斷發生。

更好的是,從隊列中的原始URL開始,然后創建一個將新URL放入同一隊列的單個池。 只需要一個游泳池。

張貼便條

有趣的是,在我發布了這個答案並查找了與事件“隊列”等效的內容之后,我立即找到了一個示例,准確地說明了我的描述:

http://eventlet.net/doc/examples.html#producer-consumer-web-crawler

在該示例中,有一個producerfetch方法。 生產者開始從隊列中提取URL並生成線程以進行fetch 然后, fetch將所有新的url放回隊列中,並且它們彼此之間不斷進行饋送。

暫無
暫無

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

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