文/wangmengcn
發(fā)現(xiàn)放在騰訊云主機(jī)上通過(guò)crontab定時(shí)執(zhí)行用以爬去斗魚分類頁(yè)面數(shù)據(jù)的爬蟲在執(zhí)行的時(shí)候速度特別慢,于是想通過(guò)多線程來(lái)提高效率齐唆。打開(kāi)瀏覽器,鍵入關(guān)鍵字“python 多線程”箍邮,發(fā)現(xiàn)大多數(shù)內(nèi)容都是使用threading茉帅、Queue這些看起來(lái)很笨重的實(shí)例。不過(guò)直到multiprocessing.dummy出現(xiàn)在眼前之后锭弊,一切都變得辣么簡(jiǎn)單堪澎。
multiprocessing.dummy 大殺器
multiprocessing.dummy 是multiprocessing的一個(gè)子庫(kù),二者的不同之處就是前者應(yīng)用于線程后者主要應(yīng)用于進(jìn)程味滞,而它們實(shí)現(xiàn)并行化操作的關(guān)鍵則是map()函數(shù)樱蛤。以我的兩段代碼為例:
def insert_info():
'''
通過(guò)遍歷游戲分類頁(yè)面獲取所有直播間
'''
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()
上邊這段是之前運(yùn)行在云主機(jī)速度真的跟爬似的代碼,通過(guò)Directory_url這個(gè)地址剑鞍,獲取到頁(yè)面中所有的標(biāo)簽昨凡,并獲取到它們的'href',再逐條獲取每個(gè)鏈接中的內(nèi)容蚁署,獲取想要的東西便脊,最終完成入庫(kù)工作。所有的一切都看似按部就班哈光戈。在我的筆記本上做測(cè)試哪痰,完成所有2032條數(shù)據(jù)的爬取共耗時(shí)140.5s(好特么慢=。=)久妆。
但是在加入multiprocessing.dummy之后晌杰,真的是有飛一般的感覺(jué):
from multiprocessing.dummy import Pool
pool = Pool()
def insert_info():
'''
通過(guò)遍歷游戲分類頁(yè)面獲取所有直播間
'''
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()
同樣通過(guò)Directory_url這一地址獲取頁(yè)面中所有標(biāo)簽,然后通過(guò)pool.map(g, gameurl)完成'href'值的獲取筷弦,最后再用一次pool.map(ginfo,gamedata)完成所有頁(yè)面內(nèi)容的提取和入庫(kù)肋演。再一次測(cè)試,只需要33.1s即可完成。
所以說(shuō)惋啃,如果你的爬蟲也要處理類似的過(guò)程哼鬓,不妨嘗試一下multiprocessing。
更多詳細(xì)信息可以參考官方文檔边灭。
今年第六屆大會(huì)PyConChina2016异希,由PyChina.org發(fā)起,CPyUG/TopGeek 等社區(qū)協(xié)辦绒瘦,將在2016年9月10日(上海)9月23日(深圳)10月15日(北京)地舉辦的針對(duì)Python開(kāi)發(fā)者所舉辦的最盛大和權(quán)威的Python相關(guān)技術(shù)會(huì)議称簿,由PyChina社區(qū)主辦,致力于推動(dòng)各類Python相關(guān)的技術(shù)在互聯(lián)網(wǎng)惰帽、企業(yè)應(yīng)用等領(lǐng)域的研發(fā)和應(yīng)用憨降。
您可以點(diǎn)擊此處
了解更多詳情,或者掃描下圖二維碼: