最簡便的爬蟲效率提升方法

昨晚發現放在騰訊云主機上通過crontab定時執行用以爬去斗魚分類頁面數據的爬蟲在執行的時候速度特別慢,于是想通過多線程來提高效率。
打開瀏覽器,鍵入關鍵字“python 多線程”,發現大多數內容都是使用threading、Queue這些看起來很笨重的實例。不過直到multiprocessing.dummy出現在眼前之后,一切都變得辣么簡單。

multiprocessing.dummy 大殺器

multiprocessing.dummy 是multiprocessing的一個子庫,二者的不同之處就是前者應用于線程后者主要應用于進程,而它們實現并行化操作的關鍵則是map()函數。
以我的兩段代碼為例:

def insert_info():
    '''
    通過遍歷游戲分類頁面獲取所有直播間
    '''
    session = requests.session()
    pagecontent = session.get(Directory_url).text
    pagesoup = BeautifulSoup(pagecontent)
    games = pagesoup.select('a')
    col.drop()
    for game in games:
        links = game["href"]
        Qurystr = "/?page=1&isAjax=1"
        gameurl = HOST + links + Qurystr
        gamedata = session.get(gameurl).text
        flag = get_roominfo(gamedata)
    aggregateData()

上邊這段是之前運行在云主機速度真的跟爬似的代碼,通過Directory_url這個地址,獲取到頁面中所有的<a></a>標簽,并獲取到它們的'href',再逐條獲取每個鏈接中的內容,獲取想要的東西,最終完成入庫工作。所有的一切都看似按部就班哈。在我的筆記本上做測試,完成所有2032條數據的爬取共耗時<strong>140.5s</strong>(好特么慢=。=)。

但是在加入multiprocessing.dummy之后,真的是有飛一般的感覺:

from multiprocessing.dummy import Pool

pool = Pool()

def insert_info():
    '''
    通過遍歷游戲分類頁面獲取所有直播間
    '''
    session = requests.session()
    pagecontent = session.get(Directory_url).text
    pagesoup = BeautifulSoup(pagecontent)
    games = pagesoup.select('a')
    gameurl = [HOST + url["href"] + "/?page=1&isAjax=1" for url in games]
    col.drop()
    g = lambda link: session.get(link).text
    gamedata = pool.map(g, gameurl)
    ginfo = lambda data: get_roominfo(data)
    pool.map(ginfo, gamedata)
    aggregateData()

同樣通過Directory_url這一地址獲取頁面中所有標簽<a></a>,然后通過pool.map(g, gameurl)完成'href'值的獲取,最后再用一次pool.map(ginfo,gamedata)完成所有頁面內容的提取和入庫。再一次測試,只需要<strong>33.1s</strong>即可完成。

所以說,如果你的爬蟲也要處理類似的過程,不妨嘗試一下multiprocessing。

更多詳細信息可以參考官方文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容