爬蟲遇到521錯誤怎么辦


  本人最近用python開發着爬蟲相關的項目,在上個月就已經把爬蟲的相關代碼寫得差不多了,因為春節,項目停滯了十多天。最近,當我再次運行之前的爬蟲項目的時候,What?怎么不行了??本來好好的,報了521錯誤。我只是一個爬蟲菜鳥,還是第一次接觸到這個錯誤。然后我就去百度了。百度一圈后,發現這是一個js設置cookie的反爬方式。於是乎我將521返回的內容寫到了txt文件里,顯示出來是這樣的結果。

 

 

   太亂了,這樣子啥也看不出來呀。后來突然想到,這就是js代碼呀,寫到html文件里再排版不就行了嗎。這里說一下我用的編輯器是pycharm,打開了html代碼后,使用快捷鍵'crtl+alt+l'一鍵排版,就好看多了。

 

 

   隨后,我百度到,把這一串代碼的js部分復制到Console中,將eval改成console.log運行。

 

 

 結果出現了這個錯誤,沒怎么接觸前端的我就傻逼了,這啥錯啊。

 

 

  又百度了一會才發現,原來在后面的</script>前還有一個‘}’,寫上去之后,可以正常運行了。得到了這個結果。

 

 

   一看,怎么這么眼熟,這就是js里面的代碼呀。然后我就想,打印出了這個結果,那是不是執行過程中,js會將這兩行代碼替換上去再執行的呢。然后我就將兩行eval替換成打印出來這兩行后再去執行。突然頁面就直接跳轉了一下。嗯?怎么就跳轉了呢?后來想到,這是一個獲取cookie的代碼,那js是不是已經成功返回了cookie,所以直接就跳轉了呢?因為在這里看不到最后的返回值是什么,所以我選擇先用python執行一下再看結果。

  到這里,我選擇直接js代碼的第三方庫是pyexecjs,直接pip install PyExecJS就可以了。結果萬萬沒想到,pip這一步竟然出錯了。

  然后我突然想起,之前開的fidder代理開着,關了之后,就可以正常安裝了。

  好回歸正題,准備好環境之后,也通過正則,將兩個eval的地方,換成了console得到的代碼,然后我開始運行這一段js代碼。

  '''python

  ctx = execjs.compile(js)

  result = ctx.call('by', 57)

  print(result)

  '''

  這里解釋一下,execjs.complie(js)返回的是ctx上下文對象,call()方法就是調用里面的某個函數。通過觀察,發現里面的函數名和傳的參數,每次都是不一樣的,所以我通過正則,獲取到函數名和參數,填進call里面。(如果每次返回的函數名和參數都不一樣,可以用變量接收,再傳參)

  運行之后,不出意外,報錯了。

   execjs._exceptions.ProcessExitedWithNonZeroStatus: (1, '', "[stdin]:24\n}, function(program).......

  這個錯誤我也不知道啥錯呀。后來留意到,我的js代碼又少了括號了,加上去后,錯誤就換了。。。

  execjs._exceptions.ProgramError: ReferenceError: window is not defined

  這個錯誤說是window沒有定義,我看了下js代碼中,就一開頭有一個windows呀,我想,那個window應該是調用函數和提供參數的吧,我已經直接call那個函數了,索性我就將前面的window那一句給去掉了。只剩函數部分。運行后,又出錯了。

  execjs._exceptions.ProgramError: ReferenceError: document is not defined

  然后,這怎么又出錯了啊。百度之后,我也沒怎么看懂。然后我就留意到了,在整個js代碼的最后是qo = eval;qo(po);我理解的是eval是返回一個結果,所以我直接將qo(po)換成return(po),再看運行的結果。然后驚喜的發現,結果出來了。哇!心里一個激動啊!

  document.cookie='_ydclearance=046fa7a8f53a1e92e4d5374...

  但是,這還沒有結束,拿到了這一個結果而已,我又要怎么去用呢?然后我開始對比,跳轉到請求頁面的cookie和跳轉前頁面的cookie,我發現,請求頁面的cookie只是多了_ydclearance的值,所以我大膽猜測,直接往請求頭中的cookie加上這一個字段就行了吧。然后一試,成功訪問!

  好了,我的第一篇博客寫完了,這只是希望和大家分享一下我處理這個521錯誤的過程,前輩們的分享。

  最好,在這個關頭,再說一句,武漢加油!中國加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM