簡單的網絡爬蟲-喜馬拉雅音頻爬蟲

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

網絡爬蟲按照系統結構和實現技術,大致可以分爲以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。 實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。

下面我們的實例是根據聚焦網絡爬蟲技術:

前段時間,有人給我推薦一本書有關時間管理的,聽的時候,我也順手把他爬下來。

1、使用的python編程語言:python3.6

      所使用的庫:requests,json,os

其中requests爲第三方庫,需要下載安裝(安裝步驟略)pip install requests

2、確定搜索的網址和內容

2.1 打開瀏覽器,在喜馬拉雅音頻官網找到時間管理100講

2.2 打開開發者工具或按F12,打開network查看請求信息

2.3 然後點擊【播放全部】會出現新的請求

2.3 分析數據

User-Agent:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36

Request URL1:

https://www.ximalaya.com/revision/play/album?albumId=4264862&pageNum=1&sort=-1&pageSize=30

我們可以發現這裏是請求的獲取音頻的列表,打開Respose欄可以看到:一個json樣式的返回結果

{"ret":200,"msg":"聲音播放數據","data"....

下面的wKgJJVe7B6fBZr00ABqiOS5YkyA154是獲取音頻:

Request URL2:

http://audio.xmcdn.com/group18/M06/AE/D7/wKgJJVe7B6fBZr00ABqiOS5YkyA154.m4a

2.4  下面我們就從Request URL1中的response中獲取類似Request URL2的url和對應的名稱

在Preview中點開

albumId:4264862 --書的id

albumName:"葉武濱說時間管理" -- 書名

src:"http://audio.xmcdn.com/group18/M06/AE/D7/wKgJJVe7B6fBZr00ABqiOS5YkyA154.m4a" --音頻url

trackName:"01【緣起】葉武濱說時間管理" --音頻的名稱

3.代碼實現

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
import os
class ShiJianGuanLi(object):
    def __init__(self, book_name="", book_id=None):
        if book_id is None:
            print("book_id不能爲空")
            return
        #模擬瀏覽器 瀏覽器的登陸模式
        self.headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
        }
        self.bookid = book_id
        self.start_url = "https://www.ximalaya.com/revision/play/album?albumId=%s&pageNum={}&sort=-1&pageSize=30" % self.bookid
        self.book_name = book_name
        self.book_url = []
        #獲取頁數  頁面有8頁  其實100講 每頁30  獲取四頁就足夠了
        for i in range(8):
            url = self.start_url.format(i+1)
            self.book_url.append(url)
    def get_book_msg(self):
        """獲取書的音頻和名稱"""
        #存放所有書名和地址
        all_list = []
        # 打印請求的地址頁數
        print(self.book_url)
        #獲取相應的頁面數據
        for url in self.book_url:
            r = requests.get(url, headers = self.headers)
            py_dict = json.loads(r.content.decode())
            # print(py_dict)
            #獲取首頁的數據信息
            book_list  = py_dict['data']['tracksAudioPlay']
            # 打印字典的key values 值
            # self.printDict(book_list)
            for book in book_list:
                #獲取每段音頻的名稱和地址
                list ={}
                list['name'] = book['trackName']
                list['bookname'] = book['albumName']
                list['src'] = book['src']
                #打印list
                # print(list)
                all_list.append(list)
                # 打印list
            # print(all_list)
        return all_list


    def save(self, all_list):
        """保存音頻"""
        for i in all_list:#i實際就是每個音頻的名字和url
            #喜馬拉雅/{}.m4a 通過format() 把() 裏的數據替換{} 中
            #print(i)
            #書名自定義
            if not self.book_name:
                self.book_name = i['bookname']
            dir = "喜馬拉雅/{}/".format(self.book_name)
            #檢查是否有相應的文件夾並創建目錄
            if not os.path.exists(dir):
                print("創建書名目錄:.%s"%dir)
                os.makedirs(dir)
            #os中“?”會報錯將其換爲""
            i['name'] = i['name'].replace("?","").replace('"',"")
            #在目錄下創建一個喜馬拉雅的文件夾
            with open(r'{}/{}.m4a'.format(dir, i['name']),'ab')as f:
                r = requests.get(i['src'], headers = self.headers)
                print("正在下載:{}...".format(i['name']),end="")
                f.write(r.content)
                print("\t下載完成!")


    def run(self):
        #獲取所有的音頻名稱和地址
        all_list  = self.get_book_msg()
        self.save(all_list)

    def printDict(self,dict):
        #輔助工具,用於打印節點模塊
        if type(dict) is dict:
            # 打印字典的key values 值
            for key, value in dict.items():
                print(key, ":", value)
        elif type(dict) is list:
            for d in dict:
                for key, value in d.items():
                    print(key, ":", value)

if __name__=='__main__':
    sjgl = ShiJianGuanLi("時間管理","4264862")
    sjgl.run()

4、運行後需要等待一段時間。可以查看運行目錄進行查看下載進度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章