<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
隨著行動端的普及出現了很多的移動 APP,應用軟體也隨之流行起來。
最近又撿起來了英雄聯盟手遊,感覺還行,PC 端英雄聯盟可謂是爆火的遊戲,不知道行動端的英雄聯盟前途如何,那今天我們使用到多執行緒的方式爬取 LOL 官網英雄高清桌布。
目標網站:英雄聯盟
官網介面如圖所示,顯而易見,一個小圖表示一個英雄,我們的目的是爬取每一個英雄的所有面板圖片,全部下載下來並儲存到本地。
次級頁面
上面的頁面我們稱為主頁面,次級頁面也就是每一個英雄對應的頁面,就以黑暗之女為例,它的次級頁面如下所示:
我們可以看到有很多的小圖,每一張小圖對應一個面板,通過 network 檢視面板資料介面,如下圖所示:
我們知道了面板資訊是一個 json 格式的字串進行傳輸的,那麼我們只要找到每個英雄對應的 id,找到對應的 json 檔案,提取需要的資料就能得到高清面板桌布。
然後這裡黑暗之女的 json 的檔案地址是:
hero_one = 'https://game.gtimg.cn/images/lol/act/img/js/hero/1.js'
這裡其實規律也非常簡單,每個英雄的面板資料的地址是這樣的:
url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(id)
那麼問題來了 id 的規律是怎麼樣的呢?這裡英雄的 id 需要在首頁檢視,如下所示:
我們可以看到兩個列表[0,99],[100,156],即 156 個英雄,但是 heroId 卻一直到了 240….,由此可見,它是有一定的變化規律的,並不是依次加一,所以要爬取全部英雄面板圖片,需要先拿到全部的heroId。
為什麼使用多執行緒,這裡解釋一下,我們在爬取圖片,視訊這種資料的時候,因為需要儲存到本地,所以會使用大量的檔案的讀取和寫入操作,也就是 IO 操作,試想一下如果我們進行同步請求操作;
那麼在第一次請求完成一直到檔案儲存到本地,才會進行第二次請求,那麼這樣效率非常低下,如果使用多執行緒進行非同步操作,效率會大大提升。
所以必然要使用多執行緒或者是多程序,然後把這麼多的資料佇列丟給執行緒池或者程序池去處理;
在 Python 中,multiprocessing Pool 程序池,multiprocessing.dummy 非常好用。
multiprocessing.dummy
模組:dummy
模組是多執行緒;multiprocessing
模組:multiprocessing
是多程序;multiprocessing.dummy
模組與multiprocessing
模組兩者的 api 都是通用的,程式碼的切換使用上比較靈活;
我們首先在一個測試的 demo.py 檔案抓取英雄 id,這裡的程式碼我已經寫好了,得到一個儲存英雄 id 的列表,直接在主檔案裡使用即可;
demo.py
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js' res = requests.get(url,headers=headers) res = res.content.decode('utf-8') res_dict = json.loads(res) heros = res_dict["hero"] # 156個hero資訊 idList = [] for hero in heros: hero_id = hero["heroId"] idList.append(hero_id) print(idList)
得到 idList 如下所示:
idlist = [1,2,3,….,875,876,877] # 中間的英雄 id 這裡不做展示
構建的 url:
page = 'http://www.bizhi88.com/s/470/{}.html'.format(i)
這裡的 i 表示 id,進行 url 的動態構建;
那麼我們客製化兩個函數一個用於爬取並且解析頁面(spider),一個用於下載資料 (download),開啟執行緒池,使用 for 迴圈構建儲存英雄面板 json 資料的 url,儲存在列表中,作為 url 佇列,使用 pool.map() 方法執行 spider (爬蟲)函數;
def map(self, fn, *iterables, timeout=None, chunksize=1): """Returns an iterator equivalent to map(fn, iter)」「」 # 這裡我們的使用是:pool.map(spider,page) # spider:爬蟲函數;page:url佇列
作用:將列表中的每個元素提取出來當作函數的引數,建立一個個程序,放進程序池中;
引數1:要執行的函數;
引數2:迭代器,將迭代器中的數位作為引數依次傳入函數中;
json資料解析
這裡我們就以黑暗之女的面板的 json 檔案做展示進行解析,我們需要獲取的內容有:
因為我們發現 heroName 是一樣的,所以把英雄名作為該英雄的面板資料夾名,這樣便於檢視儲存;
item = {} item['name'] = hero["heroName"] item['skin_name'] = hero["name"] if hero["mainImg"] == '': continue item['imgLink'] = hero["mainImg"]
有一個注意點:
有的 mainImg 標籤是空的,所以我們需要跳過,否則如果是空的連結,請求時會報錯;
匯入相關第三方庫
import requests # 請求 from multiprocessing.dummy import Pool as ThreadPool # 並行 import time # 效率 import os # 檔案操作 import json # 解析
頁面資料解析
def spider(url): res = requests.get(url, headers=headers) result = res.content.decode('utf-8') res_dict = json.loads(result) skins = res_dict["skins"] # 15個hero資訊 print(len(skins)) for index,hero in enumerate(skins): # 這裡使用到enumerate獲取下標,以便檔案圖片命名; item = {} # 字典物件 item['name'] = hero["heroName"] item['skin_name'] = hero["name"] if hero["mainImg"] == '': continue item['imgLink'] = hero["mainImg"] print(item) download(index+1,item)
download 下載圖片
def download(index,contdict): name = contdict['name'] path = "面板/" + name if not os.path.exists(path): os.makedirs(path) content = requests.get(contdict['imgLink'], headers=headers).content with open('./面板/' + name + '/' + contdict['skin_name'] + str(index) + '.jpg', 'wb') as f: f.write(content)
這裡我們使用 OS 模組建立資料夾,前面我們有說到,每個英雄的 heroName 的值是一樣的,藉此建立資料夾並命名,方便面板的儲存(歸類),然後就是這裡圖片檔案的路徑需要仔細,少一個斜槓就會報錯。
main() 主函數
def main(): pool = ThreadPool(6) page = [] for i in range(1,21): newpage = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(i) print(newpage) page.append(newpage) result = pool.map(spider, page) pool.close() pool.join() end = time.time()
說明:
if __name__ == '__main__': main()
結果如下:
當然了這裡只是擷取了部分影象,總共爬取了 200+ 張圖片,總體來說還是可以。
本次我們使用了多執行緒爬取了英雄聯盟官網英雄面板高清桌布,因為圖片涉及到 IO 操作,我們使用並行方式進行,大大提高了程式的執行效率。
到此這篇關於Python爬蟲利用多執行緒爬取 LOL 高清桌布的文章就介紹到這了,更多相關Python 爬取桌布內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45