前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。作者:Botreechan 1.進入地址我們可以發現,頁面有著非常整齊的目錄,那麼網頁源代碼中肯定也有非常規律的目錄,進去看看吧。如果你看不懂,建議先去小編的Python交流. ...
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:Botreechan
1.進入地址我們可以發現,頁面有著非常整齊的目錄,那麼網頁源代碼中肯定也有非常規律的目錄,進去看看吧。如果你看不懂,建議先去小編的Python交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,裡面有最新Python教程項目可拿,不懂的問題多跟裡面的人交流,進步更快哦!
2.很明顯猜對了,源代碼中確實有這很明顯的規律,每一章節都有著及其固定的模板:
但是這時候我們並找不到深層的規律,那麼下一步我們嘗試下播放一條音頻,但不僅僅是播放,更重要的是要抓包!!!
3.打開瀏覽器抓包工具(F12),點擊任意一條音頻,這裡我就以第一條為例了。
上面兩張圖是我抓取到的getURL和返回的json,可以看出返回的內容里確實有三條音頻地址,複製到瀏覽器可以直接播放,聽一聽就是我們要的寶貝。重點來了,getURL中我圈出來的看著是不是很眼熟?不錯,那個就是網頁源代碼裡面每個章節URL里的一個值,而這個值就是每個章節的sound_id,再按照上面的步驟,操作其他章節看看,也是一樣的規律。那麼思路很清晰了,我們只需要把每個章節的ID的sound_id替換到getURL中不就可以獲取到每個章節的音頻了麽?
4.開始寫代碼:
- import requests
- import re
- #獲取網頁源代碼&解決反爬
- header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
- html = requests.get('http://www.ximalaya.com/4228109/album/268522/',headers=header)
- print(html.text)
- reg = '<a class="title" href="/4228109/sound/(.*?)/" hashlink title="(.*?)">'
- name_url = re.findall(reg,html.text)
- print(name_url)
這個時候我們可以看到,網頁每個章節和對應sound_id都被找出來了。
5.返回的有沒有很亂?確實很亂,但是返回的都是元組類型,那麼我們來定義一個ID和標題吧。
- for sound_id,title in name_url:
- print(sound_id,title)
看下效果,有沒有耳目一新:
6.好了,回到最開始我們抓包的時候,我們的音頻都在一個抓取的json里,開始拼接咱們的json URL
- json_url = 'http://www.ximalaya.com/tracks/'+str(sound_id)+'.json'
- print(title,json_url)
7.既然已經獲取到了每個URL,那麼現在去json裡面取最終的音頻URL吧
首先去請求下每個音頻的json URL,然後正在匹配出最終的URL吧,另外如果你剛學不久,建議如果你看不懂,建議先去小編的Python交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,裡面有最新Python教程項目可拿,不懂的問題多跟裡面的人交流,進步更快哦!
- #獲取每個音頻的json URL
- json_url = 'http://www.ximalaya.com/tracks/'+str(sound_id)+'.json'
- # print(json_url)
- result = requests.get(json_url,headers=header)
- reg1 = '"play_path_64":"(.*?)"'
- #最終的音頻URL數列
- sound_url = re.findall(reg1,result.text)
- #列印音頻URL數列
- print(title,sound_url)
8.好了,URL都拿到了,可以去下載了。。。
最後,貼上完整代碼:
- import requests
- import re
- import time
- #獲取網頁源代碼&解決反爬
- header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
- html = requests.get('http://www.ximalaya.com/4228109/album/268522/',headers=header)
- # print(html.text)
- reg = '<a class="title" href="/4228109/sound/(.*?)/" hashlink title="(.*?)">'
- name_url = re.findall(reg,html.text)
- # print(name_url)
- for sound_id,title in name_url:
- # print(sound_id,title)
- #獲取每個音頻的json URL
- json_url = 'http://www.ximalaya.com/tracks/'+str(sound_id)+'.json'
- # print(json_url)
- #正則匹配出ID和音頻URL
- result = requests.get(json_url,headers=header)
- reg1 = '"play_path_64":"(.*?)"'
- #最終的音頻URL數列
- sound_url = re.findall(reg1,result.text)
- #列印音頻URL數列
- # print(sound_url)
- # print(title,sound_url[0])
- data = requests.get(sound_url[0])
- with open(title+'.m4a','wb') as f:
- f.write(data.content)
- print('下載完成:',title)
- time.sleep(1)