python3_爬蟲_爬百度音樂


工具及環境

1、操作系統:windows 64位系統

2、軟件工具:谷歌瀏覽器、pycharm集成開發工具

3、第三方庫:request

注:如果第三方庫搭建有困難,請看博客:https://www.cnblogs.com/chuijingjing/p/9157049.html

明確要目標

首先,我們了解一下什么是爬蟲。網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。

我們今天要爬的內容是百度音樂里面的音樂,為什么要爬百度音樂呢?當然是因為這個軟件太垃圾了,根本沒有反扒機制,所以我們挑軟柿子捏。像我們的信仰網易雲音樂是不可能讓我們輕易爬到它的內容的,如果想要爬網易雲,要有防反爬機制。我們這次只是簡單介紹爬蟲的原理,寫一個小小的爬蟲,下次我會給大家帶來一個加入防反爬機制復雜的爬蟲。話不多說,讓我們開干!

說干咱就干

1、脈絡梳理

首先,我們把要做的工作先來大體梳理一下,好有一個清晰的脈絡。

1.爬蟲的本質(模擬瀏覽器的行為)
    網絡爬蟲;
    模擬瀏覽器,訪問互聯網資源,根據我們制定的規則,
    批量的下載我們所需要的數據的程序。
    
2.利用谷歌瀏覽器分析http請求
    網絡資源(例如:網上的歌曲、圖片),每一個網絡
    資源都有全球唯一的一個url。
    url(全球統一資源定位符)
    
    F12 打開
    network選項監控http請求
    
3.分析百度音樂的請求流程
    下載mp3
    倒推法
        1、先找到mp3的下載請求
        2、歌曲的下載地址也是從服務器請求回來的,
           找到下載地址的那個請求,根據歌曲id
        3、找到歌曲的id
        
    
4.通過python去實現請求

 

2、瀏覽器設置

我們先進入“百度音樂”,搜索你喜歡的歌手的音樂,我比較喜歡華仔。然后點擊瀏覽器右上方的三個點,選擇“更多工具”,選擇“開發者工具”,進入開發者模式。或者直接按“F12”進入開發者模式。

點擊“Network”,在“Disable cache”前面打上√,不要去緩存,否則死活找不到請求的數據

按照1、2、3、4、5的順序做下來

1:清空內容;

2:回車,發出請求;

3:查看所有請求的信息;

4:每個請求的名字;

5:每個請求的詳細信息。

 

Header:頭信息

  1. Request URL:http://music.baidu.com/cms/hunter/alog/speed.min.js?v=160115   # 請求的地址
  2. Request Method:GET  # 請求的方法
  3. Status Code:200 OK   # http請求成功后返回的 int值
  4. Remote Address:180.76.141.217:80  # 遠程地址
  5. Referrer Policy:no-referrer-when-downgrade  # 按照瀏覽器的默認值執行。默認值為 no-referrer-when-downgrade

先點完上面三個標注按鈕,然后點擊播放按鈕,播放音樂;

音樂播放幾秒鍾后關閉播放,然后點擊下面的三個按鈕;

接下來就是分析歌曲的頭信息Headers了。

按照圖示,找到網頁文字對應的網頁源碼的信息

上面界面中鼠標右鍵查看頁面源碼,出現下面的源碼界面,按Ctrl+F出現搜索界面,搜索要用到的內容。

 

 

3、爬取一首歌曲

由淺入深,我們先來寫一段簡單的代碼,用它來只爬取一首歌。

# -*- coding: utf-8 -*-
# the auther is cjj

import requests  # 導入關於請求模塊
url = 'http://zhangmenshiting.qianqian.com/data2/music/5ebb214edf0a1589e3e1ca58196981e5/594723982/
    594723982.mp3?xcode=f6925df9ce85d4400c486914f0acd7b6
' # 發送http請求 response = requests.get(url) # response 接收請求回來的數據 print(response.content) # response.content 輸出歌曲的二進制信息 # 把下載下來的歌曲儲存為mp3文件 with open('mp3.mp3','wb') as f: # 把文件以‘f’的名字命名,下面以‘f’為名字打開 f.write(response.content)

這樣,我們就可以實現爬蟲的基本功能了,我們來看一下這首歌能不能聽。

這是你的代碼和歌曲儲存地址,我們去這里來找一下華仔的“慢慢”

果然在這里找到了,雙擊之后發現歌曲可以正常播放。

這樣,我們完成了一個最簡單的歌曲的爬取。

注:文件操作方面如果不了解可以參考:https://www.cnblogs.com/chuijingjing/articles/8034238.html

4、代碼演示

文件操作內容:https://www.cnblogs.com/chuijingjing/articles/8034238.html

字典相關內容:https://www.cnblogs.com/chuijingjing/articles/8007387.html

json相關內容:https://www.cnblogs.com/chuijingjing/articles/8074292.html

正則相關內容:http://www.runoob.com/regexp/regexp-syntax.html

 

# -*- coding: utf-8 -*-
# the auther is cjj

import requests
import re
# 第一步,獲取歌曲的ids
search_api = 'http://music.baidu.com/search'
# 搜索關鍵字,傳遞參數,通過字典構造
keyword = {'key': '劉德華'}
# 發送get請求   params 是傳遞的get參數
response = requests.get(search_api, params=keyword)
# 取出html的源碼
response.encoding = 'utf-8'  # 編碼轉換
html = response.text
# 通過正則表達式獲取id
ids = re.findall(r'{"id":"(\d+)&quot',html)

# 第二步,獲取歌曲的信息
mp3_info_api = 'http://play.baidu.com/data/music/songlink'
data = {
    'songIds': ','.join(ids),
    'hq': 0,
    'type': 'm4a,mp3',
    'rate': '',
    'pt': 0,
    'flag': -1,
    's2p': -1,
    'prerate': -1,
    'bwt': -1,
    'dur': -1,
    'bat': -1,
    'bp': -1,
    'pos': -1,
    'auto': -1
}
# data就是 post的參數
res = requests.post(mp3_info_api,data=data)
# 返回值的數據是就送格式,直接調用json方法,轉成字典
info = res.json()

# 第三步,去下載歌曲
# 根據數據的結構獲取歌曲的信息
song_info = info['data']['songList']
# 循環
for song in song_info:
    # 根據數據結構獲取信息
    # 歌名
    song_name = song['songName']
    # mp3地址
    song_link = song['songLink']
    # 格式
    for_mat = song['format']
    # 歌詞地址
    lrclink = song['lrcLink']
    print(song_name)
    # 下載mp3
    if song_link: # 可能沒有地址
        song_res = requests.get(song_link) # 下載
        # 寫文件
        with open('%s.%s' % (song_name, for_mat),'wb') as f:
            f.write(song_res.content)  # 歌曲是二進制
    # 下載歌詞
    if lrclink:
        lrc_response = requests.get(lrclink)
        # 寫文件
        with open('%s.lrc' % song_name, 'w', encoding= 'gbk') as f:
            f.write(lrc_response.text)

下面是成功爬取到的音樂!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM