Python多線程零远,單線程苗分,協(xié)程爬蟲某音樂(lè)實(shí)戰(zhàn)對(duì)比

  • 單線程,多線程下載某云音樂(lè)
import re
import urllib.request
import requests
from bs4 import BeautifulSoup
import os
import time
from Threads import BaseThread

PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)

'''
https://music.163.com/playlist?id=  得到播放列表
http://music.163.com/song/media/outer/url?id= 得到下載鏈接
urllib.request.urlretrieve  把遠(yuǎn)程下載的mp3文件下載到本地
'''


class Music163:
    def __init__(self):
        pass
    def get_music_163(self, id):
        user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 ' \
                     'Safari/537.36 '
        headers = {'User-Agent': user_agent}
        data = requests.get("https://music.163.com/playlist?id=" + id, headers).text
        soup = BeautifulSoup(data, 'lxml')
        temp = []
        for i in soup.find("ul", {"class", "f-hide"}).find_all("a"):
            pattern = re.compile('<a .*?id=(.*?)">(.*?)</a>', re.S)
            items = re.findall(pattern, str(i))
            temp.append([items[0][0], items[0][1]])
        return temp

    # 批量下載
    def download(self, value):
        for i in value:
            if os.path.isfile(PATH("mp3/" + i[1] + ".mp3")):
                print("%s已經(jīng)被下載了" % i[1])
            else:
                url = 'http://music.163.com/song/media/outer/url?id=' + i[0] + '.mp3'
                urllib.request.urlretrieve(url, '%s' % PATH("mp3/" + i[1] + ".mp3"))
                print("%s下載成功" % i[1])

    # 單個(gè)下載
    def get(self, value):
        if os.path.isfile(PATH("mp3/" + value[1] + ".mp3")):
            print("%s已經(jīng)被下載了" % value[1])
        else:
            url = 'http://music.163.com/song/media/outer/url?id=' + value[0] + '.mp3'
            urllib.request.urlretrieve(url, '%s' % PATH("mp3/" + value[1] + ".mp3"))
            print("%s下載成功" % value[1])


# 多線程
def multi_thread():
    id = "2786226719"  # 播放的列表id
    start_time = time.time()
    threads = []
    mc = Music163()
    data = mc.get_music_163(id)
    count = len(data)
    for i in range(0, count):
        threads.append(BaseThread(mc.get(data[i])))
    for j in range(0, count):
        threads[j].start()
    for k in range(0, count):
        threads[k].join()
    end_time = time.time()
    print("共耗時(shí)%.2f" % (end_time - start_time) + "秒")
    # 多線程47秒


# 運(yùn)行單線程
def run():
    id = "2786226719"  # 播放的列表id
    start_time = time.time()
    mc = Music163()
    data = mc.get_music_163(id)
    mc.download(data)
    end_time = time.time()
    print("共耗時(shí)%.2f" % (end_time - start_time) + "秒")
    # 單線程43秒


if __name__ == "__main__":
    # run()
    multi_thread()
  • 單線程共下載100首歌,耗時(shí)9.09秒
dan.png
  • 多線程共下載100首歌,耗時(shí)9.60秒
image.png
  • 協(xié)程下載的代碼
mport time
from multiprocessing import Process
from gevent import monkey
import urllib.request
import BaseMusic163
monkey.patch_all()
import gevent
import os

PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)
'''
協(xié)程發(fā)請(qǐng)求,
'''
class Producer(object):
    def __init__(self):
        self._rungevent()

    def _rungevent(self):
        jobs = []
        id = "2786226719"  # 播放的列表id
        start_time = time.time()
        mc = BaseMusic163.Music163()
        data = mc.get_music_163(id)
        count = len(data)
        for i in range(count):  # windows下有1024端口限制
            jobs.append(gevent.spawn(self.produce(data[i])))
        gevent.joinall(jobs)
        end_time = time.time()
        print("共耗時(shí)%.2f" % (end_time - start_time) + "秒")

    def produce(self, value):
        if os.path.isfile(PATH("mp3/" + value[1] + ".mp3")):
            print("%s已經(jīng)被下載了" % value[1])
        else:
            url = 'http://music.163.com/song/media/outer/url?id=' + value[0] + '.mp3'
            urllib.request.urlretrieve(url, '%s' % PATH("mp3/" + value[1] + ".mp3"))
            print("%s下載成功" % value[1])


def main():
    p1 = Process(target=Producer, args=())
    p1.start()


if __name__ == '__main__':
    main()
  • 下載時(shí)間


    image.png

結(jié)論

  • 昨天測(cè)試牵辣,發(fā)現(xiàn)是協(xié)程>多線程>單線程
  • 今天測(cè)試卻是:多線程>協(xié)程>單線程
  • 當(dāng)然也會(huì)出現(xiàn)單線程耗時(shí)反而比多線程耗時(shí)短的情況
  • 一直流傳多進(jìn)程+協(xié)程摔癣,可以解決python的GIL問(wèn)題,因?yàn)楸敬螠y(cè)試的數(shù)據(jù)不多纬向,使用的也是單進(jìn)程+協(xié)程的方式择浊,后續(xù)對(duì)協(xié)程的測(cè)試,有機(jī)會(huì)進(jìn)行大量數(shù)據(jù)的測(cè)試逾条,采用多進(jìn)程+協(xié)程的方式進(jìn)行測(cè)試
  • 源碼獲取
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琢岩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子师脂,更是在濱河造成了極大的恐慌担孔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃警,死亡現(xiàn)場(chǎng)離奇詭異糕篇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酌心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門娩缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谒府,你說(shuō)我怎么就攤上這事拼坎。” “怎么了完疫?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵泰鸡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我壳鹤,道長(zhǎng)盛龄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任芳誓,我火速辦了婚禮余舶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锹淌。我一直安慰自己匿值,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布赂摆。 她就那樣靜靜地躺著挟憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烟号。 梳的紋絲不亂的頭發(fā)上绊谭,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音汪拥,去河邊找鬼达传。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迫筑,可吹牛的內(nèi)容都是我干的宪赶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼铣焊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逊朽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起曲伊,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叽讳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后坟募,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛蚤,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年懈糯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涤妒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赚哗,死狀恐怖她紫,靈堂內(nèi)的尸體忽然破棺而出硅堆,到底是詐尸還是另有隱情,我是刑警寧澤贿讹,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布渐逃,位于F島的核電站,受9級(jí)特大地震影響民褂,放射性物質(zhì)發(fā)生泄漏茄菊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一赊堪、第九天 我趴在偏房一處隱蔽的房頂上張望面殖。 院中可真熱鬧,春花似錦哭廉、人聲如沸脊僚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吃挑。三九已至,卻和暖如春街立,著一層夾襖步出監(jiān)牢的瞬間舶衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工赎离, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逛犹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓梁剔,卻偏偏與公主長(zhǎng)得像虽画,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荣病,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容