最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬蟲利用多線程爬取 LOL 高清壁紙

 更新時間:2022年06月13日 17:08:36   作者:? Python編程學(xué)習(xí)圈?  ?  
這篇文章主要介紹了Python爬蟲利用多線程爬取 LOL 高清壁紙,通過網(wǎng)站爬取每一個英雄的所有皮膚圖片,全部下載下來并保存到本地,下文爬取過程感興趣的朋友可以參考一下

前言:

隨著移動端的普及出現(xiàn)了很多的移動 APP,應(yīng)用軟件也隨之流行起來。

最近又撿起來了英雄聯(lián)盟手游,感覺還行,PC 端英雄聯(lián)盟可謂是爆火的游戲,不知道移動端的英雄聯(lián)盟前途如何,那今天我們使用到多線程的方式爬取 LOL 官網(wǎng)英雄高清壁紙。

頁面分析

目標網(wǎng)站:英雄聯(lián)盟

官網(wǎng)界面如圖所示,顯而易見,一個小圖表示一個英雄,我們的目的是爬取每一個英雄的所有皮膚圖片,全部下載下來并保存到本地。

次級頁面

上面的頁面我們稱為主頁面,次級頁面也就是每一個英雄對應(yīng)的頁面,就以黑暗之女為例,它的次級頁面如下所示:

我們可以看到有很多的小圖,每一張小圖對應(yīng)一個皮膚,通過 network 查看皮膚數(shù)據(jù)接口,如下圖所示:

我們知道了皮膚信息是一個 json 格式的字符串進行傳輸?shù)?,那么我們只要找到每個英雄對應(yīng)的 id,找到對應(yīng)的 json 文件,提取需要的數(shù)據(jù)就能得到高清皮膚壁紙。

然后這里黑暗之女的 json 的文件地址是:

hero_one?=?'https://game.gtimg.cn/images/lol/act/img/js/hero/1.js'

這里其實規(guī)律也非常簡單,每個英雄的皮膚數(shù)據(jù)的地址是這樣的:

url?=?'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(id)

那么問題來了 id 的規(guī)律是怎么樣的呢?這里英雄的 id 需要在首頁查看,如下所示:

我們可以看到兩個列表[0,99],[100,156],即 156 個英雄,但是 heroId 卻一直到了 240….,由此可見,它是有一定的變化規(guī)律的,并不是依次加一,所以要爬取全部英雄皮膚圖片,需要先拿到全部的heroId。

抓取思路

為什么使用多線程,這里解釋一下,我們在爬取圖片,視頻這種數(shù)據(jù)的時候,因為需要保存到本地,所以會使用大量的文件的讀取和寫入操作,也就是 IO 操作,試想一下如果我們進行同步請求操作;

那么在第一次請求完成一直到文件保存到本地,才會進行第二次請求,那么這樣效率非常低下,如果使用多線程進行異步操作,效率會大大提升。

所以必然要使用多線程或者是多進程,然后把這么多的數(shù)據(jù)隊列丟給線程池或者進程池去處理;

在 Python 中,multiprocessing Pool 進程池,multiprocessing.dummy 非常好用。

  • multiprocessing.dummy模塊:dummy模塊是多線程;
  • multiprocessing模塊:multiprocessing是多進程;

multiprocessing.dummy模塊與multiprocessing模塊兩者的 api 都是通用的,代碼的切換使用上比較靈活;

我們首先在一個測試的 demo.py 文件抓取英雄 id,這里的代碼我已經(jīng)寫好了,得到一個儲存英雄 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 這里不做展示

構(gòu)建的 url:

page = 'http://www.bizhi88.com/s/470/{}.html'.format(i)

這里的 i 表示 id,進行 url 的動態(tài)構(gòu)建;

那么我們定制兩個函數(shù)一個用于爬取并且解析頁面(spider),一個用于下載數(shù)據(jù)  (download),開啟線程池,使用 for 循環(huán)構(gòu)建存儲英雄皮膚 json 數(shù)據(jù)的 url,儲存在列表中,作為 url 隊列,使用 pool.map() 方法執(zhí)行 spider (爬蟲)函數(shù);

def?map(self,?fn,?*iterables,?timeout=None,?chunksize=1):
????"""Returns?an?iterator?equivalent?to?map(fn,?iter)”“”
#?這里我們的使用是:pool.map(spider,page)?# spider:爬蟲函數(shù);page:url隊列

作用:將列表中的每個元素提取出來當(dāng)作函數(shù)的參數(shù),創(chuàng)建一個個進程,放進進程池中;

參數(shù)1:要執(zhí)行的函數(shù);

參數(shù)2:迭代器,將迭代器中的數(shù)字作為參數(shù)依次傳入函數(shù)中;

json數(shù)據(jù)解析

這里我們就以黑暗之女的皮膚的 json 文件做展示進行解析,我們需要獲取的內(nèi)容有:

  • 1.name
  • 2.skin_name
  • 3.mainImg

因為我們發(fā)現(xiàn) heroName 是一樣的,所以把英雄名作為該英雄的皮膚文件夾名,這樣便于查看保存;

item?=?{}
item['name']?=?hero["heroName"]
item['skin_name']?=?hero["name"]
if?hero["mainImg"]?==?'':
???continue
item['imgLink']?=?hero["mainImg"]

有一個注意點:

有的 mainImg 標簽是空的,所以我們需要跳過,否則如果是空的鏈接,請求時會報錯;

數(shù)據(jù)采集

導(dǎo)入相關(guān)第三方庫

import?requests?#?請求
from?multiprocessing.dummy?import?Pool?as?ThreadPool?#?并發(fā)
import?time?#?效率
import?os?#?文件操作
import?json?#?解析

頁面數(shù)據(jù)解析

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 模塊創(chuàng)建文件夾,前面我們有說到,每個英雄的 heroName 的值是一樣的,借此創(chuàng)建文件夾并命名,方便皮膚的保存(歸類),然后就是這里圖片文件的路徑需要仔細,少一個斜杠就會報錯。

main() 主函數(shù)

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()

說明:

  • 在主函數(shù)里我們首選創(chuàng)建了六個線程池;
  • 通過 for 循環(huán)動態(tài)構(gòu)建 20 條 url,我們小試牛刀一下,20 個英雄皮膚,如果爬取全部可以對之前的 idList 遍歷,再動態(tài)構(gòu)建 url;
  • 使用 map() 函數(shù)對線程池中的 url 進行數(shù)據(jù)解析存儲操作;
  • 當(dāng)線程池 close 的時候并未關(guān)閉線程池,只是會把狀態(tài)改為不可再插入元素的狀態(tài);

程序運行

if?__name__?==?'__main__':
????main()

結(jié)果如下:

當(dāng)然了這里只是截取了部分圖像,總共爬取了 200+ 張圖片,總體來說還是可以。

總結(jié)

本次我們使用了多線程爬取了英雄聯(lián)盟官網(wǎng)英雄皮膚高清壁紙,因為圖片涉及到 IO 操作,我們使用并發(fā)方式進行,大大提高了程序的執(zhí)行效率。

到此這篇關(guān)于Python爬蟲利用多線程爬取 LOL 高清壁紙的文章就介紹到這了,更多相關(guān)Python 爬取壁紙內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV+python實現(xiàn)實時目標檢測功能

    OpenCV+python實現(xiàn)實時目標檢測功能

    這篇文章主要介紹了OpenCV+python實現(xiàn)實時目標檢測功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • python ansible服務(wù)及劇本編寫

    python ansible服務(wù)及劇本編寫

    python語言是運維人員必會的語言,而ansible是一個基于Python開發(fā)的自動化運維工具 (saltstack)。其功能實現(xiàn)基于SSH遠程連接服務(wù);ansible可以實現(xiàn)批量系統(tǒng)配置、批量軟件部署、批量文件拷貝、批量運行命令等功能
    2017-12-12
  • Python連接Kingbase的實現(xiàn)示例

    Python連接Kingbase的實現(xiàn)示例

    Kingbase是一種開源的數(shù)據(jù)庫管理系統(tǒng),與Oracle數(shù)據(jù)庫的語法和功能非常相似,本文主要介紹了Python連接Kingbase的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Python數(shù)據(jù)分析之pandas讀取數(shù)據(jù)

    Python數(shù)據(jù)分析之pandas讀取數(shù)據(jù)

    Pandas讀取的文件主要有CSV,TXT和JSON,今天就整理了這3種文件格式的讀取和導(dǎo)出代碼,文中有非常詳細的代碼示例及介紹,需要的朋友可以參考下
    2021-06-06
  • PyCharm實現(xiàn)遠程調(diào)試的全過程(附圖文講解)

    PyCharm實現(xiàn)遠程調(diào)試的全過程(附圖文講解)

    這篇文章主要介紹了PyCharm實現(xiàn)遠程調(diào)試的全過程,文中通過圖文結(jié)合的方式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了

    分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了

    這篇文章主要介紹了分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了一勞永逸,需要的朋友可以參考下
    2020-12-12
  • Python實現(xiàn)緩存的兩個簡單方法

    Python實現(xiàn)緩存的兩個簡單方法

    緩存是一種用于提高應(yīng)用程序性能的技術(shù),它通過臨時存儲程序獲得的結(jié)果,以便在以后需要時重用它們,本文將學(xué)習(xí)Python中的不同緩存技術(shù),感興趣的可以了解下
    2024-11-11
  • Python中單線程、多線程和多進程的效率對比實驗實例

    Python中單線程、多線程和多進程的效率對比實驗實例

    這篇文章主要介紹了Python單線程多線程和多進程效率對比,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python使用threading獲取線程函數(shù)返回值的實現(xiàn)方法

    python使用threading獲取線程函數(shù)返回值的實現(xiàn)方法

    這篇文章主要介紹了python使用threading獲取線程函數(shù)返回值的實現(xiàn)方法,需要的朋友可以參考下
    2017-11-11
  • Python中的response.text與content區(qū)別詳解

    Python中的response.text與content區(qū)別詳解

    這篇文章主要介紹了Python中的response.text與content區(qū)別詳解,?從網(wǎng)絡(luò)請求下來的數(shù)據(jù),他們都是字節(jié)類型的,如果服務(wù)器不指定的話,默認編碼是"ISO-8859-1",我們使用text直接拿到的是字符串類型,沒有進行解碼操作,則會出現(xiàn)亂碼問題,需要的朋友可以參考下
    2023-12-12

最新評論

岳池县| 侯马市| 嘉峪关市| 朔州市| 武陟县| 阿荣旗| 通许县| 新邵县| 乐昌市| 五指山市| 喜德县| 上林县| 民勤县| 河津市| 航空| 通海县| 东平县| 汝城县| 遂溪县| 当涂县| 新巴尔虎右旗| 响水县| 镇宁| 黎川县| 新民市| 马龙县| 尚志市| 电白县| 满洲里市| 江安县| 乌拉特前旗| 苗栗县| 安福县| 山阳县| 淅川县| 滁州市| 凤翔县| 兴化市| 安阳县| 晴隆县| 吉木萨尔县|