python爬蟲之爬取百度音樂的實(shí)現(xiàn)方法
在上次的爬蟲中,抓取的數(shù)據(jù)主要用到的是第三方的Beautifulsoup庫(kù),然后對(duì)每一個(gè)具體的數(shù)據(jù)在網(wǎng)頁(yè)中的selecter來找到它,每一個(gè)類別便有一個(gè)select方法。對(duì)網(wǎng)頁(yè)有過接觸的都知道很多有用的數(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í)例來描述。

如圖,筆者此次爬取的是百度音樂的頁(yè)面,所爬取的類容是上面榜單下的所有內(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)頁(yè)數(shù)據(jù)的全部代碼,這里不得不說python語(yǔ)言的魅力,數(shù)十行代碼便能完成java100行的任務(wù),C/C++1000行的任務(wù)。上述函數(shù)中,筆者首先通過Beautifulsoup得到該網(wǎng)頁(yè)的源代碼,再通過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)頁(yè)里,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è)參考,也希望大家多多支持腳本之家。
- python 爬取百度文庫(kù)并下載(免費(fèi)文章限定)
- Python實(shí)現(xiàn)的爬取百度文庫(kù)功能示例
- 用python下載百度文庫(kù)的代碼
- python 爬蟲如何實(shí)現(xiàn)百度翻譯
- 詳解用Python爬蟲獲取百度企業(yè)信用中企業(yè)基本信息
- Python爬蟲爬取百度搜索內(nèi)容代碼實(shí)例
- Python爬蟲實(shí)現(xiàn)百度翻譯功能過程詳解
- python 爬蟲百度地圖的信息界面的實(shí)現(xiàn)方法
- Python爬蟲實(shí)現(xiàn)爬取百度百科詞條功能實(shí)例
- python爬蟲獲取百度首頁(yè)內(nèi)容教學(xué)
- Python爬蟲實(shí)現(xiàn)百度圖片自動(dòng)下載
- Python爬蟲實(shí)例_利用百度地圖API批量獲取城市所有的POI點(diǎn)
- python實(shí)現(xiàn)百度文庫(kù)自動(dòng)化爬取
相關(guān)文章
Python實(shí)現(xiàn)在不同坐標(biāo)系中繪制曲線
這篇文章主要為大家學(xué)習(xí)介紹了Python如何實(shí)現(xiàn)在不同坐標(biāo)系中繪制曲線,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-07-07
聊聊prod()與cumprod()區(qū)別cumsum()
這篇文章主要介紹了prod()與cumprod()區(qū)別cumsum(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python?代替?xftp?從?Linux?服務(wù)器下載文件的操作方法
我們經(jīng)常需要從Linux服務(wù)器上同步文件,但是xftp等工具都需要注冊(cè)了,這里用免費(fèi)的Python代碼來下載文件,還可以擴(kuò)展更多的自定義用法,這篇文章主要介紹了Python?代替?xftp?從?Linux?服務(wù)器下載文件,需要的朋友可以參考下2024-06-06
兩個(gè)命令把 Vim 打造成 Python IDE的方法
這篇文章主要介紹了兩個(gè)命令把 Vim 打造成 Python IDE,需要的朋友可以參考下2016-03-03
通過python實(shí)現(xiàn)Google的精準(zhǔn)搜索功能
這篇文章主要介紹了通過python實(shí)現(xiàn)Google的精準(zhǔn)搜索功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-05-05
深入解析NumPy中的Broadcasting廣播機(jī)制
在吳恩達(dá)老師的深度學(xué)習(xí)專項(xiàng)課程中,老師有提到NumPy中的廣播機(jī)制,同時(shí)那一周的測(cè)驗(yàn)也有涉及到廣播機(jī)制的題目。那么,到底什么是NumPy中的廣播機(jī)制?本文就來介紹一下2021-05-05

