一、思路設計
(1)分析網頁
在喜馬拉雅主頁找到自己想要的音頻,得到目標URL:https://www.ximalaya.com/qinggan/321787/
通過分析頁面的網絡抓包,最終的到一個比較有用的json數據包
通過分析,得到了發送json數據包的一個有用的API接口:https://www.ximalaya.com/revision/play/album?albumId=321787&pageNum=2
其中album為主播的ID在頁面url中有顯示,pageNum為json數據包的“頁數”。每個json數據包有30個json數據
(2)設計代碼
向服務器發送請求 ---->? 得到json數據包 ----> 分析json數據包 ----> 提取json數據包中的有用數據 ----> 存儲到本地MongoDB數據庫
二、代碼實例
代碼共分為兩部分,執行腳本(ximalaya.py)和配置文件(config_ximalaya.py)
ximalaya.py
1 # -*- coding:utf-8; -*-2 # Author : Bingnan Huo3 # Create : 2018-12-064 import os5 import time6 import json7 import requests8 9 from threading import Thread 10 from datetime import datetime 11 from pymongo import MongoClient 12 from config_xiamalaya import * 13 14 def getWorkTimeNow(): 15 '''Acquire work time ''' 16 t = datetime.now() 17 year = t.year 18 month = t.month 19 day = t.day 20 hour = t.hour 21 minute = t.minute 22 time_str = "[%s-%s-%s-%s:%s]"%(str(year), 23 str(month), 24 str(day), 25 str(hour), 26 str(minute) 27 ) 28 return time_str 29 30 def getJsonData(userID,page): 31 '''Get target server json data''' 32 count = 0 33 pa = {"albumId":userID,"pageNum":page} 34 while(ERROR): 35 if count > 10: 36 return False 37 try: 38 ret = requests.get(url=INDEXURL,params=pa,headers=HEADERS,timeout=30,verify=True,proxies=None) 39 ret.raise_for_status() 40 except Exception as e: 41 count += 1 42 print(getWorkTimeNow(),end='') 43 print(" [INFO] Retry...") 44 continue 45 else: 46 ret.encoding = ret.apparent_encoding 47 return ret.text 48 49 def analyseJsonData(jsonData): 50 '''Analyse json data and save into MongoDB''' 51 if jsonData: 52 client = MongoClient() 53 print(getWorkTimeNow() + " [INFO] Connected to MongoDB!") 54 db = client.ximalaya# Create DataBase 55 print(getWorkTimeNow() + " [INFO] Create new database!") 56 table = getattr(db,TABLENAME)# Create Table 57 print(getWorkTimeNow() + " [INFO] Create new table --> %s" %(TABLENAME)) 58 dict_obj = json.loads(jsonData) 59 data = dict_obj["data"]# Json attr data 60 content = data["tracksAudioPlay"]# json content 61 for i in content: 62 tmp_dict = {'序號':None,'名稱':None,'Url':None,'源':None,'狀態':False,'時長':None,} 63 tmp_dict['序號'] = i['index'] 64 tmp_dict['名稱'] = i['trackName'] 65 tmp_dict['Url'] = "https://www.ximalaya.com" + i['trackUrl'] 66 tmp_dict['源'] = i['src'] 67 if i['isPaid']: 68 tmp_dict['狀態'] = True 69 tmp_dict['時長'] = i['duration'] 70 table.insert_one(tmp_dict) 71 print(getWorkTimeNow() + " [INFO] Insert one data!") 72 73 74 def DBStart(dbpath): 75 '''start MongoDB client''' 76 status = os.system("start mongod --dbpath " + dbpath) 77 if not status: 78 print(getWorkTimeNow() + " [INFO] DataBase start!") 79 return True 80 else: 81 print(getWorkTimeNow() + " [INFO] DataBase Failed...") 82 return False 83 def execute(user_id,page): 84 json_data = getJsonData(user_id, page) 85 analyseJsonData(json_data) 86 87 def main(): 88 DBStart(DBPATH) 89 for page in PAGECONTIANER: 90 execute(USERID, str(page)) 91 92 93 94 95 if __name__ == "__main__": 96 main()
config_ximalaya.py
1 # -*- coding:utf-8 -*-2 # ximalaya.py -- config3 import time4 5 def getUnixTime():6 t = time.time()7 return str(int(t))8 9 10 11 INDEXURL = " https://www.ximalaya.com/revision/play/album" 12 13 ERROR = True 14 15 HEADERS = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0", 16 17 18 } 19 """ 20 Cookie:x_xmly_traffic=utm_source%253A%2526utm_medium%253A%2526utm_campaign%253A%2526utm_content%253A%2526utm_term%253A%2526utm_from%253A; 21 device_id=xm_1544076474056_jpc79kg8f1h3u6; 22 Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070=1544076479; 23 Hm_lpvt_4a7d8ec50cfd6af753c4f8aee3425070=1544076479 24 API : https://www.ximalaya.com/revision/play/album?albumId=321787&pageNum=1 25 26 """ 27 COOKIE = {"x_xmly_traffic":"utm_source%253A%2526utm_medium%253A%2526utm_campaign%253A%2526utm_content%253A%2526utm_term%253A%2526utm_from%253A", 28 "device_id":"xm_1544076474056_jpc79kg8f1h3u6", 29 "Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070":getUnixTime(), 30 "Hm_lpvt_4a7d8ec50cfd6af753c4f8aee3425070":getUnixTime() 31 } 32 33 DBPATH = "D:\\MongoDB\\data\\db" 34 35 TABLENAME = "Test_321787_02" 36 37 PAGECONTIANER = [i for i in range(1,10)] 38 39 USERID = "321787"
三、執行結果
最終的數據插入到了本地的MongoDB數據庫
由于MongoDB為NoSQL型數據庫,該數據庫采用BOSN數據類型(json加強版)進行存儲
在RoboMongo中也可以用MySQL數據庫的表形式進行顯示
最后:如果你對Python感興趣,想要學習Python,希望可以幫到你,一起加油!以上是給大家分享的Python全套學習資料,都是我自己學習時整理的:
一、Python所有方向的學習路線
Python所有方向路線就是把Python常用的技術點做整理,形成各個領域的知識點匯總,它的用處就在于,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。
二、學習軟件
工欲善其事必先利其器。學習Python常用的開發軟件都在這里了,還有環境配置的教程,給大家節省了很多時間。
三、全套PDF電子書
書籍的好處就在于權威和體系健全,剛開始學習的時候你可以只看視頻或者聽某個人講課,但等你學完之后,你覺得你掌握了,這時候建議還是得去看一下書籍,看權威技術書籍也是每個程序員必經之路。
四、入門學習視頻全套
我們在看視頻學習的時候,不能光動眼動腦不動手,比較科學的學習方法是在理解之后運用它們,這時候練手項目就很適合了。
五、實戰案例
光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。
?**學習資源已打包,需要的小伙伴可以戳這里:【學習資料】