上次我們講到了破解乙個簡單的動態頁面,post的元素是可以直接在原始碼裡邊找到的,然而大多數的時候,想伺服器post的資料是需要經過複雜的加密邏輯生成的。這次我們就來分析乙個經過加密的演算法生成資料的頁面。
這次選取的目標是****書旗,不過被阿里收購後,已經叫阿里文學了。
我們到書庫裡邊用文字的形式檢視一下書籍列表,這就是我們今天的分析物件了,如何獲取這個列表的資訊。
然後這個js**可讀性就大大提高了,我們分析一下,頁面中sign出現了三次,分別對應了三個ajax請求,分別對應三個介面,加密演算法都差不多,都是pageid+時間戳+key的md5演算法,不過其中兩個key是public.pagekey,另乙個key是public.bookkey。
-----------------------------------
sign圖一
sign圖二
sign圖三
這個時候我們要找到我們所需要的前邊要記住的那個url對應的介面,「?r=pcapi/pcbook/librarysearch」,在js的最開頭發現了這個ajax請求,但是沒找到加密演算法?不對啊,明明是三個ajax,三個sign應該一一對應呀,怎麼會沒有呢?我們再仔細一分析,原來你這麼狡猾,把演算法與ajax分開寫了,差了好遠。其實就是這個function t(){}
然後我們看看上邊第二個sign的圖,會發現剛剛下邊倒數第二行有function t的呼叫,引數是o,o剛好是那個sign的出來的一大堆資料。那麼我們就可以確定了,書籍列表頁面ajax請求的加密演算法是
至此,一切邏輯清楚了。整個任務過程是這樣:
既然邏輯清楚了,那麼**也手到擒來:
# -*- coding: utf-8 -*-
import requests
from hashlib import md5
import time
import json
# sign: md5(t + public.timestamp + public.pagekey)
pagekey = "aaf50af46621010e7fbeda2b1fe8ef8e"
bookkey = "f2850e634f85f485d719314ae3cfe252"
# sign: md5(page + pagesize + public.timestamp + public.bookkey)
def get_sign(page,pagesize,timestamp,key=bookkey):
m=md5()
m.update((str(page)+str(pagesize)+str(timestamp)+key).encode("utf-8"))
return m.hexdigest()
def get_json(page,pagesize):
timestamp=int(time.time())
url=""
sign = get_sign(page,pagesize,timestamp)
param=
response=requests.post(url=url,data=param)
jsonobj = json.loads(response.text)
return jsonobj
print(get_json(1,18))
輸出結果:
由於重在分析思路,所以博主只實現了前3步,後邊都是常規程式設計,大家自由發揮就好~
這是系列文章第二篇,分析了乙個js處理的md5加密演算法,爬取了乙個由ajax產生的動態頁面。都已經看到這裡了,不給博主乙個贊嘛~
原始碼已上傳github,喜歡的朋友求個star,歡迎前來吐槽。
爬蟲反爬與反爬破解總結
這裡將自己收集的,遇到的反爬機制進行簡單的記錄和簡單的分析,如果有大佬路過,看到理解不正確的地方,希望可以指出來,學習進步,在此感激不盡。最基礎的記錄一下標題 抓包copy乙份,header字典賦值,requests傳入,簡單破解。防之前爬乙個免費ip 的 的時候,很好玩,感覺是把乙個瀏覽器的所有h...
python反爬技術之User Agent池
基於headers的反爬蟲,從請求頭進行反爬是比較常見的措施,大部分 會對headers中的user agent和referer欄位進行檢測。突破方法就是根據瀏覽器的正常訪問請求頭對爬蟲的請求頭進行修改,盡可能的和瀏覽器保持一致 下面是編寫類來儲存user agent池的功能,下次可以直接呼叫 cl...
Python反爬手段之User Agent池
user agent即使用者 簡稱ua,它是乙個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本 cpu型別 瀏覽器及版本 瀏覽器渲染引擎 瀏覽器語言 瀏覽器外掛程式等。一些 常常通過判斷ua來給不同的作業系統 不同的瀏覽器傳送不同的頁面,因此可能造成某些頁面無法在某個瀏覽器中正常顯示,但通過...