欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python結(jié)合多線程爬取英雄聯(lián)盟皮膚(原理分析)

 更新時(shí)間:2021年05月27日 08:33:46   作者:武亮宇  
多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來提高系統(tǒng)的效率。這篇文章主要介紹了python爬取英雄聯(lián)盟皮膚結(jié)合多線程的方法,需要的朋友可以參考下

1.什么是多線程?

多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的。

為什么要使用多線程
線程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線程之間的隔離程度要小,它們共享內(nèi)存、文件句柄和其他進(jìn)程應(yīng)有的狀態(tài)。

因?yàn)榫€程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

線程比進(jìn)程具有更高的性能,這是由于同一個(gè)進(jìn)程中的線程都有共性多個(gè)線程共享同一個(gè)進(jìn)程的虛擬空間。線程共享的環(huán)境包括進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)等,利用這些共享的數(shù)據(jù),線程之間很容易實(shí)現(xiàn)通信。

操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),必須為該進(jìn)程分配獨(dú)立的內(nèi)存空間,并分配大量的相關(guān)資源,但創(chuàng)建線程則簡單得多。因此,使用多線程來實(shí)現(xiàn)并發(fā)比使用多進(jìn)程的性能要高得多。

總結(jié)起來,使用多線程編程具有如下幾個(gè)優(yōu)點(diǎn):

進(jìn)程之間不能共享內(nèi)存,但線程之間共享內(nèi)存非常容易。

操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線程的代價(jià)則小得多。因此,使用多線程來實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行比使用多進(jìn)程的效率高。

Python 語言內(nèi)置了多線程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡化了 Python 的多線程編程。

2.原理

實(shí)現(xiàn)多線程是采用一種并發(fā)執(zhí)行機(jī)制 。
并發(fā)執(zhí)行機(jī)制原理:簡單地說就是把一個(gè)處理器劃分為若干個(gè)短的時(shí)間片,每個(gè)時(shí)間片依次輪流地執(zhí)行處理各個(gè)應(yīng)用程序,由于一個(gè)時(shí)間片很短,相對于一個(gè)應(yīng)用程序來說,就好像是處理器在為自己單獨(dú)服務(wù)一樣,從而達(dá)到多個(gè)應(yīng)用程序在同時(shí)進(jìn)行的效果 。
多線程就是把操作系統(tǒng)中的這種并發(fā)執(zhí)行機(jī)制原理運(yùn)用在一個(gè)程序中,把一個(gè)程序劃分為若干個(gè)子任務(wù),多個(gè)子任務(wù)并發(fā)執(zhí)行,每一個(gè)任務(wù)就是一個(gè)線程。這就是多線程程序 。

在這里插入圖片描述

3.優(yōu)點(diǎn)

1、使用線程可以把占據(jù)時(shí)間長的程序中的任務(wù)放到后臺去處理 。
2、用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來顯示處理的進(jìn)度。
3、程序的運(yùn)行速度可能加快 。
4、在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等 。
5、多線程技術(shù)在IOS軟件開發(fā)中也有舉足輕重的作用。

4.缺點(diǎn)

1、如果有大量的線程,會影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換。
2、更多的線程需要更多的內(nèi)存空間。
3、線程可能會給程序帶來更多“bug”,因此要小心使用。
4、線程的中止需要考慮其對程序運(yùn)行的影響。
5、通常塊模型數(shù)據(jù)是在多個(gè)線程間共享的,需要防止線程死鎖情況的發(fā)生。

好的廢話不多說,我們直接來實(shí)戰(zhàn)吧

1.進(jìn)入英雄聯(lián)盟官網(wǎng)點(diǎn)擊游戲資料進(jìn)入此畫面

在這里插入圖片描述

2.確定爬取的網(wǎng)頁是同步加載還是異步加載

1.鼠標(biāo)右鍵打開網(wǎng)頁源代碼
2.ctrl+f打開搜索框
3.在搜索框了輸入英雄的名字

在這里插入圖片描述

沒有搜索結(jié)果則為異步加載 3.尋找英雄url地址

回到英雄頁面鼠標(biāo)右擊打開檢查。

在這里插入圖片描述

在獲取的包中找到hero_list.js這個(gè)包 英語翻譯過來英雄列表.js文件

在這里插入圖片描述

點(diǎn)擊網(wǎng)頁上英雄安妮拿回地址再點(diǎn)擊其他英雄拿回地址做比較。

安妮:

在這里插入圖片描述

狂戰(zhàn)士:

在這里插入圖片描述

點(diǎn)擊headers拿回resquests url
安妮:https://game.gtimg.cn/images/lol/act/img/js/hero/1.js
狂戰(zhàn)士:https://game.gtimg.cn/images/lol/act/img/js/hero/2.js

可以發(fā)現(xiàn)變化在最后面 是英雄的id 這樣我們有思路了

1.第一次發(fā)送請求,拿回所有英雄的id和名字
2.第二次請求,得到英雄皮膚名,英雄手機(jī)皮膚url, 英雄電腦皮膚url
3.請求得到 手機(jī)圖片二進(jìn)制數(shù)據(jù), 電腦圖片二進(jìn)制數(shù)據(jù)
4.保存電腦版英雄聯(lián)盟圖片,保存手機(jī)版英雄聯(lián)盟圖片
5.多進(jìn)程實(shí)現(xiàn)保存數(shù)據(jù)

是時(shí)候?qū)懸稽c(diǎn)代碼了。。。嘿嘿

起始地址弄成全局變量

在這里插入圖片描述

觀察網(wǎng)頁

在這里插入圖片描述

1第一次請求,我們要拿回這兩個(gè)數(shù)據(jù)。可以看出preview里面是個(gè)json數(shù)據(jù),導(dǎo)入jsonpath庫進(jìn)行提取數(shù)據(jù)。

在這里插入圖片描述

2第二次請求,得到英雄皮膚名,英雄手機(jī)皮膚url, 英雄電腦皮膚url

在這里插入圖片描述
在這里插入圖片描述

3 請求得到 手機(jī)圖片二進(jìn)制數(shù)據(jù), 電腦圖片二進(jìn)制數(shù)據(jù) 利用try-except語句防止報(bào)錯(cuò)停止代碼運(yùn)行。

在這里插入圖片描述

4.保存電腦版英雄聯(lián)盟圖片,保存手機(jī)版英雄聯(lián)盟圖片,利用try-except語句防止報(bào)錯(cuò)停止代碼運(yùn)行。

在這里插入圖片描述

5.多進(jìn)程實(shí)現(xiàn)保存數(shù)據(jù) 導(dǎo)包:import threading
threading.Thread(target=self.函數(shù)名, args=(用到的參數(shù))) 寫法

在這里插入圖片描述

代碼全解:

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

最后在發(fā)一個(gè)守護(hù)線程防止報(bào)錯(cuò)的模板,大家好好參考。

from threading import Thread
from queue import Queue

class Love(object):
def init(self):
# 隊(duì)列容量,隊(duì)列創(chuàng)建 ,[], {}
self.q = Queue()

def parse_data(self):
    """功能:往隊(duì)列添加數(shù)據(jù)"""
    data = "第{}天----我愛你----"
    for i in range(1, 100):
        # 將數(shù)據(jù)放入隊(duì)列,put的時(shí)候計(jì)數(shù)+1,get不會-1,get需要和task_done一起使用才會-1
        self.q.put(data.format(i))
    # 等待task_done()返回的信號量和put進(jìn)去的數(shù)量一直才會往下執(zhí)行
    # join所完成的工作就是線程同步,即主線程任務(wù)結(jié)束之后,進(jìn)入阻塞狀態(tài),一
    # 直等待其他的子線程執(zhí)行結(jié)束之后,主線程在終止,否則主線程會殺死子線程
    # 主線程結(jié)束后子線程無論是否執(zhí)行完畢都將結(jié)束,因此join的作用就顯現(xiàn)出來了
    self.q.join()

def func2(self):
    """功能:從隊(duì)列中獲取數(shù)據(jù)"""
    while True:
        # 循環(huán)從隊(duì)列中獲取, 取出數(shù)據(jù),隊(duì)列為空的時(shí)候會等待
        result = self.q.get()
        print(result)
        # 使隊(duì)列計(jì)數(shù)-1
        self.q.task_done()

def run(self):
    # 進(jìn)程創(chuàng)建
    """進(jìn)程:功能:往隊(duì)列中添加數(shù)據(jù)"""
    m1 = Thread(target=self.parse_data)
    """進(jìn)程:功能:從隊(duì)列里面獲取數(shù)據(jù)"""
    m2 = Thread(target=self.func2)
    m1.start()
    # 將m2設(shè)置成守護(hù)進(jìn)程 因?yàn)閙2一直是死循環(huán),設(shè)置成守護(hù)進(jìn)程之后當(dāng)主程序代碼運(yùn)行完畢,m2就會結(jié)束,不會成為僵尸進(jìn)程
    # 即只在需要的時(shí)候才啟動(dòng),完成任務(wù)后就自動(dòng)結(jié)束
    m2.daemon = True
    m2.start()
    # 隊(duì)列中維持了一個(gè)計(jì)數(shù),計(jì)數(shù)不為0時(shí)候讓主線程阻塞等待,隊(duì)列計(jì)數(shù)為0的時(shí)候才會繼續(xù)往后執(zhí)行

    m1.join()

if name == ‘main':
love = Love()
love.run()

祝大家學(xué)習(xí)python順利

以上就是python爬取英雄聯(lián)盟皮膚結(jié)合多線程的方法的詳細(xì)內(nèi)容,更多關(guān)于python爬取英雄聯(lián)盟皮膚的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中的文本相似度的計(jì)算方法總結(jié)

    Python中的文本相似度的計(jì)算方法總結(jié)

    在自然語言處理(NLP)領(lǐng)域,文本相似度計(jì)算是一個(gè)常見的任務(wù),本文為大家整理了Python中的文本相似度常見計(jì)算方法,希望對大家有所幫助
    2023-05-05
  • 使用Python判斷一個(gè)文件是否被占用的方法教程

    使用Python判斷一個(gè)文件是否被占用的方法教程

    這篇文章主要給大家介紹了關(guān)于如何使用Python判斷一個(gè)文件是否被占用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python?colorama?彩色打印實(shí)現(xiàn)代碼

    Python?colorama?彩色打印實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python?colorama?彩色打印實(shí)現(xiàn)代碼,將介紹的類為Back,?它實(shí)現(xiàn)了與?Fore?類相同的九個(gè)關(guān)鍵字:BLACK、RED、GREEN、YELLOW、BLUE、MAGENTA、CYAN、WHITE、RESET,感興趣的朋友一起看看吧
    2022-04-04
  • 你們要的Python繪畫3D太陽系詳細(xì)代碼

    你們要的Python繪畫3D太陽系詳細(xì)代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Python 繪畫3D太陽系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • Pytes正確的配置使用日志功能

    Pytes正確的配置使用日志功能

    在pytest自動(dòng)化測試中,如果只是簡單的從應(yīng)用的角度來說,完全可以不去了解pytest中的顯示信息的部分以及原理,可以通過使用推薦的pytest.ini配置,從而可以做到相對來說比較通用的日志配置,這篇文章主要介紹了Pytes如何正確的配置使用日志功能,需要的朋友可以參考下
    2022-12-12
  • Python一直報(bào)錯(cuò)SyntaxError:invalid?syntax的解決辦法

    Python一直報(bào)錯(cuò)SyntaxError:invalid?syntax的解決辦法

    SyntaxError: invalid syntax 這個(gè)報(bào)錯(cuò)經(jīng)常遇見,但是總感覺自己的代碼沒有問題,根據(jù)報(bào)錯(cuò)提示的行也找不到錯(cuò)誤,這些情況以及解決方法都有哪些呢?這篇文章主要給大家介紹了關(guān)于Python一直報(bào)錯(cuò)SyntaxError:invalid?syntax的解決辦法,需要的朋友可以參考下
    2022-09-09
  • python列表與元組詳解實(shí)例

    python列表與元組詳解實(shí)例

    python列表與元組詳解實(shí)例,本文是基于python2.x的講解,這點(diǎn)一定要注意。
    2013-11-11
  • python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    這篇文章主要介紹了python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python如何求解兩數(shù)的最大公約數(shù)

    python如何求解兩數(shù)的最大公約數(shù)

    這篇文章主要為大家詳細(xì)介紹了python如何求解兩數(shù)的最大公約數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python爬蟲請求頁面urllib庫詳解

    python爬蟲請求頁面urllib庫詳解

    這篇文章主要介紹了python爬蟲請求頁面urllib庫詳解,python3將urllib和urllib2模塊整合并命名為urllib模塊,urllib模塊有多個(gè)子模塊,各有不同的功能,需要的朋友可以參考下
    2023-07-07

最新評論