1. 程式人生 > >筆記——用Requests庫和BeautifulSoup庫爬取酷狗音樂資料

筆記——用Requests庫和BeautifulSoup庫爬取酷狗音樂資料

酷狗音樂top500榜單鏈接:http://www.kugou.com/yy/rank/home/1-8888.html

觀察每頁的url,將第一頁url中home/後的1改成2,就恰好是第二頁的url。

首先匯入相應的庫,同時設定好瀏覽器的header:

import requests
from bs4 import BeautifulSoup
import time

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0'
}

接下來寫獲取網頁資訊的函式,這裡需要事先載入lxml包,否則會報錯。

我們要爬取的資訊有4項:排名、歌手、歌曲名、時長,分別右鍵每個部分,選擇【檢視元素】,可以找到它們的原始碼分別如下:

使用soup.select()函式時,括號裡是‘標籤名.類別名’,比如對於【排名】(ranks)這一項,括號裡就應該是'span.pc_temp_num',而如果只寫最小的標籤的類別名無法爬取時,可以由大標籤開始一層一層寫到小標籤,中間用大於號連結(注意,大於號的前後都要打上空格,否則錯誤),比如下面的【名稱】(titles)這一項,soup.select()函式的括號裡就是'div.pc_temp_songlist > ul > li > a',從母標籤一層一層寫到我們所需要的a標籤。

【時長】(times)的寫法也是同樣的道理,書上是從大的那個span的標籤開始寫的,我試了一下直接用'span.pc_temp_time'也是可以的。

做好了lxml方法下的網頁解析,接下來就用一個迴圈,來將每一條資料設定成字典的形式:

    for rank,title,time in zip(ranks,titles,times):
        data={
            'rank':rank.get_text().strip(),
            'singer':title.get_text().split('-')[0],
            'song':title.get_text().split('-')[1],
            'time':time.get_text().strip()
        }
        print(data)

最後一波是構造多頁的url,同時對每一頁呼叫之前寫的網頁解析的函式,對於構造多頁url這件事,一句話就能搞定:

urls=['http://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1,24)]

綜合上面的分析,完整的程式碼如下:

import requests
from bs4 import BeautifulSoup
import time

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0'
}

def get_info(url):
    urldata=requests.get(url,headers=headers)
    soup=BeautifulSoup(urldata.text,'lxml')
    ranks=soup.select('span.pc_temp_num')
    titles=soup.select('div.pc_temp_songlist > ul > li > a')
    times=soup.select('span.pc_temp_time')
    for rank,title,time in zip(ranks,titles,times):
        data={
            'rank':rank.get_text().strip(),
            'singer':title.get_text().split('-')[0],
            'song':title.get_text().split('-')[1],
            'time':time.get_text().strip()
        }
        print(data)

if __name__ =='__main__': #程式主入口
    urls=['http://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1,24)]
    for url in urls:
        get_info(url)
        time.sleep(1)

好啦~大功告成,得到了五百條資料,就像這樣: