python爬蟲爬取音樂單曲_Python爬取qq音樂的過程實例

c815660dfd41931e6340055595aa8749.png

一、前言

 qq music上的音樂還是不少的,有些時候想要下載好聽的音樂,但有每次在網頁下載都是煩人的登錄什么的。于是,來了個qqmusic的爬蟲。至少我覺得for循環爬蟲,最核心的應該就是找到待爬元素所在url吧。二、Python爬取QQ音樂單曲

爬蟲步驟

1.確定目標首先我們要明確目標,本次爬取的是QQ音樂歌手劉德華的單曲。(百度百科)->分析目標(策略:url格式(范圍)、數據格式、網頁編碼)->編寫代碼->執行爬蟲2.分析目標歌曲鏈接:從左邊的截圖可以知道單曲采用分頁的方式排列歌曲信息,每頁顯示30條,總共30頁。點擊頁碼或者最右邊的">"會跳轉到下一頁,瀏覽器會向服務器發送ajax異步請求,從鏈接可以看到begin和num參數,分別代表起始歌曲下標(截圖是第2頁,起始下標是30)和一頁返回30條,服務器響應返回json格式的歌曲信息(MusicJsonCallbacksinger_track({"code":0,"data":{"list":[{"Flisten_count1":......]})),如果只是單獨想獲取歌曲信息,可以直接拼接鏈接請求和解析返回的json格式的數據。這里不采用直接解析數據格式的方法,我采用的是Python Selenium方式,每獲取和解析完一頁的單曲信息,點擊 ">" 跳轉到下一頁繼續解析,直至解析并記錄所有的單曲信息。最后請求每個單曲的鏈接,獲取詳細的單曲信息。

右邊的截圖是網頁的源碼,所有歌曲信息都在類名為mod_songlist的div浮層里面,類名為songlist_list的無序列表ul下,每個子元素li展示一個單曲,類名為songlist__album下的a標簽,包含單曲的鏈接,名稱和時長等。

3.編寫代碼1)下載網頁內容,這里使用Python 的Urllib標準庫,自己封裝了一個download方法:

def download(url, user_agent='wswp', num_retries=2): ifurl is None: returnNone print('Downloading:', url) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} request = urllib.request.Request(url, headers=headers) # 設置用戶代理wswp(Web Scraping with Python) try: html = urllib.request.urlopen(request).read().decode('utf-8') except urllib.error.URLError ase: print('Downloading Error:', e.reason) html = None ifnum_retries > 0: ifhasattr(e, 'code') and500 <= e.code < 600: # retry when returncode is 5xx HTTP erros returndownload(url, num_retries-1) # 請求失敗,默認重試2次, return html

2)解析網頁內容,這里使用第三方插件BeautifulSoup,具體可以參考BeautifulSoup API 。

def music_scrapter(html, page_num=0): try: soup = BeautifulSoup(html, 'html.parser') mod_songlist_div = soup.find_all('div', class_='mod_songlist') songlist_ul = mod_songlist_div[1].find('ul', class_='songlist__list') '''開始解析li歌曲信息''' lis = songlist_ul.find_all('li') forli in lis: a = li.find('div', class_='songlist__album').find('a') music_url = a['href'] # 單曲鏈接 urls.add_new_url(music_url) # 保存單曲鏈接 # print('music_url:{0} '.format(music_url)) print('total music link num:%s'% len(urls.new_urls)) next_page(page_num+1) except Timeout Exception aserr: print('解析網頁出錯:', err.args) returnnext_page(page_num + 1) return None
def get_music(): try: whileurls.has_new_url(): # print('urls count:%s'% len(urls.new_urls)) '''跳轉到歌曲鏈接,獲取歌曲詳情''' new_music_url = urls.get_new_url() print('url leave count:%s'% str( len(urls.new_urls) - 1)) html_data_info = download(new_music_url) # 下載網頁失敗,直接進入下一循環,避免程序中斷 ifhtml_data_info is None: continue soup_data_info = BeautifulSoup(html_data_info, 'html.parser') ifsoup_data_info.find('div', class_='none_txt') is not None: print(new_music_url, ' 對不起,由于版權原因,暫無法查看該專輯!') continue mod_songlist_div = soup_data_info.find('div', class_='mod_songlist') songlist_ul = mod_songlist_div.find('ul', class_='songlist__list') lis = songlist_ul.find_all('li') del lis[0] # 刪除第一個li # print('len(lis):$s'% len(lis)) forli in lis: a_songname_txt = li.find('div', class_='songlist__songname').find('span', class_='songlist__songname_txt').find('a') if'https'not in a_songname_txt['href']: #如果單曲鏈接不包含協議頭,加上 song_url = 'https:'+ a_songname_txt['href'] song_name = a_songname_txt['title'] singer_name = li.find('div', class_='songlist__artist').find('a').get_text() song_time =li.find('div', class_='songlist__time').get_text() music_info = {} music_info['song_name'] = song_name music_info['song_url'] = song_url music_info['singer_name'] = singer_name music_info['song_time'] = song_time collect_data(music_info) except Exception aserr: # 如果解析異常,跳過 print('Downloading or parse music information error continue:', err.args)

4.執行爬蟲

1<span style="font-size: 16px;">爬蟲跑起來了,一頁一頁地去爬取專輯的鏈接,并保存到集合中,最后通過get_music()方法獲取單曲的名稱,鏈接,歌手名稱和時長并保存到Excel文件中。</span><br><span style="font-size: 14px;"><img src="http://img.php.cn/upload/article/000/000/001/a1138f33f00f8d95b52fbfe06e562d24-4.png"alt=""width="748"height="483"><strong><img src="http://img.php.cn/upload/article/000/000/001/9282b5f7a1dc4a90cee186c16d036272-5.png"alt=""></strong></span>1<br>

三、Python爬取QQ音樂單曲總結1.單曲采用的是分頁方式,切換下一頁是通過異步ajax請求從服務器獲取json格式的數據并渲染到頁面,瀏覽器地址欄鏈接是不變的,不能通過拼接鏈接來請求。一開始想過都通過Python Urllib庫來模擬ajax請求,后來想想還是用Selenium。Selenium能夠很好地模擬瀏覽器真實的操作,頁面元素定位也很方便,模擬單擊下一頁,不斷地切換單曲分頁,再通過BeautifulSoup解析網頁源碼,獲取單曲信息。2.url鏈接管理器,采用集合數據結構來保存單曲鏈接,為什么要使用集合?因為多個單曲可能來自同一專輯(專輯網址一樣),這樣可以減少請求次數。

1<span style="font-size: 14px;">classUrlManager(object):</span><br><span style="font-size: 14px;"> def __init__(self):</span><br><span style="font-size: 14px;"> self.new_urls = set() # 使用集合數據結構,過濾重復元素</span><br><span style="font-size: 14px;"> self.old_urls = set() # 使用集合數據結構,過濾重復元素</span>
1<span style="font-size: 14px;"> def add_new_url(self, url):</span><br><span style="font-size: 14px;"> ifurl is None:</span><br><span style="font-size: 14px;"> return</span><br><span style="font-size: 14px;"> ifurl not in self.new_urls andurl not in self.old_urls:</span><br><span style="font-size: 14px;"> self.new_urls.add(url)</span><br><br><span style="font-size: 14px;"> def add_new_urls(self, urls):</span><br><span style="font-size: 14px;"> ifurls is None orlen(urls) == 0:</span><br><span style="font-size: 14px;"> return</span><br><span style="font-size: 14px;"> forurl in urls:</span><br><span style="font-size: 14px;"> self.add_new_url(url)</span><br><br><span style="font-size: 14px;"> def has_new_url(self):</span><br><span style="font-size: 14px;"> returnlen(self.new_urls) != 0</span><br><br><span style="font-size: 14px;"> def get_new_url(self):</span><br><span style="font-size: 14px;"> new_url = self.new_urls.pop()</span><br><span style="font-size: 14px;"> self.old_urls.add(new_url)</span><br><span style="font-size: 14px;"> returnnew_url<br><br></span>

3.通過Python第三方插件openpyxl讀寫Excel十分方便,把單曲信息通過Excel文件可以很好地保存起來。

1<span style="font-size: 14px;">def write_to_excel(self, content):</span><br><span style="font-size: 14px;"> try:</span><br><span style="font-size: 14px;"> forrow in content:</span><br><span style="font-size: 14px;"> self.workSheet.append([row['song_name'], row['song_url'], row['singer_name'], row['song_time']])</span><br><span style="font-size: 14px;"> self.workBook.save(self.excelName) # 保存單曲信息到Excel文件</span><br><span style="font-size: 14px;"> except Exception asarr:</span><br><span style="font-size: 14px;"> print('write to excel error', arr.args)</span><br><br>

四、后語最后還是要慶祝下,畢竟成功把QQ音樂的單曲信息爬取下來了。本次能夠成功爬取單曲,Selenium功不可沒,這次只是用到了selenium一些簡單的功能,后續會更加深入學習Selenium,不僅在爬蟲方面還有UI自動化。后續還需要優化的點:1.下載的鏈接比較多,一個一個下載起來比較慢,后面打算用多線程并發下載。2.下載速度過快,為了避免服務器禁用IP,后面還要對于同一域名訪問過于頻繁的問題,有個等待機制,每個請求之間有個等待間隔。3. 解析網頁是一個重要的過程,可以采用正則表達式,BeautifulSoup和lxml,目前采用的是BeautifulSoup庫, 在效率方面,BeautifulSoup沒lxml效率高,后面會嘗試采用lxml。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python按照日期篩選數據_日期時間范圍上的Python篩選器?

我有一些包含開始時間和結束時間的數據&#xff08;datetime格式&#xff09;&#xff0c;我想根據更受限制的日期范圍計算持續時間&#xff08;以小時為單位&#xff09;。但到目前為止&#xff0c;我還沒有成功。&#xff08;對python還是個業余愛好者。&#xff09; 示例&am…

計算機2級u盤作弊,一種帶LED指示燈的計算機考試防U盤作弊裝置制造方法及圖紙...

【技術實現步驟摘要】一種帶LED指示燈的計算機考試防U盤作弊裝置本申請是申請日為2016年4月1日&#xff0c;申請號為2016102009851&#xff0c;專利技術名稱為“一種防U盤舞弊的計算機考試裝置”的專利技術專利的分案申請。本專利技術涉及一種防止計算機考試抄襲作弊的裝置&…

python類定義的講解_python面向對象、自定義類等使用實例講解

python 面向對象相對別的語言來說缺少兩個功能&#xff1a; 1、python不具備重載&#xff0c;重載是指在同一個類中&#xff0c;使得方法有相同的名稱&#xff0c;但是有不同的參數列表&#xff0c;但由于python函數具有強大的參數處理功能&#xff0c;因此這不是一個問題。 2、…

ubutun 更換網絡源_「ubuntu腳本1」開啟ssh替換第三方源開啟tab鍵補齊屏蔽nouveau

Ubuntu初始化腳本,安裝顯卡驅動專用初始化腳本替換apt源為國內清華源,增加docker-ce國內源開啟tab鍵補齊桌面版開啟ssh僅支持Ubuntu16/18桌面版安裝gcc make屏蔽nouveau 自動重啟服務器生效#!/bin/bash #檢測網絡是否通暢 ping -w 5 qq.com || { echo "網絡異常,腳本終止&…

地理信息系統軟件測試培訓,地理信息系統軟件測試方法技術方案

本發明專利技術涉及一種軟件測試方法。更具體地說&#xff0c;本發明專利技術涉及一種地理信息系統軟件測試方法&#xff0c;包括&#xff1a;編寫測試用例文檔并腳本化形成測試腳本&#xff1b;結合路徑分析方法設置測試用例&#xff0c;按照測試用例配套至少一組測試原始數據…

matlab meshgrid函數_matlab入門(三)圖像可視化

matlab圖像可視化基本要求(1)掌握圖形窗口的創建與控制&#xff0c;以及圖形窗口的基本操作&#xff1b;(2)熟練掌握二維和三維繪圖基本的命令、線型控制&#xff1b;(3)初步掌握用特殊的圖形來表現特殊數據的性質&#xff0c;如面積圖、直方 圖、餅圖等。(4)掌握坐標軸的控制和…

hashmap remove 沒釋放內存_java從零開始手寫 redis(13)HashMap 源碼原理詳解

為什么學習 HashMap 源碼&#xff1f;作為一名 java 開發&#xff0c;基本上最常用的數據結構就是 HashMap 和 List&#xff0c;jdk 的 HashMap 設計還是非常值得深入學習的。無論是在面試還是工作中&#xff0c;知道原理都對會我們有很大的幫助。本篇的內容較長&#xff0c;建…

南京高中計算機老師,南京市教育局召開中小學教師信息技術應用能力提升工程2.0市級專家組工作會議...

2021年3月2日上午&#xff0c;南京市中小學教師信息技術應用能力提升工程2.0市級專家組工作會議在雨花臺區教師發展中心召開。市教育局副局長祁壽東出席會議并講話&#xff0c;市教研室、教科所、電教館、教師發展學院主要負責同志&#xff0c;市級專家團隊成員及各區教師發展中…

python計算執行時間的函數_[python] 統計函數運行時間

第一種&#xff1a; import time def time_me(fn): #fn 是要修飾/修改 的函數 def _wrapper(*args, **kwargs): #這個 _wrapper(*args, **kwargs) 則代指fn, *args 代表一般變量參數&#xff0c; **kwargs代表 字典&#xff0c;哈希等參數 start time.perf_counter() fn(*args…

arthas 排查內存溢出_Java 應用線上問題排查思路、常用工具小結

前言本文總結了一些常見的線上應急現象和對應排查步驟和工具。分享的主要目的是想讓對線上問題接觸少的同學有個預先認知&#xff0c;免得在遇到實際問題時手忙腳亂。畢竟作者自己也是從手忙腳亂時走過來的。只不過這里先提示一下。在線上應急過程中要記住&#xff0c;只有一個…

計算機個性化定制服務課題,服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文.docx...

服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文Classified Index: TP315 U.D.C: 681.3Dissertation for the Master’s Degree in EngineeringSERVICE NETWORK CONSTRUCTION AND DYNAMIC CUSTOMIZATION METHOD FOR SUBJECTIVE CHANGES OF CUSTOMER RE…

flutter listview 滾動到指定位置_Flutter 布局原理及實戰

1. Flutter UI架構Flutter將視圖數據抽象成為三個部分&#xff0c;即Widget樹、Element樹和RenderObject樹。Widget樹&#xff1a;控件的配置信息&#xff0c;不涉及渲染&#xff0c;更新代價極低。RenderObject樹&#xff1a;真正的UI渲染樹&#xff0c;負責渲染UI&#xff0c…

計算機的屏幕約是16平方分米嗎,小明的臥室有16平方分米對不對

小明的臥室有16平方分米對不對不對&#xff0c;應該是16平方米不對錯! 16平方分米太小了不對&#xff0c;那么小怎么可能住人。不正確應該是16平方米xiao ming de wo shi you 1 6 ping fang fen mi dui bu dui32平方分米涂上每平方分米的96克油漆,需要幾克32平方分米需要油漆30…

python引用傳遞_python 是值傳遞還是引用傳遞 知乎

展開全部 那要看數據類型了&#xff0c;21135261int&#xff0c;float&#xff0c;str這種就是傳值&#xff0c;list&#xff0c;dict&#xff0c;類的實例&#xff0c;自定義對象都是穿4102引用。 下面1653是示例代碼&#xff1a;def change(int1,float1,str1,dict1,obj1,list…

雷神開機logo更改_國產外星人雷神再發新品 911MT逐影者RTX2060光追游戲本評測

隨著NVIDIA發布了筆記本20系顯卡之后&#xff0c;宣示著全民進入了“RTX光線追蹤時代”&#xff0c;各種新款的游戲也紛紛宣布支持“光線追蹤”技術來吸引更多的玩家&#xff0c;似乎現在游戲本上沒有個“RTX”貼紙就已經不好意思跟別人打招呼了。說到2019年的RTX新品&#xff…

AJAX框架衣柜內部布局,?最合理的衣柜內部布局解析,3大細節不容小覷

時常有業主或者朋友問小輕&#xff0c;最合理的衣柜內部布局應該是怎樣的&#xff0c;確實這對于非業內人士一般都是不太清楚的&#xff0c;即使有的朋友已經有了豐富的生活經驗&#xff0c;甚至是業內人士也不一定對此完全了解。那么到底最合理的衣柜內部布局是怎樣的呢&#…

python爬取數據保存為csv時生成編號_將爬取到到數據以CSV格式存儲

CSV文件存儲 CSV&#xff0c;全稱為Comma-Separated Values&#xff0c;中文可以叫做逗號分隔值或字符分隔值&#xff0c;其文件以純文本形式存儲表格數據。該文件是一個字符序列&#xff0c;可以由任意數目的記錄組成&#xff0c;記錄間以某種換行符分隔。每條記錄由字段組成&…

博達3956交換機配置手冊_網絡設備維保淺談之交換機維保

隨著信息化的飛速發展&#xff0c;交換機作為信息流通的承載者&#xff0c;是應用最為廣泛的網絡設備之一&#xff0c;其作用不言而喻。因此&#xff0c;在日產使用中&#xff0c;要注意交換機這種核心的設備的維護與保養&#xff0c;以免引發故障。交換機運維需要注意哪些問題…

java cas原理_Java并發之原子變量及CAS算法-上篇

Java并發之原子變量及CAS算法-上篇編輯?概述本文主要講在Java并發編程的時候&#xff0c;如果保證變量的原子性&#xff0c;在JDK提供的類中是怎么保證變量原子性的呢&#xff1f;。對應Java中的包是&#xff1a;java.util.concurrent.atomic包下。因為涉及到了CAS算法&#x…

node ajax validator,使用validator.js對字符串數據進行驗證

validator.js是一個對字符串進行數據驗證和過濾的工具庫&#xff0c;同時支持Node端和瀏覽器端&#xff0c;github地址是https://github.com/chriso/validator.js主要API如下&#xff1a;驗證APIcontains(str, seed)驗證str中是否含有seedequals(str, comparison)驗證是否相等i…