您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python音樂(lè)爬蟲中如何繞過(guò)反爬,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
確立目標(biāo)網(wǎng)址
進(jìn)入到跳轉(zhuǎn)頁(yè)面:
可以看到出現(xiàn)了咱們需要的一些音樂(lè)
這些音樂(lè)的源文件地址是否在咱們的網(wǎng)頁(yè)元素中,然后再查看網(wǎng)頁(yè)源代碼中是否有咱們需要的內(nèi)容。(注:網(wǎng)頁(yè)元素與網(wǎng)頁(yè)源代碼不一定是一樣的,網(wǎng)頁(yè)元素是經(jīng)過(guò)瀏覽器渲染后的源代碼,而源代碼純粹就是服務(wù)器給咱們傳送過(guò)來(lái)的原始數(shù)據(jù))
網(wǎng)頁(yè)元素中只有封面圖片的資源,沒(méi)用音頻源文件地址:
網(wǎng)頁(yè)源代碼中同樣沒(méi)有咱們需要的內(nèi)容:
其實(shí)沒(méi)有才正常(這種大型網(wǎng)站的數(shù)據(jù)不會(huì)讓你這么輕易抓?。?...不過(guò)是帶大家走一遍流程,對(duì)別的網(wǎng)站也要這樣分析
那么咱們開(kāi)始播放音樂(lè)抓包,看是否能抓到數(shù)據(jù):
果然是經(jīng)過(guò)觸發(fā)播放按鈕后,服務(wù)器傳給咱們客戶端的。(ajax)
而咱們抓到的這個(gè)源文件地址
除了這兩段外,其它的應(yīng)該都是固定死的。
那么我假設(shè)這兩段是從我開(kāi)始訪問(wèn)這首歌曲頁(yè)面的時(shí)候生成的,比如后面那串?dāng)?shù)字為這首音樂(lè)在服務(wù)器數(shù)據(jù)庫(kù)中的對(duì)應(yīng)的一個(gè)ID值呢?
假設(shè)是合理的,不過(guò)由于咱們前面已經(jīng)查看過(guò)源代碼和網(wǎng)頁(yè)元素中找不到這些值,我就不在這里浪費(fèi)時(shí)間了。
這里我和大家講一下,咱們向服務(wù)器發(fā)送一個(gè)網(wǎng)址請(qǐng)求,服務(wù)器給咱們返回的可不止一個(gè)數(shù)據(jù)包,一般都是N個(gè)數(shù)據(jù)包。當(dāng)我們看到源代碼中沒(méi)有時(shí)候,也許它正悄悄地通過(guò)Ajax傳給我們了?
Ajax在網(wǎng)上有很多的解釋,但是大家未必能理解。從服務(wù)器獲得源代碼數(shù)據(jù),然后通過(guò)瀏覽器渲染執(zhí)行JavaScript獲得一些數(shù)據(jù)(音樂(lè))。
這樣說(shuō)大家應(yīng)該就懂了,那么咱們開(kāi)始抓當(dāng)前頁(yè)面的包:
Ajax異步請(qǐng)求的數(shù)據(jù),都會(huì)在XHR中。所以直接篩選就好了。這個(gè)包我已經(jīng)抓到了,get請(qǐng)求然后看下返回的值。
果然就是這個(gè)包數(shù)據(jù)都是對(duì)應(yīng)的,然后打開(kāi)看看里面是否有音樂(lè)源文件地址:
并沒(méi)有,但是有一個(gè)rid
出現(xiàn)了兩次。
那么它是否是咱們音樂(lè)的ID(索引)值?
接著看下面的包:
這個(gè)get請(qǐng)求很關(guān)鍵,它的參數(shù)中利用到了咱們的rid
這個(gè)值
而他返回值里正好有咱們的音樂(lè)源文件地址:
通過(guò)咱們的分析,已經(jīng)可以理清思路了。
首先抓取這個(gè)包獲取到rid
然后傳遞rid
進(jìn)行這個(gè)包的請(qǐng)求獲取到音樂(lè)文件地址
可以看到這個(gè)rid
獲取的地址中有key值是url編碼很輕松就可以解碼:
import requests keywords = '%E5%BE%80%E4%BA%8B%E9%9A%8F%E9%A3%8E' print(requests.utils.unquote(keywords)) # 往事隨風(fēng)
而pn=1意思就是第一頁(yè)嘛,30就是這一頁(yè)總共30條音樂(lè)數(shù)據(jù)咯,1代表狀態(tài)碼請(qǐng)求成功,而最后reqId
這個(gè)值如何獲取呢?
有能力的自己去逆向JavaScript,而咱們這里直接把這里的參數(shù)都刪除掉,同樣可以訪問(wèn)到咱們的rid
,為什么呢?
當(dāng)你訪問(wèn)百度的時(shí)候
可以看到多余了很多你看不懂的參數(shù),而這些參數(shù)實(shí)際上可以直接刪除掉!
結(jié)果是一樣的,這個(gè)就叫參數(shù)冗余。
當(dāng)咱們直接訪問(wèn)這個(gè)鏈接確出現(xiàn)這樣的畫面?
而咱們?nèi)绻颜?qǐng)求頭全部放到咱們的pycharm中利用Python模擬發(fā)送請(qǐng)求卻可以成功(自行測(cè)試)
可以看到請(qǐng)求中有一個(gè)參數(shù)叫csrf
,這個(gè)叫做防跨站點(diǎn)攻擊。
這個(gè)就好理解了,當(dāng)我們用瀏覽器直接訪問(wèn)的話,盡管可以帶cookies,但是咱們是沒(méi)法攜帶這個(gè)參數(shù)的。而當(dāng)我們把請(qǐng)求頭完整的復(fù)制在pycharm中Python運(yùn)行的話,就可以攜帶這個(gè)參數(shù),那么就可以訪問(wèn)。
目的就是保護(hù)此api防止任意情況下都可以隨便訪問(wèn)。
而這個(gè)csrf參數(shù)不就是咱們cookies中的值么?那么是不是咱們首先需要獲取cookies?因?yàn)閏ookies會(huì)過(guò)期阿,為了讓你的程序永久有效,那么最好的辦法就是自動(dòng)獲取cookies
那么所有的原理都可以搞清楚了
首先訪問(wèn)首頁(yè)獲取cookies,然后繞過(guò)JavaScript刪除多余的參數(shù)獲取到rid,最后通過(guò)rid進(jìn)行訪問(wèn)獲取到音樂(lè)源地址(這里的參數(shù)也可以刪除),最后保存數(shù)據(jù)!
全程干貨,分析網(wǎng)站反扒手段,Python采集整站任意音樂(lè)!
""" author: 善念 date: 2021-04-12 """ import requests import jsonpath from urllib.request import urlretrieve import urllib.parse def get_csrf(): # 保持cookies 維持客戶端與服務(wù)器之間的會(huì)話 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('請(qǐng)輸入您要下載的音樂(lè)名字:') keyword = urllib.parse.quote(keyword) go()
關(guān)于“Python音樂(lè)爬蟲中如何繞過(guò)反爬”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。