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

python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法

 更新時(shí)間:2019年08月24日 10:04:49   作者:xiaopihaierletian  
今天小編就為大家分享一篇python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

在上次的爬蟲中,抓取的數(shù)據(jù)主要用到的是第三方的Beautifulsoup庫(kù),然后對(duì)每一個(gè)具體的數(shù)據(jù)在網(wǎng)頁中的selecter來找到它,每一個(gè)類別便有一個(gè)select方法。對(duì)網(wǎng)頁有過接觸的都知道很多有用的數(shù)據(jù)都放在一個(gè)共同的父節(jié)點(diǎn)上,只是其子節(jié)點(diǎn)不同。在上次爬蟲中,每一類數(shù)據(jù)都要從其父類(包括其父節(jié)點(diǎn)的父節(jié)點(diǎn))上往下尋找ROI數(shù)據(jù)所在的子節(jié)點(diǎn),這樣就會(huì)使爬蟲很臃腫,因?yàn)楹芏鄶?shù)據(jù)有相同的父節(jié)點(diǎn),每次都要重復(fù)的找到這個(gè)父節(jié)點(diǎn)。這樣的爬蟲效率很低。

因此,筆者在上次的基礎(chǔ)上,改進(jìn)了一下爬取的策略,筆者以實(shí)例來描述。

如圖,筆者此次爬取的是百度音樂的頁面,所爬取的類容是上面榜單下的所有內(nèi)容(歌曲名,歌手,排名)。如果按照上次的爬蟲的方法便要寫上三個(gè)select方法,分別抓取歌曲名,歌手,排名,但筆者觀察得知這三項(xiàng)數(shù)據(jù)皆放在一個(gè)li標(biāo)簽內(nèi),如圖:

這樣我們是不是直接抓取ul標(biāo)簽,再分析其中的數(shù)據(jù)便可得到全部數(shù)據(jù)了?答案是,當(dāng)然可以。

但Beaufulsoup不能直接提供這樣的方法,但Python無所不能,python里面自帶的re模塊是我見過最迷人的模塊之一。它能在字符串中找到我們讓我們r(jià)oi的區(qū)域,上述的li標(biāo)簽中包含了我們需要的歌曲名,歌手,排名數(shù)據(jù),我們只需要在li標(biāo)簽中通過re.findall()方法,便可找到我們需要的數(shù)據(jù)。這樣就能夠大大提升我們爬蟲的效率。

我們先來直接分析代碼:

def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S) 
 pattern2 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S) 
 
 wants = [] 
 for item in data: 
  # print(item) 
  final = re.findall(pattern1, str(item)) 
  if len(final) == 1: 
   # print(final[0]) 
   wants.append(final[0]) 
  else: 
   other = re.findall(pattern2, str(item)) 
   # print(other[0]) 
   wants.append(other[0]) 
 return wants 

上面的代碼是我分析網(wǎng)頁數(shù)據(jù)的全部代碼,這里不得不說python語言的魅力,數(shù)十行代碼便能完成java100行的任務(wù),C/C++1000行的任務(wù)。上述函數(shù)中,筆者首先通過Beautifulsoup得到該網(wǎng)頁的源代碼,再通過select()方法得到所有l(wèi)i標(biāo)簽中的數(shù)據(jù)。

到這里,這個(gè)爬蟲便要進(jìn)入到最重要的環(huán)節(jié)了,相信很多不懂re模塊的童靴們有點(diǎn)慌張,在這里筆者真的是強(qiáng)烈推薦對(duì)python有興趣的童靴們一定要學(xué)習(xí)這個(gè)非常重要的一環(huán)。首先,我們知道re的方法大多只針對(duì)string型數(shù)據(jù),因此我們調(diào)用str()方法將每個(gè)list中的數(shù)據(jù)(即item)轉(zhuǎn)換為string型。然后便是定義re的pattern了,這是個(gè)稍顯復(fù)雜的東西,其中主要用到re.compile()函數(shù)得到要在string中配對(duì)的pattern,這里筆者便不累述了,感興趣的童靴可以去網(wǎng)上查閱一下資料。

上述代碼中,筆者寫了兩個(gè)pattern,因?yàn)榘俣纫魳返木W(wǎng)頁里,li標(biāo)簽有兩個(gè)結(jié)構(gòu),當(dāng)用一個(gè)pattern在li中找不到數(shù)據(jù)時(shí),便使用另一個(gè)pattern。關(guān)于re.findadd()方法,它會(huì)返回一個(gè)list,里面裝著tuple,但其實(shí)我們知道我們找到的數(shù)據(jù)就是list[0],再將每個(gè)數(shù)據(jù)添加到另一個(gè)List中,讓函數(shù)返回。

相信很多看到這里的小伙伴已經(jīng)云里霧里,無奈筆者對(duì)re板塊也知道的不多,對(duì)python感興趣的同學(xué)可以查閱相關(guān)資料再來看一下代碼,相信能夠如魚得水。

完整的代碼如下:

import requests 
from bs4 import BeautifulSoup 
import re 
 
 
def get_one_page(url): 
 wb_data = requests.get(url) 
 wb_data.encoding = wb_data.apparent_encoding 
 if wb_data.status_code == 200: 
  return wb_data.text 
 else: 
  return None 
 
 
def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S) 
 pattern2 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S) 
 
 wants = [] 
 for item in data: 
  # print(item) 
  final = re.findall(pattern1, str(item)) 
  if len(final) == 1: 
   # print(final[0]) 
   wants.append(final[0]) 
  else: 
   other = re.findall(pattern2, str(item)) 
   # print(other[0]) 
   wants.append(other[0]) 
 return wants 
 
 
if __name__ == '__main__': 
 url = 'http://music.baidu.com/' 
 html = get_one_page(url) 
 data = parse_one_page(html) 
 for item in data: 
  dict = { 
   '序列': item[0], 
   '歌名': item[1], 
   '歌手': item[2] 
  } 
  print(dict) 

最后我們看到的輸出結(jié)果如下:

好了,筆者今天就到這里了。希望喜歡python的萌新能夠快速實(shí)現(xiàn)自己的spider,也希望一些大神們能夠看到這篇文章時(shí)不吝賜教。

以上這篇python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python圖像加噪聲的實(shí)現(xiàn)示例

    python圖像加噪聲的實(shí)現(xiàn)示例

    圖像加噪聲就是其中一種常見的處理方式,噪聲可以幫助提高圖像的真實(shí)性和復(fù)雜性,使得處理后的圖像更加接近真實(shí)的場(chǎng)景,本文主要介紹了python圖像加噪聲的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2023-08-08
  • Python與xlwings黃金組合處理Excel各種數(shù)據(jù)和自動(dòng)化任務(wù)

    Python與xlwings黃金組合處理Excel各種數(shù)據(jù)和自動(dòng)化任務(wù)

    這篇文章主要為大家介紹了Python與xlwings黃金組合處理Excel各種數(shù)據(jù)和自動(dòng)化任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-12-12
  • 分析語音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)

    分析語音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)

    數(shù)據(jù)增強(qiáng)是一種生成合成數(shù)據(jù)的方法,即通過調(diào)整原始樣本來創(chuàng)建新樣本。這樣我們就可獲得大量的數(shù)據(jù)。這不僅增加了數(shù)據(jù)集的大小,還提供了單個(gè)樣本的多個(gè)變體,這有助于我們的機(jī)器學(xué)習(xí)模型避免過度擬合
    2021-06-06
  • Django數(shù)據(jù)庫(kù)(SQlite)基本入門使用教程

    Django數(shù)據(jù)庫(kù)(SQlite)基本入門使用教程

    django有默認(rèn)自帶的數(shù)據(jù)庫(kù),當(dāng)然也可以用其他的數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于Django數(shù)據(jù)庫(kù)(SQlite)基本入門使用教程的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)(案例分析)

    python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)(案例分析)

    最近做了一個(gè)簡(jiǎn)單的文件傳輸系統(tǒng),基于ftp協(xié)議,使用python語言開發(fā),雖然python里面已經(jīng)有ftplib模塊,可以很容易的實(shí)現(xiàn)ftp服務(wù)器,這篇文章主要介紹了python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)的案例分析,需要的朋友可以參考下
    2020-03-03
  • python實(shí)現(xiàn)將內(nèi)容分行輸出

    python實(shí)現(xiàn)將內(nèi)容分行輸出

    本文給大家分享的是使用python實(shí)現(xiàn)將一行里的內(nèi)容進(jìn)行分行輸出,一共給出了四種方法,小伙伴們可以參考下
    2015-11-11
  • Python中Arrow庫(kù)的時(shí)間操作技法總結(jié)

    Python中Arrow庫(kù)的時(shí)間操作技法總結(jié)

    Arrow是一個(gè)功能強(qiáng)大、易用且具有優(yōu)雅設(shè)計(jì)的Python日期時(shí)間庫(kù),它建立在Python的datetime模塊之上,旨在彌補(bǔ)datetime模塊在處理日期時(shí)間時(shí)的一些不足之處,下面我們就來了解一下Arrow庫(kù)的常見時(shí)間操作吧
    2023-12-12
  • 在Python下嘗試多線程編程

    在Python下嘗試多線程編程

    這篇文章主要介紹了在Python下多線程編程的嘗試,由于GIL的存在,多線程在Python開發(fā)領(lǐng)域一直是個(gè)熱門問題,需要的朋友可以參考下
    2015-04-04
  • Python爬取豆瓣視頻信息代碼實(shí)例

    Python爬取豆瓣視頻信息代碼實(shí)例

    這篇文章主要介紹了Python爬取豆瓣視頻信息代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解用Python處理Args的3種方法

    詳解用Python處理Args的3種方法

    這篇文章主要介紹了用Python處理Args的3種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論