您好,登錄后才能下訂單哦!
小編給大家分享一下怎么構造cookies應對python反爬蟲,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
網站需要cookies才能正常返回,但是該網站的cookies過期很快,我總不能用瀏覽器開發者工具獲取cookies,然后讓程序跑一會兒,每隔幾分鐘再手動獲取cookies,再讓程序繼續跑吧。如果反復這樣工作,那么寫爬蟲也就沒意義了。便開始對cookies進行分析。
從瀏覽器的開發者工具獲取到的cookies大約有10個字段,經過反復測試,能讓網站正常返回的只需要兩個字段,分別為__jsluid_h=011a522dbxxxxxxxxc1ce59d336e5e60和__jsl_clearance=1581880640.794|0|trTB4c6b%2BZpvxxxxxxxx8YqCOOo%3D (中間打碼處理)。
經過測試,如果請求的時候不自己構造cookies,默認會返回__jsluid_h :
先嘗試了將那段js腳本保存下來,包裝成一個html文件打開,發現瀏覽器不停的刷新,也并沒起什么作用。那就分析一下js腳本,原來的代碼是單行的,自己整理一下并加了一些變量名和log,大概是這么個樣子:
將第16行的變量cmd打印出來看看,發現是另一段類似的腳本:
可以看到第二段腳本已經開始設置cookies的__jsl_clearence 字段了。這些顯然就是混淆后的js腳本,但是分析到這里也就大概弄明白了從發送請求到網站返回是怎么回事。之所以在本地跑這段代碼會不斷刷新,是因為第二行的setTimeout會讓其在1.5秒后重新請求,但是我們本地沒有服務處理請求讓其停止,所以會不斷的刷新。
而第一段腳本當中,變量y是完整的js代碼 ,代碼中的變量名和關鍵字被進行編碼了,變量x存儲的是用來替換的變量名和關鍵字,后面是解碼函數。所以現在的問題變成了獲取第一段腳本當中的cmd代碼,執行后再獲取第二段代碼的document.cookie的內容即可。
可是對于python和js的交互我完全沒接觸過,嘗試了PyExecJS和Js2Py,都沒辦法正常執行第一段腳本。無奈之下,我用python復現了第一段腳本,然后用Js2Py獲取了cookie。在請求一次過后,構造cookies,再請求一次,就可以了:
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()為復現的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)
以上是“怎么構造cookies應對python反爬蟲”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。