文章編號:10588時間:2024-09-28人氣:
你是音樂愛好者嗎?是否厭倦了流媒體音樂服務中有限的音樂選擇?如果是這樣,那么使用 QQ 音樂爬蟲創建自己的音樂庫可能正是您需要做的。
QQ 音樂爬蟲是一種軟件程序,用于從 QQ 音樂網站提取音樂文件。它本質上是一個自動化程序,可以為您執行手動下載音樂文件的繁瑣任務。
使用 QQ 音樂爬蟲創建自己的音樂庫是一種創建和享受您喜愛的音樂便捷方式。它可以讓您建立一個不斷增長的音樂收藏,并隨時隨地離線收聽。在使用爬蟲時要考慮版權問題和潛在的限制,并確保您使用的是信譽良好的程序。
近年來,隨著互聯網技術的不斷發展,越來越多的人開始使用爬蟲來獲取音樂。 通過爬蟲獲取音樂,不僅可以免費獲取大量的音樂資源,還可以快速地找到自己喜歡的音樂。 下面我們來介紹一下如何用爬蟲獲取音樂。 首先,我們需要選擇一個合適的網站。 目前市面上有很多音樂網站,如酷狗音樂、網易云音樂、QQ音樂等。 我們可以根據自己的喜好選擇一個合適的網站。 接著,我們需要了解一些基本的爬蟲知識。 爬蟲是一種自動化獲取網頁信息的工具,可以模擬人類操作,自動抓取網頁上的信息,并進行處理和分析。 在使用爬蟲時,我們需要了解網頁的結構和編碼方式。 然后,我們需要選擇一個合適的編程語言。 目前常用的編程語言有Python、Java、JavaScript等。 其中,Python是最為流行的語言之一,因為它簡單易學、功能強大、支持多種操作系統,并且有豐富的第三方庫和工具。 最后,我們需要編寫爬蟲程序。 在編寫爬蟲程序時,我們需要根據網頁的結構和編碼方式,使用相應的爬蟲框架和庫。 例如,使用Python中的requests庫和BeautifulSoup庫可以輕松地獲取網頁信息,并提取出我們需要的音樂鏈接。 需要注意的是,在使用爬蟲獲取音樂時,我們需要遵守相關法律法規,不得侵犯他人的版權和隱私。 另外,我們還需要注意數據的安全和保護,避免泄露個人信息和數據。 綜上所述,使用爬蟲獲取音樂可以幫助我們快速地獲取大量的音樂資源,但是也需要我們遵守相關法律法規和保護數據安全。
不同機構課程安排不同,每個人需求不一樣,選擇上也是存在差異,建議根據自身需求,實地體驗一下。 課程安排:階段一:Python開發基礎Python全棧開發與人工智能之Python開發基礎知識學習內容包括:Python基礎語法、數據類型、字符編碼、文件操作、函數、裝飾器、迭代器、內置方法、常用模塊等。 階段二:Python高級編程和數據庫開發Python全棧開發與人工智能之Python高級編程和數據庫開發知識學習內容包括:面向對象開發、Socket網絡編程、線程、進程、隊列、IO多路模型、Mysql數據庫開發等。 階段三:前端開發Python全棧開發與人工智能之前端開發知識學習內容包括:Html、CSS、JavaScript開發、Jquery&bootstrap開發、前端框架VUE開發等。 階段四:WEB框架開發Python全棧開發與人工智能之WEB框架開發學習內容包括:Django框架基礎、Django框架進階、BBS+Blog實戰項目開發、緩存和隊列中間件、Flask框架學習、Tornado框架學習、Restful API等。 階段五:爬蟲開發Python全棧開發與人工智能之爬蟲開發學習內容包括:爬蟲開發實戰。 階段六:全棧項目實戰Python全棧開發與人工智能之全棧項目實戰學習內容包括:企業應用工具學習、CRM客戶關系管理系統開發、路飛學城在線教育平臺開發等。 階段七:數據分析Python全棧開發與人工智能之數據分析學習內容包括:金融量化分析。 階段八:人工智能Python全棧開發與人工智能之人工智能學習內容包括:機器學習、圖形識別、無人機開發、無人駕駛等。 階段九:自動化運維&開發Python全棧開發與人工智能之自動化運維&開發學習內容包括:CMDB資產管理系統開發、IT審計+主機管理系統開發、分布式主機監控系統開發等。 階段十:高并發語言GO開發Python全棧開發與人工智能之高并發語言GO開發學習內容包括:GO語言基礎、數據類型與文件IO操作、函數和面向對象、并發編程等。
本篇文章給大家分享的內容是如何利用Python爬取網易云音樂熱門評論,有著一定的參考價值,有需要的朋友可以參考一下前言最近在研究文本挖掘相關的內容,所謂巧婦難為無米之炊,要想進行文本分析,首先得到有文本吧。 獲取文本的方式有很多,比如從網上下載現成的文本文檔,或者通過第三方提供的API進行獲取數據。 但是有的時候我們想要的數據并不能直接獲取,因為并不提供直接的下載渠道或者API供我們獲取數據。 那么這個時候該怎么辦呢?有一種比較好的辦法是通過網絡爬蟲,即編寫計算機程序偽裝成用戶去獲得想要的數據。 利用計算機的高效,我們可以輕松快速地獲取數據。 關于爬蟲那么該如何寫一個爬蟲呢?有很多種語言都可以寫爬蟲,比如Java,php,python 等,我個人比較喜歡使用python。 因為python不僅有著內置的功能強大的網絡庫,還有諸多優秀的第三方庫,別人直接造好了輪子,我們直接拿過來用就可以了,這為寫爬蟲帶來了極大的方便。 不夸張地說,使用不到10行python代碼其實就可以寫一個小小的爬蟲,而使用其他的語言可以要多寫很多代碼,簡潔易懂正是python的巨大的優勢。 好了廢話不多說,進入今天的正題。 最近幾年網易云音樂火了起來,我自己就是網易云音樂的用戶,用了幾年了。 以前用的是QQ音樂和酷狗,通過我自己的親身經歷來看,我覺得網易云音樂最優特色的就是其精準的歌曲推薦和獨具特色的用戶評論(鄭重聲明!??!這不是軟文,非廣告!?。H代表個人觀點,非喜勿噴?。? 經常一首歌曲下面會有一些被點贊眾多的神評論。 加上前些日子網易云音樂將精選用戶評論搬上了地鐵,網易云音樂的評論又火了一把。 所以我想對網易云的評論進行分析,發現其中的規律,特別是分析一些熱評具有什么共同的特點。 帶著這個目的,我開始了對網易云評論的抓取工作。 網絡庫Python內置了兩個網絡庫urllib和urllib2,但是這兩個庫使用起來不是特別方便,所以在這里我們使用一個廣受好評的第三方庫requests。 使用requests只用很少的幾行代碼就可以實現設置代理,模擬登陸等比較復雜的爬蟲工作。 如果已經安裝pip的話,直接使用pip install requests 即可安裝。 中文文檔地址在此大家有什么問題可以自行參考官方文檔,上面會有非常詳細的介紹。 至于urllib和urllib2這兩個庫也是比較有用的,以后如果有機會我會再給大家介紹一下。 工作原理在正式開始介紹爬蟲之前,首先來說一下爬蟲的基本工作原理,我們知道我們打開瀏覽器訪問某個網址本質上是向服務器發送了一定的請求,服務器在收到我們的請求之后,會根據我們的請求返回數據,然后通過瀏覽器將這些數據解析好,呈現在我們的面前。 如果我們使用代碼的話,就要跳過瀏覽器的這個步驟,直接向服務器發送一定的數據,然后再取回服務器返回的數據,提取出我們想要的信息。 但是問題是,有的時候服務器需要對我們發送的請求進行校驗,如果它認為我們的請求是非法的,就會不返回數據,或者返回錯誤的數據。 所以為了避免發生這種情況,我們有的時候需要把程序偽裝成一個正常的用戶,以便順利得到服務器的回應。 如何偽裝呢?這就要看用戶通過瀏覽器訪問一個網頁與我們通過程序訪問一個網頁之間的區別。 通常來說,我們通過瀏覽器訪問一個網頁,除了發送訪問的url之外,還會給服務發送額外的信息,比如headers(頭部信息)等,這就相當于是請求的身份證明,服務器看到了這些數據,就會知道我們是通過正常的瀏覽器訪問的,就會乖乖地返回數據給我們了。 模擬登陸所以我們程序就得像瀏覽器一樣,在發送請求的時候,帶上這些標志著我們身份的信息,這樣就能順利拿到數據。 有的時候,我們必須在登錄狀態下才能得到一些數據,所以我們必須要模擬登錄。 本質上來說,通過瀏覽器登錄就是post一些表單信息給服務器(包括用戶名,密碼等信息),服務器校驗之后我們就可以順利登錄了,利用程序也是一樣,瀏覽器post什么數據,我們原樣發送就可以了。 關于模擬登錄,我后面會專門介紹一下。 當然事情有的時候也不會這么順利,因為有些網站設置了反爬措施,比如如果訪問過快,有時候會被封ip(典型的比如豆瓣)。 這個時候我們還得要設置代理服務器,即變更我們的ip地址,如果一個ip被封了,就換另外一個ip,具體怎么做,這些話題以后慢慢再說。 小技巧 最后,再介紹一個我認為在寫爬蟲過程中非常有用的一個小技巧。 如果你在使用火狐瀏覽器或者chrome的話,也許你會注意到有一個叫作開發者工具(chrome)或者web控制臺(firefox)的地方。 這個工具非常有用,因為利用它,我們可以清楚地看到在訪問一個網站的過程中,瀏覽器到底發送了什么信息,服務器究竟返回了什么信息,這些信息是我們寫爬蟲的關鍵所在。 下面你就會看到它的巨大用處。 如何爬取評論首先打開網易云音樂的網頁版,隨便選擇一首歌曲打開它的網頁,這里我以周杰倫的《晴天》為例。 如下圖:接下來打開web控制臺(chrome的話打開開發者工具,如果是其他瀏覽器應該也是類似),如下圖:然后這個時候我們需要點選網絡,清除所有的信息,然后點擊重新發送(相當于是刷新瀏覽器),這樣我們就可以直觀看到瀏覽器發送了什么信息以及服務器回應了什么信息。 如下圖:刷新之后得到的數據如下可以看到瀏覽器發送了非常多的信息,那么哪一個才是我們想要的呢?這里我們可以通過狀態碼做一個初步的判斷,status code(狀態碼)標志了服務器請求的狀態,這里狀態碼為200即表示請求正常,而304則表示不正常(狀態碼種類非常多,如果要想詳細了解可以自行搜索,這里不說304具體的含義了)。 所以我們一般只用看狀態碼為200的請求就可以了,還有就是,我們可以通過右邊欄的預覽來粗略觀察服務器返回了什么信息(或者查看響應)。 如下圖:通過這兩種方法結合一般我們就可以快速找到我們想要分析的請求。 注意圖5中的請求網址一欄即是我們想要請求的網址,請求的方法有兩種:get和post,還有一個需要重點關注的就是請求頭,里面包含了user-Agent(客戶端信息),refrence(從何處跳轉過來)等多種信息,一般無論是get還是post方法我們都會把頭部信息帶上。 頭部信息如下圖:另外還需要注意的是:get請求一般就直接把請求的參數以 ?parameter1=value1?meter2=value2 等這樣的形式發送了,所以不需要帶上額外的請求參數,而post請求則一般需要帶上額外的參數,而不直接把參數放在url當中,所以有的時候我們還需要關注參數這一欄。 經過仔細尋找,我們終于找到原來與評論相關的請求在這個請求當中,如下圖:點開這個請求,我們發現它是一個post請求,請求的參數有兩個,一個是params,還有一個是encSecKey,這兩個參數的值非常的長,感覺應該像是加密過的。 如下圖:服務器返回的和評論相關的數據為json格式的,里面含有非常豐富的信息(比如有關評論者的信息,評論日期,點贊數,評論內容等等),如下圖9所示:(其實hotComments為熱門評論,comments為評論數組)至此,我們已經確定了方向了,即只需要確定params和encSecKey這兩個參數值即可,這個問題困擾了我一下午,我弄了很久也沒有搞清楚這兩個參數的加密方式,但是我發現了一個規律,中 R_SO_4_ 后面的數字就是這首歌的id值,而對于不同的歌曲的param和encSecKey值,如果把一首歌比如A的這兩個參數值傳給B這首歌,那么對于相同的頁數,這種參數是通用的,即A的第一頁的兩個參數值傳給其他任何一首歌的兩個參數,都可以獲得相應歌曲的第一頁的評論,對于第二頁,第三頁等也是類似。 但是遺憾的是,不同的頁數參數是不同的,這種辦法只能抓取有限的幾頁(當然抓取評論總數和熱門評論已經足夠了),如果要想抓取全部數據,就必須搞明白這兩個參數值的加密方式。 以為沒有搞明白,昨天晚上我帶著這個問題去知乎搜索了一下,居然真的被我找到了答案。 @平胸小仙女 這位知友詳細說明了如何破解這兩個參數的加密過程,我研究了一下,發現還是有點小復雜的,按照知友寫的方法,我改動了一下,就成功得到了全部的評論。 這里要對知乎@平胸小仙女 表示感謝。 到此為止,如何抓取網易云音樂的評論全部數據就全部講完了。 按照慣例,最后上代碼,親測有效:#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- # @Time : 2017/3/28 8:46 # @Author : Lyrichu # @Email : # @File : NetCloud_ @Description: 網易云音樂評論爬蟲,可以完整爬取整個評論 部分參考了@平胸小仙女的文章來源:知乎 from import AES import base64 import requests import json import codecs import time # 頭部信息 headers = { , Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3, Accept-Encoding:gzip, deflate, Content-Type:application/x-www-form-urlencoded, Cookie:_ntes_nnid=b04b121e078dee797cdb30e0fd,27; _ntes_nuid=b04b121e078dee797cdb30e0fd; JSESSIONID-WYYY=yfqt9ofhY%5CIYNkXW71TqY5OtSZyjE%2FoswGgtl4dMv3Oa7%5CQ50T%2FVaee%2FMSsCifHE0TGtRMYhSPpr20i%5CRO%2BO%2B9pbbJnrUvGzkibhNqw3Tlgn%5Coil%2FrW7zFZZWSA3K9gD77MPSVH6fnv5hIT8ms70MNB3CxK5r3ecj3tFMlWFbFOZmGw%5C%3A80; _iuqxldmzr_=32; vjuids=c8ca7976.15a029d006a.0.e63af8; vjlast=..21; __gads=ID=a9eed5e3cae4d252:T=:S=ALNI_Mb5XX2vlkjsiU5cIy91-ToUDoFxIw; vinfo_n_f_l_n3=411a2def7f75a62e.1.1.69.05.42; P_INFO=||1|Study|00&99|null&null&null#hub #0#0|&1|study_client|; NTES_CMT_USER_INFO=%7Cm155****4439%7Chttps%3A%2F%%2Fe%%2Ftie%2Fimages%2Fyun%2Fphoto_default_%7Cfalse%7CbTE1NTI3NTk0NDM5QDE2My5jb20%3D; usertrack=c+5+hljHgU0T1FDmA66MAg==; Province=027; City=027; _ga=GA1.2..; __utma=.....8; __utmc=; __utmz==baidu|utmccn=(organic)|utmcmd=organic; playerid=; __utmb=.23.10., Connection:keep-alive, Referer:}# 設置代理服務器 proxies= { http::https::}# offset的取值為:(評論頁數-1)*20,total第一頁為true,其余頁為false # First_param = {rid:, offset:0, total:true, limit:20, csrf_token:} # 第一個參數 second_param = # 第二個參數 # 第三個參數 third_param = 00e0b509f6259df8642dbcdfec152b5ff68ace615bb7bb3ab17a876aea8a5aa76d2eec4ee341ffccfe0312ecbdacaf6c9d05c4f7f0c3685b7a46beecce10b424d813cfe4875d3eb97ddefd546b8e289dc6935b3ece0462db0a22b8e7 # 第四個參數 forth_param = 0CoJUm6Qyw8W8jud # 獲取參數 def get_params(page): # page為傳入頁數 iv = first_key = forth_param second_key = 16 * F if(page == 1): # 如果為第一頁 first_param = {rid:, offset:0, total:true, limit:20, csrf_token:} h_encText = AES_encrypt(first_param, first_key, iv) else: offset = str((page-1)*20) first_param = {rid:, offset:%s, total:%s, limit:20, csrf_token:} %(offset,false) h_encText = AES_encrypt(first_param, first_key, iv) h_encText = AES_encrypt(h_encText, second_key, iv) return h_encText # 獲取 encSecKey def get_encSecKey(): encSecKey = aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2ed94a02ca919de7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3fed39e7de08fce26dbc4484a01c76f739ec return encSecKey # 解密過程 def AES_encrypt(text, key, iv): pad = 16 - len(text) % 16 text = text + pad * chr(pad) encryptor = (key, _CBC, iv) encrypt_text = (text) encrypt_text = base64.b64encode(encrypt_text) return encrypt_text # 獲得評論json數據 def get_json(url, params, encSecKey): data = { params: params, encSecKey: encSecKey } response = (url, headers=headers, data=data,proxies = proxies) return # 抓取熱門評論,返回熱評列表 def get_hot_comments(url): hot_comments_list = [] hot_comments_(u用戶ID 用戶昵稱 用戶頭像地址 評論時間 點贊總數 評論內容) params = get_params(1) # 第一頁 encSecKey = get_encSecKey() json_text = get_json(url,params,encSecKey) json_dict = (json_text) hot_comments = json_dict[hotComments] # 熱門評論 print(共有%d條熱門評論! % len(hot_comments)) for item in hot_comments: comment = item[content] # 評論內容 likedCount = item[likedCount] # 點贊總數 comment_time = item[time] # 評論時間(時間戳) userID = item[user][userID] # 評論者id nickname = item[user][nickname] # 昵稱 avatarUrl = item[user][avatarUrl] # 頭像地址 comment_info = userID + + nickname + + avatarUrl + + comment_time + + likedCount + + comment + u hot_comments_(comment_info) return hot_comments_list # 抓取某一首歌的全部評論 def get_all_comments(url): all_comments_list = [] # 存放所有評論 all_comments_(u用戶ID 用戶昵稱 用戶頭像地址 評論時間 點贊總數 評論內容) # 頭部信息 params = get_params(1) encSecKey = get_encSecKey() json_text = get_json(url,params,encSecKey) json_dict = (json_text) comments_num = int(json_dict[total]) if(comments_num % 20 == 0):
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/06019f09d7a6740f0a35.html,復制請保留版權鏈接!
概述AndroidSDK,軟件開發工具包,是一個必不可少的工具包,為Android應用程序開發提供了全面的工具和資源,無論您是經驗豐富的開發者還是剛開始踏上移動開發之旅,下載和安裝AndroidSDK都是制定成功應用程序的至關重要的一步,本文將指導您完成下載和安裝AndroidSDK的過程,為您的移動開發之旅奠定堅實的基礎,步驟1,下...。
技術教程 2024-09-27 19:10:18
在現代Web開發中,數據網格,DataGrid,已成為必不可少的組件,用于可視化和操縱數據,它們提供了用戶友好的界面,使開發人員能夠輕松地將數據呈現得清晰明了,為了實現功能齊全的應用程序,至關重要的是將DataGrid與后端系統集成,以提供對數據的無縫訪問,DataGrid的作用DataGrid是表格視圖組件,用于顯示、篩選、排序和編...。
技術教程 2024-09-26 20:39:53
NumPy和SciPy是Python中用于數值計算的兩個強大的庫,NumPy提供了一個多維數組對象,以及各種數學運算函數,SciPy提供了更多高級的科學和工程工具,例如優化、積分和線性代數,numpy.arrange函數numpy.arrange,函數用于創建一組等間隔的數字,它類似于Python的range,函數,但它返回一個N...。
本站公告 2024-09-24 22:03:05
什么是HTML編碼,HTML編碼是一種將特殊字符轉換為HTML實體的方法,HTML實體是使用和符號表示的特殊字符,例如,&,表示&,字符,為什么需要HTML編碼,HTML編碼對于在Web頁面上正確顯示某些字符非常重要,例如,如果未對&,字符進行編碼,則它會被解釋為HTML實體,并且不會顯示為實際的&,字符,如何...。
互聯網資訊 2024-09-24 20:00:18
下拉框是一個常見的用戶界面元素,它允許用戶從一組選項中選擇一個值,下拉框可以是可訪問的,這意味著所有用戶都可以輕松使用,包括殘障人士,確保所有用戶都能輕松使用下拉框的最佳實踐使用明確的標簽,下拉框的標簽應該準確描述下拉框的目的,例如,一個下拉框用于選擇國家,地區,它的標簽應該是選擇國家,地區,提供鍵盤導航,用戶應該能夠使用鍵盤訪問和導...。
互聯網資訊 2024-09-24 06:42:29
前言在C語言編程中,`fscanf`函數是一個用于從文件中讀取格式化數據的強大工具,它提供了靈活且高效的方式來解析各種類型的文件格式,使其成為處理文件I,O時不可或缺的函數,為了充分理解和利用`fscanf`的能力,本文將深入剖析其工作原理,揭示其讀取文件數據背后的機制,剖析fscanf`fscanf`函數的原型如下,cintfsca...。
最新資訊 2024-09-23 17:13:09
文檔和圖像管理是管理和組織文檔和圖像文件的過程,它包括將文件存儲在中央位置、對文件進行分類和組織以及管理對文件的訪問權限,圖像文檔的定義圖像文檔是指包含圖像數據的文檔文件,圖像文檔可以是各種格式,包括,JPEGPNGGIFTIFFPDF文檔和圖像管理的重要性文檔和圖像管理對于組織高效運行至關重要,有效的文檔和圖像管理可以幫助組織,提高...。
本站公告 2024-09-16 08:15:32
概覽本教程將指導您使用Informix中的動態SQL和存儲過程來提高您的函數編程技能,這些技術將使您能夠創建動態、可重用和高效的函數,動態SQL動態SQL允許您在運行時構造SQL語句并執行它們,這為您提供了創建通用函數的靈活性,這些函數可以接受可變參數并針對不同的數據動態生成SQL,創建動態SQL函數要使用動態SQL,您需要創建具有D...。
本站公告 2024-09-08 09:43:57
在實時通信應用中,數據交互是至關重要的,小程序云開發數據庫,憑借其穩定的性能、低延遲和高并發特性,為實時通信應用提供了強大的數據交互保障,極大提升了用戶體驗,云開發數據庫的功能優勢實時更新,數據變動實時推送到客戶端,確保數據實時性和一致性,低延遲,采用高性能云服務器,確保網絡請求響應速度極快,實現即時數據交互,高并發,支持海量并發請求...。
本站公告 2024-09-07 21:10:46
在Windows編程領域,VCL,VisualComponentLibrary,是一組強大的控件,可用于創建具有高性能和美觀的應用程序,如果您使用Delphi或C,Builder等基于VCL的IDE,那么了解這些控件的用途和最佳實踐將至關重要,VCL控件概述VCL控件是預先構建的可視化組件,它提供了一系列功能,例如按鈕、文本框、列表...。
技術教程 2024-09-07 18:08:31
引言JavaFX是Java平臺上的一個圖形用戶界面,GUI,工具包,它允許開發人員使用Java輕松創建豐富的GUI應用程序,憑借其卓越的性能、跨平臺兼容性和易用性,JavaFX已成為創建現代、引人入勝的應用程序的首選,Java9對JavaFX進行了多項改進,增強了開發人員構建更具響應性、美觀和高效的GUI應用程序的能力,本文將深入探討...。
本站公告 2024-09-07 09:39:12
您正在尋找可讓您輕松創建自定義且可擴展的在線論壇的ASP源代碼嗎,我們為您提供幫助!本文將為您提供一個ASP論壇源碼,您可以使用它來構建一個強大的在線論壇,并根據您的特定需求進行定制,ASP論壇源碼特性可定制的布局和主題,使用HTML和CSS輕松定制您的論壇外觀和布局,用戶注冊和登錄,允許用戶創建帳戶并登錄到論壇,論壇類別和主題,組織...。
技術教程 2024-09-05 17:49:16