www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > AI科技大本營
[導讀]作者|俊欣來源?|關于數據分析與可視化就在11月7日晚間,《英雄聯(lián)盟》S11賽季全球總決賽決斗,在冰島拉開“帷幕”,同時面向全球直播。在經過了5個小時的鏖戰(zhàn),EDG戰(zhàn)隊最終以3:2戰(zhàn)勝來自韓國LCK賽區(qū)的DK戰(zhàn)隊,獲得俱樂部隊史上首座全球總決賽冠軍。奪冠的消息瞬間引爆全網,包括小...


作者 | 俊欣


來源 | 關于數據分析與可視化


就在11月7日晚間,《英雄聯(lián)盟》S11賽季全球總決賽決斗,在冰島拉開“帷幕”,同時面向全球直播。在經過了5個小時的鏖戰(zhàn),EDG戰(zhàn)隊最終以3:2戰(zhàn)勝來自韓國LCK賽區(qū)的DK戰(zhàn)隊,獲得俱樂部隊史上首座全球總決賽冠軍。


奪冠的消息瞬間引爆全網,包括小編的朋友圈也被刷屏了,今天小編就寫一篇與之相關的文章,通過單線程、進程以及異步協(xié)程等方法來抓取英雄聯(lián)盟的皮膚并下載。

傳統(tǒng)數據抓取 VS 高性能數據抓取

傳統(tǒng)的數據抓取都是運行在單線程上的,先用獲取到目標頁面中最大的頁數,然后循環(huán)抓取每個單頁數據并進行解析,按照這樣的思路,會有大量的時間都浪費在等待請求傳回的數據上面,如果在等待第一個頁面返回的數據時去請求第二個頁面,就能有效地提高效率,下面我們就通過單線程、多進程以及異步協(xié)程的方式分別來簡單的實踐一下。

頁面分析

目標網站:https://lol.qq.com/data/info-heros.shtml官網的界面如圖所示,上面的每一張小圖代表每一個英雄,我們知道每一個英雄有多個皮膚,我們的目標就是爬取每一個英雄的所有皮膚,并且保存在本地;打開一個英雄顯示他所有的皮膚,如下圖所示,我們打開瀏覽器里面的開發(fā)者工具,查看皮膚數據的接口,可以看到皮膚的信息是通過json的數據格式來進行傳輸的,并且存放皮膚的url也是有一定規(guī)律的,和英雄的ID相掛鉤url1 = 'https://game.gtimg.cn/images/lol/act/img/js/hero/1.js'
url2 = 'https://game.gtimg.cn/images/lol/act/img/js/hero/2.js'
url3 = 'https://game.gtimg.cn/images/lol/act/img/js/hero/3.js'
url4 = 'https://game.gtimg.cn/images/lol/act/img/js/hero/4.js'
因此我們也可以自己來構造這個url格式'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(i)

單線程方案

我們先來看一下單線程的方案def get_page():
page_urls = []
for i in range(1, 10):
url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(i)
page_urls.append(url)
return page_urls

# 獲取各英雄皮膚的鏈接
def get_img_urls():
results_list = []
page_urls = get_page()
for page_url in page_urls:
res = requests.get(page_url, headers=headers)
result = res.content.decode('utf-8')
result_dict = json.loads(result)
skins_list = result_dict["skins"]

for skin in skins_list:
hero_dict = {}
hero_dict['name'] = skin["heroName"]
hero_dict['skin_name'] = skin["name"]
if skin["mainImg"] == '':
continue
hero_dict['imgUrl'] = skin["mainImg"]
results_list.append(hero_dict)
time.sleep(2)
return results_list

# 將各種皮膚保存到本地
def save_image(index, img_url):
path = "skin/" img_url["name"]
if not os.path.exists(path):
os.makedirs(path)
response = requests.get(img_url['imgUrl'], headers = headers).content
with open('./skin/' img_url['name'] '/' img_url['skin_name']   str(index) '.jpg', 'wb') as f:
f.write(response)
上面的代碼分別代表的獲取各英雄每個皮膚的鏈接,然后再將各英雄的皮膚圖片保存到本地,通過一個主函數將上面的步驟都串聯(lián)到一起def main():
img_urls = get_img_urls()
print("總共有{}個網頁".format(len(img_urls)))
for index, img_url in enumerate(img_urls):
print("目前正處于第{}個".format(img_urls.index(img_url)))
save_image(index, img_url)

print("Done")
爬取這幾個網頁然后保存到本地的時間總共是需要43秒的時間,接下來我們來看一下多進程的爬取所需要的時間。

多進程的抓取方案

首先來簡單的介紹一下進程,進程是系統(tǒng)進行資源分配和調度的最小單位,每一個進程都有自己獨立的地址空間,不同進程之間的內存空間不共享,進程與進程之間的通信是由操作系統(tǒng)來傳遞的,因此通訊效率低,切換開銷大。這里我們簡單的用多進程來抓取一下各個英雄的皮膚def main():
img_urls = get_img_urls()
print("總共有{}個網頁".format(len(img_urls)))
pools = multiprocessing.Pool(len(img_urls))
for index_1, img_url in enumerate(img_urls):
print("目前正處于第{}個".format(img_urls.index(img_url)))
pools.apply_async(save_image, args=(index_1, img_url, ))

pools.close() # 關閉進程池(pool),使其不在接受新的任務。
pools.join() # 主進程阻塞等待子進程的退出, join方法要在close或terminate之后使用
print("Done")
整體下來需要的時間是29秒,比上面的單線程要快出許多。

異步協(xié)程的抓取方案

與異步相對立的則是同步,顧名思義,同步具體指的各個任務并不是獨立進行的,而是按照順序交替進行下去的,在一個任務進行完之后得到結果才進行下一個的任務。而異步則是各個任務可以獨立的運行,一個任務的運行不受另外一個任務的影響。而這里提到的協(xié)程,英文叫做Coroutine,也稱為是微線程,是一種用戶態(tài)的輕量級線程,擁有自己的寄存器上下文和棧,在進行調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候恢復先前保存的寄存器上下文和棧。我們可以利用協(xié)程來實現(xiàn)異步操作,比如在發(fā)出請求的時候,需要等一段時間才能得到返回的結果,但其實這個等待的時候程序完全可以干其他許多的事情,在響應返回之后再切換回來繼續(xù)處理,這樣可以充分利用 CPU 和其他資源。我們這里用協(xié)程來抓取一下各個英雄的皮膚async def save_image(index, img_url):
path = "skin/" img_url["name"]
if not os.path.exists(path):
os.makedirs(path)
response = requests.get(img_url['imgUrl'], headers = headers).content
with open('./skin/' img_url['name'] '/' img_url['skin_name']   str(index) '.jpg', 'wb') as f:
f.write(response)

def main():
loop = asyncio.get_event_loop()
img_urls = get_img_urls()
print("總共有{}個網頁".format(len(img_urls)))
tasks_list = [save_image(index, img_url) for index, img_url in enumerate(img_urls)]
try:
loop.run_until_complete(asyncio.wait(tasks_list))
finally:
loop.close()

print("Done")
一整個跑下來,大概是需要33秒的時間,也是比單線程的43秒要快出很多以上便是用單線程、多進程以及異步協(xié)程的方式來優(yōu)化爬蟲腳本的性能,感興趣的讀者可以自己照著上面的教程與步驟自己去敲一遍代碼,感謝閱讀。





本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉