最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python音樂爬蟲完美繞過反爬

 更新時間:2021年08月27日 17:30:55   作者:落伍的碼農(nóng)  
這篇文章主要介紹了Python音樂爬蟲完美繞過反爬的過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

大家好,我叫善念。

這是我的第二篇博客,也是第一篇技術(shù)博客,希望大家多多支持,讓我更加有動力去更新一些python爬蟲類的案例教程。

開始

確立目標網(wǎng)址:點擊進入

進入到跳轉(zhuǎn)頁面:

可以看到出現(xiàn)了咱們需要的一些音樂

分析(x0)

這些音樂的源文件地址是否在咱們的網(wǎng)頁元素中,然后再查看網(wǎng)頁源代碼中是否有咱們需要的內(nèi)容。(注:網(wǎng)頁元素與網(wǎng)頁源代碼不一定是一樣的,網(wǎng)頁元素是經(jīng)過瀏覽器渲染后的源代碼,而源代碼純粹就是服務(wù)器給咱們傳送過來的原始數(shù)據(jù))

網(wǎng)頁元素中只有封面圖片的資源,沒用音頻源文件地址:

網(wǎng)頁源代碼中同樣沒有咱們需要的內(nèi)容:

分析(x1)

其實沒有才正常(這種大型網(wǎng)站的數(shù)據(jù)不會讓你這么輕易抓取)....不過是帶大家走一遍流程,對別的網(wǎng)站也要這樣分析

那么咱們開始播放音樂抓包,看是否能抓到數(shù)據(jù):

果然是經(jīng)過觸發(fā)播放按鈕后,服務(wù)器傳給咱們客戶端的。(ajax)

而咱們抓到的這個源文件地址

除了這兩段外,其它的應(yīng)該都是固定死的。

分析(x2)

那么我假設(shè)這兩段是從我開始訪問這首歌曲頁面的時候生成的,比如后面那串數(shù)字為這首音樂在服務(wù)器數(shù)據(jù)庫中的對應(yīng)的一個ID值呢?

假設(shè)是合理的,不過由于咱們前面已經(jīng)查看過源代碼和網(wǎng)頁元素中找不到這些值,我就不在這里浪費時間了。

分析(x3)

這里我和大家講一下,咱們向服務(wù)器發(fā)送一個網(wǎng)址請求,服務(wù)器給咱們返回的可不止一個數(shù)據(jù)包,一般都是N個數(shù)據(jù)包。當我們看到源代碼中沒有時候,也許它正悄悄地通過Ajax傳給我們了?

Ajax在網(wǎng)上有很多的解釋,但是大家未必能理解。從服務(wù)器獲得源代碼數(shù)據(jù),然后通過瀏覽器渲染執(zhí)行JavaScript獲得一些數(shù)據(jù)(音樂)。

這樣說大家應(yīng)該就懂了,那么咱們開始抓當前頁面的包:

Ajax異步請求的數(shù)據(jù),都會在XHR中。所以直接篩選就好了。這個包我已經(jīng)抓到了,get請求然后看下返回的值。

果然就是這個包數(shù)據(jù)都是對應(yīng)的,然后打開看看里面是否有音樂源文件地址:

并沒有,但是有一個rid出現(xiàn)了兩次。

分析(x4)

那么它是否是咱們音樂的ID(索引)值?

接著看下面的包:

這個get請求很關(guān)鍵,它的參數(shù)中利用到了咱們的rid這個值

而他返回值里正好有咱們的音樂源文件地址:

通過分析獲取到音樂

通過咱們的分析,已經(jīng)可以理清思路了。

首先抓取這個包獲取到rid

然后傳遞rid進行這個包的請求獲取到音樂文件地址

JavaScript繞過之參數(shù)冗余

可以看到這個rid獲取的地址中有key值是url編碼很輕松就可以解碼:

import requests
keywords = '%E5%BE%80%E4%BA%8B%E9%9A%8F%E9%A3%8E'
print(requests.utils.unquote(keywords))
# 往事隨風

而pn=1意思就是第一頁嘛,30就是這一頁總共30條音樂數(shù)據(jù)咯,1代表狀態(tài)碼請求成功,而最后reqId這個值如何獲取呢?

有能力的自己去逆向JavaScript,而咱們這里直接把這里的參數(shù)都刪除掉,同樣可以訪問到咱們的rid,為什么呢?

當你訪問百度的時候

可以看到多余了很多你看不懂的參數(shù),而這些參數(shù)實際上可以直接刪除掉!

結(jié)果是一樣的,這個就叫參數(shù)冗余。

CSRF攻擊與防御

當咱們直接訪問這個鏈接確出現(xiàn)這樣的畫面?

而咱們?nèi)绻颜埱箢^全部放到咱們的pycharm中利用Python模擬發(fā)送請求卻可以成功(自行測試)

可以看到請求中有一個參數(shù)叫csrf,這個叫做防跨站點攻擊。

這個就好理解了,當我們用瀏覽器直接訪問的話,盡管可以帶cookies,但是咱們是沒法攜帶這個參數(shù)的。而當我們把請求頭完整的復(fù)制在pycharm中Python運行的話,就可以攜帶這個參數(shù),那么就可以訪問。

目的就是保護此api防止任意情況下都可以隨便訪問。

而這個csrf參數(shù)不就是咱們cookies中的值么?那么是不是咱們首先需要獲取cookies?因為cookies會過期阿,為了讓你的程序永久有效,那么最好的辦法就是自動獲取cookies

總結(jié)

那么所有的原理都可以搞清楚了

首先訪問首頁獲取cookies,然后繞過JavaScript刪除多余的參數(shù)獲取到rid,最后通過rid進行訪問獲取到音樂源地址(這里的參數(shù)也可以刪除),最后保存數(shù)據(jù)!

全程干貨,分析網(wǎng)站反扒手段,Python采集整站任意音樂!

代碼

"""
author: 善念
date: 2021-04-12
"""
import requests
import jsonpath
from urllib.request import urlretrieve
import urllib.parse
 
 
def get_csrf():
    # 保持cookies 維持客戶端與服務(wù)器之間的會話
 
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        # 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1618229629; _ga=GA1.2.1951895595.1618229638; _gid=GA1.2.369506281.1618229638; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1618230532; kw_token=ZOMA0RIOLV',
        'Host': 'www.kuwo.cn',
        'Pragma': 'no-cache',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
    }
    s.get('http://www.kuwo.cn/', headers=headers)
 
    url = f'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={keyword}&pn=1&rn=30&httpsStatus=1&reqId=a3b6cb30-9b8a-11eb-bc04-b33703ed2ebb'
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        # 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1618229629; _ga=GA1.2.1951895595.1618229638; _gid=GA1.2.369506281.1618229638; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1618229710; kw_token=UTBATXE1HY',
        'csrf': s.cookies.get_dict()['kw_token'],
        'Host': 'www.kuwo.cn',
        'Pragma': 'no-cache',
        'Referer': f'http://www.kuwo.cn/search/list?key={keyword}',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
 
 
    }
    r = s.get(url, headers=headers)
    print(r.text)
    rid = jsonpath.jsonpath(r.json(), '$..rid')[0]
    print(rid)
    return rid
 
 
def get_music_url(rid):
    url = f'http://www.kuwo.cn/url?format=mp3&rid={rid}&response=url&type=convert_url3&br=128kmp3&from=web&httpsStatus=1'
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        # 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1618231398; _ga=GA1.2.52993118.1618231399; _gid=GA1.2.889494894.1618231399; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1618231413; _gat=1; kw_token=VBM6N1XEG4P',
        'Host': 'www.kuwo.cn',
        'Pragma': 'no-cache',
        'Referer': f'http://www.kuwo.cn/search/list?key={keyword}',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
    }
    music_url = s.get(url, headers=headers).json().get('url')
    print(music_url)
    return music_url
 
 
def get_music(music_url):
    urlretrieve(music_url, f'{urllib.parse.unquote(keyword)}'+'.mp3')
 
 
def go():
    rid = get_csrf()
    music_url = get_music_url(rid)
    get_music(music_url)
 
 
if __name__ == '__main__':
    s = requests.session()
    keyword = input('請輸入您要下載的音樂名字:')
    keyword = urllib.parse.quote(keyword)
    go()
 
 

到此這篇關(guān)于Python音樂爬蟲完美繞過反爬的文章就介紹到這了,更多相關(guān)Python爬取音樂內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用python實現(xiàn)前向分詞最大匹配算法的示例代碼

    用python實現(xiàn)前向分詞最大匹配算法的示例代碼

    這篇文章主要介紹了用python實現(xiàn)前向分詞最大匹配算法的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • python-docx文件路徑問題的解決方案

    python-docx文件路徑問題的解決方案

    這篇文章主要介紹了python-docx文件路徑問題的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • pandas使用get_dummies進行one-hot編碼的方法

    pandas使用get_dummies進行one-hot編碼的方法

    今天小編就為大家分享一篇pandas使用get_dummies進行one-hot編碼的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python讀取oracle函數(shù)返回值

    python讀取oracle函數(shù)返回值

    這篇文章主要介紹了python讀取oracle函數(shù)返回值的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • python的去重以及數(shù)據(jù)合并的用法說明

    python的去重以及數(shù)據(jù)合并的用法說明

    這篇文章主要介紹了python的去重以及數(shù)據(jù)合并的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python中l(wèi)en()函數(shù)用法使用示例

    Python中l(wèi)en()函數(shù)用法使用示例

    這篇文章主要介紹了Python中的len()函數(shù),包括其基礎(chǔ)用法、適用范圍、常見使用場景以及在第三方庫(如NumPy和pandas)中的應(yīng)用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • python程序在k8s集群中日志不顯示

    python程序在k8s集群中日志不顯示

    在使用Docker和Kubernetes部署Python應(yīng)用程序時,可能會遇到日志輸出不一致的問題,下面就來介紹一下做這個問題的解決,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Python開發(fā)WebService系列教程之REST,web.py,eurasia,Django

    Python開發(fā)WebService系列教程之REST,web.py,eurasia,Django

    對于今天的WebService開發(fā),我們至少有兩種選擇:SOAP/WSDL/UDDI系列的; REST風格架構(gòu)系列的 ?。?!
    2014-06-06
  • 淺談四種快速易用的Python數(shù)據(jù)可視化方法

    淺談四種快速易用的Python數(shù)據(jù)可視化方法

    這篇文章主要介紹了淺談四種快速易用的Python數(shù)據(jù)可視化方法,數(shù)據(jù)可視化,是指用圖形的方式來展現(xiàn)數(shù)據(jù),從而更加清晰有效地傳遞信息,主要方法包括圖表類型的選擇和圖表設(shè)計的準則,需要的朋友可以參考下
    2023-04-04
  • Python 將 QQ 好友頭像生成祝福語的實現(xiàn)代碼

    Python 將 QQ 好友頭像生成祝福語的實現(xiàn)代碼

    這篇文章主要介紹了用 Python 將 QQ 好友頭像生成祝福語的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論

印江| 衡南县| 衡东县| 柞水县| 丹凤县| 晋宁县| 东源县| 夹江县| 阳山县| 吉安市| 鄂尔多斯市| 奇台县| 五原县| 潞西市| 雷州市| 松原市| 申扎县| 武汉市| 耒阳市| 桐柏县| 禹州市| 岳阳县| 翁牛特旗| 永德县| 商水县| 上高县| 久治县| 宁夏| 芦山县| 鄂托克前旗| 奉节县| 乌兰浩特市| 永川市| 渭源县| 苍梧县| 沈阳市| 三明市| 潜江市| 兰州市| 乐东| 宣恩县|