admin 管理员组

文章数量: 887021

一、思路设计

(1)分析网页

在喜马拉雅主页找到自己想要的音频,得到目标

通过分析页面的网络抓包,最终的到一个比较有用的json数据包

通过分析,得到了发送json数据包的一个有用的API接口:https://www.ximalaya/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 Huo
 3 # Create : 2018-12-06
 4 import os 5 import time 6 import json 7 import requests 8 
 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" + 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 -- config
 3 import time 4 
 5 def getUnixTime(): 6     t = time.time() 7     return str(int(t)) 8 
 9 
10 
11 INDEXURL = " https://www.ximalaya/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/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数据库的表形式进行显示
 
代码仅用做项目练习,切勿商用
由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。
全套Python学习资料分享:

一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。


二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。


五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

本文标签: 爬虫 喜马拉雅 python