cookies應(yīng)對(duì)python反爬蟲(chóng)知識(shí)點(diǎn)詳解
在保持合理的數(shù)據(jù)采集上,使用python爬蟲(chóng)也并不是一件壞事情,因?yàn)樵谛畔⒌慕涣魃霞涌炝肆魍ǖ念l率。今天小編為大家?guī)?lái)了一個(gè)稍微復(fù)雜一點(diǎn)的應(yīng)對(duì)反爬蟲(chóng)的方法,那就是我們自己構(gòu)造cookies。在開(kāi)始正式的構(gòu)造之前,我們先進(jìn)行簡(jiǎn)單的分析如果不構(gòu)造cookies爬蟲(chóng)時(shí)會(huì)出現(xiàn)的一些情況,相信這樣更能體會(huì)出cookies的作用。
網(wǎng)站需要cookies才能正常返回,但是該網(wǎng)站的cookies過(guò)期很快,我總不能用瀏覽器開(kāi)發(fā)者工具獲取cookies,然后讓程序跑一會(huì)兒,每隔幾分鐘再手動(dòng)獲取cookies,再讓程序繼續(xù)跑吧。如果反復(fù)這樣工作,那么寫(xiě)爬蟲(chóng)也就沒(méi)意義了。便開(kāi)始對(duì)cookies進(jìn)行分析。
從瀏覽器的開(kāi)發(fā)者工具獲取到的cookies大約有10個(gè)字段,經(jīng)過(guò)反復(fù)測(cè)試,能讓網(wǎng)站正常返回的只需要兩個(gè)字段,分別為_(kāi)_jsluid_h=011a522dbxxxxxxxxc1ce59d336e5e60和__jsl_clearance=1581880640.794|0|trTB4c6b%2BZpvxxxxxxxx8YqCOOo%3D (中間打碼處理)。
經(jīng)過(guò)測(cè)試,如果請(qǐng)求的時(shí)候不自己構(gòu)造cookies,默認(rèn)會(huì)返回__jsluid_h :
先嘗試了將那段js腳本保存下來(lái),包裝成一個(gè)html文件打開(kāi),發(fā)現(xiàn)瀏覽器不停的刷新,也并沒(méi)起什么作用。那就分析一下js腳本,原來(lái)的代碼是單行的,自己整理一下并加了一些變量名和log,大概是這么個(gè)樣子:
將第16行的變量cmd打印出來(lái)看看,發(fā)現(xiàn)是另一段類(lèi)似的腳本:
可以看到第二段腳本已經(jīng)開(kāi)始設(shè)置cookies的__jsl_clearence 字段了。這些顯然就是混淆后的js腳本,但是分析到這里也就大概弄明白了從發(fā)送請(qǐng)求到網(wǎng)站返回是怎么回事。之所以在本地跑這段代碼會(huì)不斷刷新,是因?yàn)榈诙械膕etTimeout會(huì)讓其在1.5秒后重新請(qǐng)求,但是我們本地沒(méi)有服務(wù)處理請(qǐng)求讓其停止,所以會(huì)不斷的刷新。
而第一段腳本當(dāng)中,變量y是完整的js代碼 ,代碼中的變量名和關(guān)鍵字被進(jìn)行編碼了,變量x存儲(chǔ)的是用來(lái)替換的變量名和關(guān)鍵字,后面是解碼函數(shù)。所以現(xiàn)在的問(wèn)題變成了獲取第一段腳本當(dāng)中的cmd代碼,執(zhí)行后再獲取第二段代碼的document.cookie的內(nèi)容即可。
可是對(duì)于python和js的交互我完全沒(méi)接觸過(guò),嘗試了PyExecJS和Js2Py,都沒(méi)辦法正常執(zhí)行第一段腳本。無(wú)奈之下,我用python復(fù)現(xiàn)了第一段腳本,然后用Js2Py獲取了cookie。在請(qǐng)求一次過(guò)后,構(gòu)造cookies,再請(qǐng)求一次,就可以了:
def test(): url = REQUEST_URL # url = ’https://www.baidu.com’ request_header = get_header() html = requests.get(url, headers=request_header) print(html) jscode = html.text # print(jscode) # tryjs.get_cookies()為復(fù)現(xiàn)的js代碼,以及用Js2Py獲取cookies的代碼 request_cookies = try_js.get_cookies(jscode) request_cookies += ’;__jsluid_h=’ + html.cookies[’__jsluid_h’] request_header[’Cookie’] = request_cookies print(request_header) html = requests.get(url, headers=request_header, timeout=5) print(’new connection’) print(html) print(html.text)
在經(jīng)歷重重的分析試驗(yàn)后,我們終于得出以上的代碼成功實(shí)現(xiàn)了構(gòu)造cookies。相信經(jīng)過(guò)本篇的學(xué)習(xí),小伙伴們又多了一種解決爬蟲(chóng)阻攔獲取數(shù)據(jù)的cookies辦法了,趕快行動(dòng)起來(lái)吧。
到此這篇關(guān)于cookies應(yīng)對(duì)python反爬蟲(chóng)知識(shí)點(diǎn)詳解的文章就介紹到這了,更多相關(guān)如何構(gòu)造cookies應(yīng)對(duì)python反爬蟲(chóng)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)2. XML入門(mén)的常見(jiàn)問(wèn)題(三)3. Vue3使用JSX的方法實(shí)例(筆記自用)4. vue實(shí)現(xiàn)將自己網(wǎng)站(h5鏈接)分享到微信中形成小卡片的超詳細(xì)教程5. 詳解CSS偽元素的妙用單標(biāo)簽之美6. 不要在HTML中濫用div7. 利用CSS3新特性創(chuàng)建透明邊框三角8. 多級(jí)聯(lián)動(dòng)下拉選擇框,動(dòng)態(tài)獲取下一級(jí)9. Vue3獲取DOM節(jié)點(diǎn)的3種方式實(shí)例10. 前端html+css實(shí)現(xiàn)動(dòng)態(tài)生日快樂(lè)代碼
