Python網(wǎng)絡(luò)爬蟲,爬取某非法網(wǎng)貸系統(tǒng)
今天從群里看到一個(gè)朋友的任務(wù)
本著學(xué)習(xí)的心開始研究
上任務(wù)

給的文件 
打開這個(gè)web.exe文件 
只有這樣才能打開目標(biāo)網(wǎng)頁,這個(gè)好像一個(gè)爬蟲作業(yè),不是直接聯(lián)網(wǎng)的那種網(wǎng)站 最后爬取的url是:http://127.0.0.1/8888 
我也不懂是什么原理,繼續(xù) 打開網(wǎng)頁直接就是登錄,打開F12登錄一次試試,看看密碼有沒有加密 
密碼隨便寫的,只為了抓個(gè)包 

明文的密碼,他還給了個(gè)密碼本需要自己嘗試密碼是什么 
用上面抓到的包發(fā)送請(qǐng)求,找到真的賬號(hào)密碼
import?requests
url?=?'http://127.0.0.1:8888/login'
#抓包得到的url
headers={
????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.9?Safari/537.36'
}
#自己ua,最簡(jiǎn)單的設(shè)置?
with?open('賬號(hào)密碼弱口令字典.txt','r',encoding='utf-8')as?f:
#讀取密碼本
????for?line?in?f:
????????a?=?line.strip('\n').split('?')
#去除每行最后的換行符,賬號(hào)密碼中間和有一個(gè)空格,用空格切割得到一個(gè)列表
#列表里兩個(gè)元素,就是賬號(hào)和密碼
????????username?=?a[0]
????????password?=?a[1]
????????params?=?{"username":?username,?"password":?password}
#設(shè)置參數(shù)
????????r?=?requests.post(url=url,?headers=headers,?json=params).json()
#發(fā)送請(qǐng)求
????????print(username,password,r)
#打印賬號(hào)密碼和返回內(nèi)容

得到的結(jié)果顯示indigo是賬號(hào),playhouse是密碼,登錄進(jìn)去 

里面兩個(gè)列表就是要爬取的內(nèi)容,發(fā)現(xiàn)url后面帶了個(gè)后綴 

跟抓到的包正好對(duì)上了,開始寫代碼
import?requests
#導(dǎo)入包?
url?=?'http://127.0.0.1:8888/login'
#登錄的url,為了保存cookies
headers={
????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.9?Safari/537.36'
}
#ua設(shè)置?
params={"username":"indigo","password":"playhouse"}
#賬號(hào)密碼參數(shù)?
session?=?requests.session()
#requests里的一個(gè)函數(shù)吧?不知道叫什么
#可以保存cookies,方便后面訪問
r?=?session.post(url=url,headers=headers,json=params).json()
#獲取cookies
agent_url?=?'http://127.0.0.1:8888/admin/agent-list'
#放貸人員的url?
res?=?session.get(url=agent_url,headers=headers)
datas?=?res.json()['data']
print(datas)
返回的結(jié)果如下圖 
前不久剛看了一個(gè)js逆向的文章,亂七八糟帶=,是base64加密 但是等號(hào)是在結(jié)尾,這個(gè)等號(hào)在開頭 大膽猜測(cè)這個(gè)是base64加密并且把順序顛倒了一下
data?=datas[::-1]
#?重新排序,輸出結(jié)果就是a?=?'1234'
#?b?=?a[::-1]
#?print(b)
#?輸出'4321'
得到了等號(hào)在屁股的亂七八糟的東西,繼續(xù)用base64解密
import?base64
a=base64.b64decode(data.encode('utf-8'))
好像真的蒙對(duì)了,返回了有點(diǎn)接近的內(nèi)容 
看第一行我選中的地方有個(gè)name,后面不遠(yuǎn)有個(gè)phone,大概在中間位置 而且好像還有電話號(hào)碼似的數(shù)字 感覺要?jiǎng)倮?,可是發(fā)現(xiàn)其他那些%22啊什么的不認(rèn)識(shí),問了問群里大佬 說是url編碼,找了半天解碼方式,倒是也簡(jiǎn)單
from?urllib.parse?import?unquote
b?=?unquote(a.decode())
這一步結(jié)束后打印了一下結(jié)果,讓人開心 
這樣后面就是轉(zhuǎn)一下json,然后再從里面取值了,最后寫入csv 后面的步驟過于基礎(chǔ),這里不細(xì)說了 這樣就獲得了貸款人員的內(nèi)容 放款記錄跟著個(gè)是一樣的 個(gè)人感覺大部分一個(gè)網(wǎng)站的同一種內(nèi)容不會(huì)寫兩種方法 下面是完整代碼
import?requests
import?base64
from?urllib.parse?import?unquote
import?csv
import?json
?
url?=?'http://127.0.0.1:8888/login'
headers={
????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.9?Safari/537.36'
}?
params={"username":"indigo","password":"playhouse"}?
session?=?requests.session()
r?=?session.post(url=url,headers=headers,json=params).json()
#獲取cookies
agent_url?=?'http://127.0.0.1:8888/admin/agent-list'
#放貸人員的url
loans_url?=?'http://127.0.0.1:8888/admin/loans-list'
#放貸記錄的url
res?=?session.get(url=agent_url,headers=headers)
datas?=?res.json()['data']
#請(qǐng)求回的內(nèi)容是一串倒敘的base64加密?
data?=datas[::-1]
#?重新排序?
a=base64.b64decode(data.encode('utf-8'))?
#解密
b?=?unquote(a.decode())?
#解密后得到的內(nèi)容是16進(jìn)制的再次轉(zhuǎn)換
c?=?json.loads(b)
#?轉(zhuǎn)成json格式
head?=?('name','no','phone')
#?設(shè)置csv文件頭
with?open('放貸人員.csv','a',encoding='utf-8',newline='')as?f:
????writer?=?csv.DictWriter(f,fieldnames=head)
????writer.writeheader()
????for?i?in?c:
????????writer.writerow(i)?
res?=?session.get(url=loans_url,headers=headers)
datas?=?res.json()['data']?
data?=datas[::-1]?
a=base64.b64decode(data.encode('utf-8'))
b?=?unquote(a.decode())
c?=?json.loads(b)?
head?=?('money','no')
with?open('放貸記錄.csv','a',encoding='utf-8',newline='')as?f:
????writer?=?csv.DictWriter(f,fieldnames=head)
????writer.writeheader()
????for?i?in?c:
????????writer.writerow(i)
?
最后,推薦螞蟻老師的Python零基礎(chǔ)到爬蟲到數(shù)據(jù)分析實(shí)戰(zhàn)課
評(píng)論
圖片
表情
