Python爬蟲音頻數據

来源:http://www.cnblogs.com/jiaoyu121/archive/2017/06/18/7045746.html
-Advertisement-
Play Games

這次數據量在70萬左右。音頻數據包括音頻下載地址,頻道信息,簡介等等,非常多。 ...


一:前言

本次爬取的是喜馬拉雅的熱門欄目下全部電臺的每個頻道的信息和頻道中的每個音頻數據的各種信息,然後把爬取的數據保存到mongodb以備後續使用。這次數據量在70萬左右。音頻數據包括音頻下載地址,頻道信息,簡介等等,非常多。
昨天進行了人生中第一次面試,對方是一家人工智慧大數據公司,我準備在這大二的暑假去實習,他們就要求有爬取過音頻數據,所以我就來分析一下喜馬拉雅的音頻數據爬下來。目前我還在等待三面中,或者是通知最終面試消息。 (因為能得到一定肯定,不管成功與否都很開心)


二:運行環境

  • IDE:Pycharm 2017
  • Python3.6
  • pymongo 3.4.0
  • requests 2.14.2
  • lxml 3.7.2
  • BeautifulSoup 4.5.3

三:實例分析

1.首先進入這次爬取的主頁面http://www.ximalaya.com/dq/all/ ,可以看到每頁12個頻道,每個頻道下麵有很多的音頻,有的頻道中還有很多分頁。抓取計劃:迴圈84個頁面,對每個頁面解析後抓取每個頻道的名稱,圖片鏈接,頻道鏈接保存到mongodb。


熱門頻道

2.打開開發者模式,分析頁面,很快就可以得到想要的數據的位置。下麵的代碼就實現了抓取全部熱門頻道的信息,就可以保存到mongodb中。

start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(1, 85)]
for start_url in start_urls:
    html = requests.get(start_url, headers=headers1).text
    soup = BeautifulSoup(html, 'lxml')
    for item in soup.find_all(class_="albumfaceOutter"):
        content = {
            'href': item.a['href'],
            'title': item.img['alt'],
            'img_url': item.img['src']
        }
        print(content)

分析頻道

3.下麵就是開始獲取每個頻道中的全部音頻數據了,前面通過解析頁面獲取到了美國頻道的鏈接。比如我們進入http://www.ximalaya.com/6565682/album/237771 這個鏈接後分析頁面結構。可以看出每個音頻都有特定的ID,這個ID可以在一個div中的屬性中獲取。使用split()和int()來轉換為單獨的ID。


頻道頁面分析

4.接著點擊一個音頻鏈接,進入開發者模式後刷新頁面然後點擊XHR,再點擊一個json鏈接可以看到這個就包括這個音頻的全部詳細信息。

html = requests.get(url, headers=headers2).text
numlist = etree.HTML(html).xpath('//div[@class="personal_body"]/@sound_ids')[0].split(',')
for i in numlist:
    murl = 'http://www.ximalaya.com/tracks/{}.json'.format(i)
    html = requests.get(murl, headers=headers1).text
    dic = json.loads(html)

音頻頁面分析


5.上面只是對一個頻道的主頁面解析全部音頻信息,但是實際上頻道的音頻鏈接是有很多分頁的。

html = requests.get(url, headers=headers2).text
ifanother = etree.HTML(html).xpath('//div[@class="pagingBar_wrapper"]/a[last()-1]/@data-page')
if len(ifanother):
    num = ifanother[0]
    print('本頻道資源存在' + num + '個頁面')
    for n in range(1, int(num)):
        print('開始解析{}個中的第{}個頁面'.format(num, n))
        url2 = url + '?page={}'.format(n)
        # 之後就接解析音頻頁函數就行,後面有完整代碼說明

分頁

6.全部代碼
完整代碼地址github.com/rieuse/learnPython

__author__ = '布咯咯_rieuse'

import json
import random
import time
import pymongo
import requests
from bs4 import BeautifulSoup
from lxml import etree

clients = pymongo.MongoClient('localhost')
db = clients["XiMaLaYa"]
col1 = db["album"]
col2 = db["detaile"]

UA_LIST = []  # 很多User-Agent用來隨機使用可以防ban,顯示不方便不貼出來了
headers1 = {} # 訪問網頁的headers,這裡顯示不方便我就不貼出來了
headers2 = {} # 訪問網頁的headers這裡顯示不方便我就不貼出來了

def get_url():
    start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(1, 85)]
    for start_url in start_urls:
        html = requests.get(start_url, headers=headers1).text
        soup = BeautifulSoup(html, 'lxml')
        for item in soup.find_all(class_="albumfaceOutter"):
            content = {
                'href': item.a['href'],
                'title': item.img['alt'],
                'img_url': item.img['src']
            }
            col1.insert(content)
            print('寫入一個頻道' + item.a['href'])
            print(content)
            another(item.a['href'])
        time.sleep(1)


def another(url):
    html = requests.get(url, headers=headers2).text
    ifanother = etree.HTML(html).xpath('//div[@class="pagingBar_wrapper"]/a[last()-1]/@data-page')
    if len(ifanother):
        num = ifanother[0]
        print('本頻道資源存在' + num + '個頁面')
        for n in range(1, int(num)):
            print('開始解析{}個中的第{}個頁面'.format(num, n))
            url2 = url + '?page={}'.format(n)
            get_m4a(url2)
    get_m4a(url)


def get_m4a(url):
    time.sleep(1)
    html = requests.get(url, headers=headers2).text
    numlist = etree.HTML(html).xpath('//div[@class="personal_body"]/@sound_ids')[0].split(',')
    for i in numlist:
        murl = 'http://www.ximalaya.com/tracks/{}.json'.format(i)
        html = requests.get(murl, headers=headers1).text
        dic = json.loads(html)
        col2.insert(dic)
        print(murl + '中的數據已被成功插入mongodb')


if __name__ == '__main__':
    get_url()

7.如果改成非同步的形式可以快一點,只需要修改成下麵這樣就行了。我試了每分鐘要比普通的多獲取近100條數據。這個源代碼也在github中。


非同步

五:總結

這次抓取的數據量在70萬左右,這些數據後續可以進行很多研究,比如播放量排行榜、時間區段排行、頻道音頻數量等等。後續我將繼續學習使用科學計算和繪圖工具來進行數據分析,清洗的工作。

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入學習交流群
626062078,我們一起學Python!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址http://www.cnblogs.com/xrq730/p/7003082.html,轉載請註明出處,謝謝 前言 一年半前寫了一篇文章Spring3:AOP,是當時學習如何使用Spring AOP的時候寫的,比較基礎。這篇文章最後的推薦以及回覆認為我寫的對大家有幫助的評論有很多,但是現在 ...
  • //希爾排序 加多一個gap間隔 DEV會崩潰 VC++6.0可以正常運行 #include using namespace std; void InsertSort( int k[], int n ) { int i, j,temp; int gap = n; do { gap = (gap/3)... ...
  • 開始時的首頁 點擊modules 點擊modules界面的Paths 點擊Libraries 選擇lib文件 點擊Facets 選擇項目 這就是我404的主要原因,因為小白第一次使用idea 所以很瘋狂的一直百度,到後面的google搜索,終於在經過1天半的時間找到問題了 web.xml這裡要修改, ...
  • 1.C 和 Java 都是多線程語言。( ) 2.如果線程死亡,它便不能運行。( ) 3.在 Java 中,高優先順序的可運行線程會搶占低優先順序線程。( ) 4.程式開發者必須創建一個線程去管理記憶體的分配。( ) 5.一個線程在調用它的 start 方法,之前,該線程將一直處於出生期。( ) 6.當調 ...
  • 一、自定義攔截器 1.架構 2.攔截器創建 3.攔截器api 4.攔截器配置 二、struts2標簽 1.標簽體系 2.struts2標簽結構 3.控制標簽 準備Action然後再到jsp練習struts2標簽 開始練習控制標簽: 4.數據標簽 5.表單標簽 6.非表單標簽 在action中添加錯誤 ...
  • java 後臺返回一個ModelAndView 對象,然後加入這2行設置 業可以把這二行設置放入JSP中 在jsp代碼如下: ...
  • 呃,一定要理解之後自己敲!!!這幾道題,使我進一步瞭解了介面和抽象類。 1.設計一個商品類 欄位: 商品名稱,重量,價格,配件數量,配件製造廠商(是數組,因為可能有多個製造廠商) 要求: 有構造函數 重寫 toString 方法 重寫 equals方法,進行兩件商品的比較 2.設計一個抽象類,並演示 ...
  • 嗨咯,大家晚上好,我的博客首篇開始了 ,我們一起加油吧! 都說java 語言是非常健壯性 如:垃圾回收機制、記憶體模型、異常處理,強類型轉換、跨平臺,等等,使得Java語言的受到青睞。今天我們先來聊聊java的異常處理機制try catch finally throw throws,平時我們貌似小瞧了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...