Python爬蟲 -- 喜馬拉雅爬蟲01


這是我的第一篇博客,鄙人目前正在自學Python爬蟲,對爬蟲也是了解點皮毛。下面是我做的一個小的爬蟲腳本,分享給大家,希望大家多多提出意見。

一、思路設計

  (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 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.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 -- 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.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數據庫的表形式進行顯示

  

 


免責聲明!

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



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