網絡爬蟲:簡單獲取數據

如何在網絡上獲得自己想要的數據呢,大家首先就會想到網絡爬蟲。python編寫的獲取網絡數據程序是大家最為熟知的爬蟲,今天就來給大家介紹一下如何使用python中的asyncio、aiohttp庫來獲取數據。

網絡爬蟲:簡單獲取數據

Python 3.4以後引入asyncio庫,同時對於異步IO也做了支持。那aiohttp又是什麼呢?aiohttp是在asyncio基礎上封裝的http框架。下面是一段使用asyncio、aiohttp實現獲取數據的程序:

網絡爬蟲:簡單獲取數據

使用上面的程序可以拿到我們必須打開瀏覽器才能看到的數據,下面是獲取自己的html信息日誌

網絡爬蟲:簡單獲取數據

問題

上面的程序只是簡單地循環了10次,看起來是沒有問題的。那如果我循環1000次呢?我們來試試,結果確報出瞭如下錯誤。

網絡爬蟲:簡單獲取數據

ValueError: too many file descriptors in select() 這個錯誤主要是因為windows、linux系統對於文件句柄有限制。windows下面默認打開文件句柄或socket是512, 而linux是1024。

解決

asyncio提供了Semaphore可以限制文件句柄同時打開的數目。因為有了限制,所以不會超過系統的最大值,因此也就不會再報錯了。程序如下:

網絡爬蟲:簡單獲取數據

輸出日誌:

網絡爬蟲:簡單獲取數據

從日誌我們可以看出Semaphore很好地限制了一次請求的數目。如果一次請求的數目超過了這個閾值,則就會就入等待直到上次請求全部完成。我在上面的請求中加了3秒的耗時,此時看到一次只是2個請求在處理,上面的2個請求完成了之後,後面才會繼續。

文章僅供大家參考學習,如果有什麼問題大家可以一起交流。但是希望把技術用在正途上~


分享到:


相關文章: