目標網站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5vdGljZVR5cGU9MQ==
今天在爬取網站的時候發現個很有意思的網站,在列表頁不需要cookie,但是存取詳情頁反而需要cookie
所以我們存取下這個詳情頁連結
aHR0cHM6Ly93d3cueW91emhpY2FpLmNvbS9uZC9lNzVlNTY1Yi03MWZmLTQ3MzktYTY3Zi0yMGM3YzQzZDI4NmQtMS5odG1s
我們通過FD抓包
可以發現 返回我們兩個請求
第一個請求:狀態碼203 內容如右圖所示 是一堆JS 並且第一次返回 返回一個set-cookie
第二個請求:狀態碼為200,內容為我們想要的詳情頁。
然後我們先格式化好第一個請求的JS程式碼 得到如下檢視
從檔案中我們可以看到 mode padding ECB這種字眼,其實已經可以猜到是DES加密了
至於為啥 可以看我之前的一篇文章:https://www.cnblogs.com/zichliang/p/16857694.html
然後我們把檔案丟到瀏覽器中執行
直接這麼執行就可以了
然後會報兩個錯 如下圖所示
我們把錯誤改好(改錯很簡單,錯誤程式碼刪掉就行)
然後我們執行JS
然後我們到最底下把最下面的執行語句封裝成一個函數
然後去執行會報一個 window is not defined
還是那句好 錯了就刪 再把 window is not defined 刪掉,
然後這裡又會報一個CryptoJS is not defined
這裡提供兩個解決方案:
這個就沒什麼好講的,直接執行命令:
npm install crypto-js
然後 require這個庫 使用就行了
首先找到parse
然後我們重新給這個值賦值即可
注意 這個都在一個自執行函數裡面 所以我們賦值也得包在這個函數裡才行。
然後再執行我們的程式碼
這裡又會報一個
這個我們不確定 所以我們拉到瀏覽器裡執行一下看看
可以發現 這個只是個賦值語句不要也罷。重要的是CK
我們已經偵錯完了 然後只要封裝好函數執行就行了
封裝成這個鳥樣就行了。
然後我們發現有兩個值是動態變化的,分別是a和b
我們需要正則把這個值提出來 然後賦給執行函數
最後是這樣的
# -*- coding: utf-8 -*-
# @Time : 2022/11/28 11:13
# @Author : lzc
# @Email : [email protected]
# @File : THYZCBuss.py
# @Software: PyCharm
# @blog : https://www.cnblogs.com/zichliang
import re
import execjs
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
}
# 自己解密
url = "aHR0cHM6Ly93d3cueW91emhpY2FpLmNvbS9uZC9lNzVlNTY1Yi03MWZmLTQ3MzktYTY3Zi0yMGM3YzQzZDI4NmQtMS5odG1s"
response = requests.get(url, headers=headers)
cookies = response.cookies.get_dict()
args_list = re.findall("var a= '(.*?)';var b = '(.*?)';", response.text)[0]
args_a = args_list[0]
args_b = args_list[1]
node = execjs.get()
with open('c.js', encoding='utf-8') as f:
js_code = f.read()
ctx = node.compile(js_code)
data1 = ctx.eval(f'get_ck("{args_a}","{args_b}")')
new_cookies = {
**cookies,
"spvrscode": data1
}
response = requests.get(url, headers=headers, cookies=new_cookies)
print(response.text)
js的話自己扣吧 非常簡單 這裡就不貼了,太長了。