最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

但Beaufulsoup不能直接提供這樣的方法,但Python無所不能,python里面自帶的re模塊是我見過最迷人的模塊之一。它能在字符串中找到我們讓我們roi的區(qū)域,上述的li標簽中包含了我們需要的歌曲名,歌手,排名數(shù)據(jù),我們只需要在li標簽中通過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標簽中的數(shù)據(jù)。

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

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

相信很多看到這里的小伙伴已經(jīng)云里霧里,無奈筆者對re板塊也知道的不多,對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的萌新能夠快速實現(xiàn)自己的spider,也希望一些大神們能夠看到這篇文章時不吝賜教。

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

相關(guān)文章

  • Python實現(xiàn)在不同坐標系中繪制曲線

    Python實現(xiàn)在不同坐標系中繪制曲線

    這篇文章主要為大家學(xué)習(xí)介紹了Python如何實現(xiàn)在不同坐標系中繪制曲線,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • Python中函數(shù)的返回值示例淺析

    Python中函數(shù)的返回值示例淺析

    這篇文章主要給大家介紹了關(guān)于Python中函數(shù)返回值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python查看FTP是否能連接成功的方法

    python查看FTP是否能連接成功的方法

    這篇文章主要介紹了python查看FTP是否能連接成功的方法,實例分析了Python連接FTP的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Python dash-fastapi前后端搭建過程

    Python dash-fastapi前后端搭建過程

    項目中需要快速搭建一個前后端系統(tǒng),涉及到dash-fastapi架構(gòu)的時候,對該架構(gòu)的時候進行總結(jié),本文主要總結(jié)的是對該架構(gòu)的基本使用,后續(xù)再對該架構(gòu)的項目源碼進行總結(jié)分析,感興趣的朋友一起看看吧
    2025-03-03
  • Python數(shù)據(jù)提取-lxml模塊

    Python數(shù)據(jù)提取-lxml模塊

    這篇文章主要介紹了Python數(shù)據(jù)提取-lxml模塊,lxml模塊和xpath語法的關(guān)系,lxml模塊的使用場景、lxml模塊的安裝、谷歌瀏覽器xpath?helper插件的安裝和使用等相關(guān)內(nèi)容介紹,需要的朋友可以參考一下
    2022-01-01
  • 聊聊prod()與cumprod()區(qū)別cumsum()

    聊聊prod()與cumprod()區(qū)別cumsum()

    這篇文章主要介紹了prod()與cumprod()區(qū)別cumsum(),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python?代替?xftp?從?Linux?服務(wù)器下載文件的操作方法

    Python?代替?xftp?從?Linux?服務(wù)器下載文件的操作方法

    我們經(jīng)常需要從Linux服務(wù)器上同步文件,但是xftp等工具都需要注冊了,這里用免費的Python代碼來下載文件,還可以擴展更多的自定義用法,這篇文章主要介紹了Python?代替?xftp?從?Linux?服務(wù)器下載文件,需要的朋友可以參考下
    2024-06-06
  • 兩個命令把 Vim 打造成 Python IDE的方法

    兩個命令把 Vim 打造成 Python IDE的方法

    這篇文章主要介紹了兩個命令把 Vim 打造成 Python IDE,需要的朋友可以參考下
    2016-03-03
  • 通過python實現(xiàn)Google的精準搜索功能

    通過python實現(xiàn)Google的精準搜索功能

    這篇文章主要介紹了通過python實現(xiàn)Google的精準搜索功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-05-05
  • 深入解析NumPy中的Broadcasting廣播機制

    深入解析NumPy中的Broadcasting廣播機制

    在吳恩達老師的深度學(xué)習(xí)專項課程中,老師有提到NumPy中的廣播機制,同時那一周的測驗也有涉及到廣播機制的題目。那么,到底什么是NumPy中的廣播機制?本文就來介紹一下
    2021-05-05

最新評論

周口市| 吉首市| 荔浦县| 垫江县| 汪清县| 科技| 竹北市| 游戏| 张掖市| 班玛县| 托里县| 建瓯市| 承德县| 固始县| 肥东县| 吴桥县| 永州市| 华坪县| 洪洞县| 美姑县| 白山市| 永清县| 开原市| 武宁县| 梨树县| 黄浦区| 阿荣旗| 通化市| 凤冈县| 秦皇岛市| 太和县| 惠安县| 包头市| 黎城县| 新竹县| 尉氏县| 靖州| 金华市| 桃园县| 泰顺县| 大英县|