爬取某筆公考app公基題庫的操作

最近在準(zhǔn)備上岸构蹬,備考中需做大量的練習(xí),手機(jī)APP讓練習(xí)無處不在悔据,但有個(gè)缺點(diǎn)庄敛,就是每次只能練習(xí)10-20道題目,不能用題海戰(zhàn)術(shù)科汗,海量做題藻烤。能不能把網(wǎng)站的題庫及解析都弄下來,在本地電腦上做題呢头滔?以下是我的思路:1怖亭、分析并爬取手機(jī)軟件的題庫;2坤检、調(diào)整好格式存入xls文件中兴猩;3、導(dǎo)入PC版可自定義的考試系統(tǒng)中(如教之初考試系統(tǒng)免費(fèi)版)早歇;4倾芝、自行設(shè)置考試模式,海量練習(xí)箭跳。

倒騰了兩天晨另,終于搞定,后續(xù)再更新文章衅码!

涉及到幾個(gè)點(diǎn)拯刁。

1、關(guān)于手機(jī)網(wǎng)絡(luò)數(shù)據(jù)的分析逝段,我是用Fiddler 4進(jìn)行的分析。

2割捅、關(guān)于excel表格的操控奶躯,之前想用xlwings模塊,后因沒裝office亿驾,用的是wps2013政府閹割版嘹黔,無法操控,后改用xlrd、xlutils儡蔓、shutil郭蕉、os模塊自己寫了一個(gè)excel操縱類對象,發(fā)現(xiàn)還是有問題喂江,后卸載閹割版wps召锈,換了wps2016最新版的,就可以操作了获询。后來也沒換xlwings模塊了涨岁,將就著用自寫模塊。大坑:xlrd模塊好像不支持中文路徑吉嚣,全部換用英文路徑梢薪,最后再把文件夾及文件名轉(zhuǎn)換成中文的。

3尝哆、題庫分類保存秉撇。

爬取的題庫


教之初考試系統(tǒng)免費(fèi)版

1、Fiddler抓包手機(jī)APP的網(wǎng)絡(luò)請求

Fiddler是一款非常流行并且實(shí)用的http抓包工具秋泄,它的原理是在本機(jī)開啟了一個(gè)http的代理服務(wù)器畜疾,然后它會轉(zhuǎn)發(fā)所有的http請求和響應(yīng),不僅如此印衔,它還可以支持請求重放等一些高級功能啡捶。顯然它是可以支持對手機(jī)應(yīng)用進(jìn)行http抓包的。

設(shè)置在同一局域網(wǎng)下電腦端Fiddler抓取手機(jī)APP應(yīng)用網(wǎng)絡(luò)請求的步驟:

(1)電腦端啟動Fiddler奸焙,打開菜單欄中的 Tools > Fiddler Options瞎暑,打開“Fiddler Options”對話框。

Fiddler界面

(2)在Fiddler Options”對話框切換到“Connections”選項(xiàng)卡与帆,然后勾選“Allow romote computers to connect”后面的復(fù)選框了赌,然后點(diǎn)擊“OK”按鈕。(小技巧:HTTPS標(biāo)簽中可以設(shè)置下拉框?yàn)?..from remote clients only 玄糟,貌似就只接收遠(yuǎn)程端的網(wǎng)絡(luò)請求了)

Fiddler選項(xiàng)Connections界面
Fiddler選項(xiàng)HTTPS界面

(3)在電腦端的命令行輸入:ipconfig勿她,找到本機(jī)的ip地址。(我的局域網(wǎng)IP:192.168.1.10)

cmd命令行

(4)在手機(jī)端阵翎,打開android設(shè)備的“設(shè)置”->“WLAN”逢并,找到你要連接的網(wǎng)絡(luò),在上面長按郭卫,然后選擇“修改網(wǎng)絡(luò)”砍聊,彈出網(wǎng)絡(luò)設(shè)置對話框,然后勾選“顯示高級選項(xiàng)”贰军。(其實(shí)蘋果手機(jī)也是類似的)

(5)在“代理”后面的輸入框選擇“手動”玻蝌,在“代理服務(wù)器主機(jī)名”后面的輸入框輸入電腦的ip地址,在“代理服務(wù)器端口”后面的輸入框輸入8888,然后點(diǎn)擊“保存”按鈕俯树。

手機(jī)端代理設(shè)置

(6)然后啟動android設(shè)備中的APP應(yīng)用帘腹,在fiddler中可以看到完整的請求和響應(yīng)數(shù)據(jù)。

Fiddler響應(yīng)數(shù)據(jù)

2许饿、手機(jī)APP應(yīng)用網(wǎng)絡(luò)數(shù)據(jù)分析

手機(jī)上打開某筆公考軟件后阳欲,從Fiddler左側(cè)欄中可以看到大量的請求鏈接。

Fiddler網(wǎng)絡(luò)請求響應(yīng)

點(diǎn)擊上圖黃色區(qū)域的鏈接米辐,可看到右側(cè)詳細(xì)數(shù)據(jù)胸完。

詳細(xì)數(shù)據(jù)

在右側(cè)詳細(xì)數(shù)據(jù)欄中,我們可以看到請求的網(wǎng)址:POST http://xxxbi.com/android/sydw/exercises?&platform=android22&version=6.4.3&vendor=Tencent&app=gwy&deviceId=F4J/K8kXx6+C24yqFuzAiA==&av=8&kav=3 HTTP/1.1

post請求的參數(shù)keypointId=621638&type=3&limit=15

返回的數(shù)據(jù)為Json格式翘贮,從返回?cái)?shù)據(jù)中我們可以找出questionIds對應(yīng)的題目編號赊窥,如2084744.

點(diǎn)擊上上圖(Fiddler網(wǎng)絡(luò)請求響應(yīng))中紅色框中的鏈接地址,我們可以看到右側(cè)詳細(xì)數(shù)據(jù)欄的數(shù)據(jù)

詳細(xì)數(shù)據(jù)

從上圖中我們可以找到ID號為2084744的題目的題干狸页、選項(xiàng)锨能、題型、答案等有用數(shù)據(jù)芍耘。

分析基本結(jié)束址遇,此手機(jī)APP應(yīng)用的模式基本是這樣:先請求15道題的ids,再根據(jù)meidaoti的ids請求題目相關(guān)數(shù)據(jù)斋竞。后續(xù)測試發(fā)現(xiàn)倔约,請求questionIds時(shí),修改參數(shù)坝初,能一次最多請求到100道題的ids浸剩。

另外,從左側(cè)請求鏈接可以找出對應(yīng)的章節(jié)分類請求鏈接鳄袍,根據(jù)分類號再查找對應(yīng)的questionids绢要,就可以把所有的題目抓取出來。

基本抓取思路

3拗小、xls操控

將就著基于xlrd模塊編寫自用模塊重罪。

自用xls操控模塊

源碼在此,可能格式錯(cuò)亂哀九。需整理剿配。

'''python

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""

Created on 2018-05-14 12:48:07

@author: wangzheng

Sys_Env : Windows_AMD64 Python3.5.2

Wechat : hrcl2015(微信)

Filename: MyXls.py

Description : xls文件操控類MyXls

? ? ? ? ? ? 注意:文件路徑中不能有中文名勾栗,否則出錯(cuò)

"""

from xlrd import open_workbook

from xlutils.copy import copy

import os,shutil

class MyXls:

? ? def __init__(self,fpath=None,modelfpath=None,sheetindex=None,protectrow=None,overwrite=True):

? ? ? ? self.openxlspath=''#已打開的xls文件

? ? ? ? self.sheetindex=None#當(dāng)前工作表索引

? ? ? ? self.rb=None#

? ? ? ? self.wb=None#workbook工作簿

? ? ? ? self.ws=None#worksheet工作表

? ? ? ? self.headrow=0#開頭保護(hù)行數(shù)

? ? ? ? if (fpath is not None) and (modelfpath is not None):

? ? ? ? ? ? self.open_copy_xls(modelfpath,fpath,True)

? ? ? ? elif fpath is not None:self.open_xls(fpath)

? ? ? ? if sheetindex is not None:self.get_sheet(sheetindex)

? ? ? ? if protectrow is not None:self.headrow=protectrow


? ? def open_xls(self,fpath):

? ? ? ? path=fpath

? ? ? ? try:

? ? ? ? ? ? rb = open_workbook(path)

? ? ? ? except Exception as err:

? ? ? ? ? ? print("File not exists: "+str(err))

? ? ? ? ? ? return False

? ? ? ? #通過sheet_by_index()獲取的sheet沒有write()方法

? ? ? ? #rs = rb.sheet_by_index(0)

? ? ? ? #rs = rb.sheet_by_name('sheet 1')

? ? ? ? self.wb = copy(rb)

? ? ? ? self.openxlspath=path

? ? ? ? return True


? ? def get_sheet(self,sheet_index=0):

? ? ? ? sheets=sheet_index

? ? ? ? #通過get_sheet()獲取的sheet有write()方法

? ? ? ? self.ws = self.wb.get_sheet(sheets)

? ? ? ? self.sheetindex=sheets


? ? def write_xls(self,row_index,column_index,data_str):

? ? ? ? row,col,data=row_index,column_index,data_str

? ? ? ? #寫入數(shù)據(jù)

? ? ? ? self.ws.write(row,col,data)#write(行,列,內(nèi)容)惨篱,索引從0開始


? ? def write_xls_bycolname(self,row_index,column_name,data_str):

? ? ? ? column_index=self.colname_to_num(column_name)

? ? ? ? row,col,data=row_index,column_index,data_str

? ? ? ? #寫入數(shù)據(jù)

? ? ? ? self.ws.write(row,col,data)#write(行,列,內(nèi)容),索引從0開始

? ? def write_xls_bysheet(self,sheetindex,row_index,column_name,data_str):

? ? ? ? '''在指定工作表的指定行列表格中寫入數(shù)據(jù)'''

? ? ? ? if self.sheetindex != sheetindex :self.get_sheet(sheetindex)

? ? ? ? self.write_xls_bycolname(row_index,column_name,data_str)

? ? def save_xls(self,fpath=None):

? ? ? ? if fpath is None:

? ? ? ? ? ? self.wb.save(self.openxlspath)

? ? ? ? ? ? print('saved '+self.openxlspath)

? ? ? ? else:

? ? ? ? ? ? path=fpath

? ? ? ? ? ? self.wb.save(path)#保存xls文件

? ? ? ? ? ? print('saved '+path)

? ? ? ? return True


? ? def open_copy_xls(self,model_fpath,new_fpath,overwrite=True):

? ? ? ? '''參照模板文件围俘,復(fù)制并打開xls文件'''

? ? ? ? if os.path.exists(model_fpath) :

? ? ? ? ? ? new_fpath=self.auto_mkdir(new_fpath)

? ? ? ? ? ? if (not os.path.exists(new_fpath)) or overwrite:

? ? ? ? ? ? ? ? #print('copy[%s]to[%s]'%(model_fpath,new_fpath))

? ? ? ? ? ? ? ? shutil.copy(model_fpath,new_fpath)

? ? ? ? ? ? ? ? return self.open_xls(new_fpath)

? ? ? ? ? ? else:print('新文件已存在,請修改新文件名!');return False

? ? ? ? else:print('模板文件不存在界牡,不能復(fù)制到新文件簿寂!');return False

? ? def num_to_colname(self,col_index,start=0):

? ? ? ? #列索引轉(zhuǎn)列名,基數(shù)start從0開始,0-->A

? ? ? ? if type(col_index) != int:

? ? ? ? ? ? return col_index

? ? ? ? if start==0:

? ? ? ? ? ? x=col_index+1

? ? ? ? elif start==1:

? ? ? ? ? ? x=col_index

? ? ? ? s=''

? ? ? ? flag=False#借位標(biāo)志

? ? ? ? while x>26:

? ? ? ? ? ? y=x%26#取余0-25

? ? ? ? ? ? if y==0:y=26;flag=True;

? ? ? ? ? ? d=chr(y+64)#低位

? ? ? ? ? ? s=d+s

? ? ? ? ? ? x=x//26#整除取商

? ? ? ? ? ? if flag:x=x-1;flag=False;#如果借位宿亡,商要先-1

? ? ? ? g=chr(x+64)#高位

? ? ? ? s=g+s

? ? ? ? return s


? ? def colname_to_num(self,colname,start=0):

? ? ? ? #列名轉(zhuǎn)列索引 A-->0常遂,B->1,開始基數(shù)start為0

? ? ? ? if type(colname) is not str:

? ? ? ? ? ? return colname

? ? ? ? colname=colname.upper()#轉(zhuǎn)成大寫

? ? ? ? col = 0

? ? ? ? power? = 1

? ? ? ? #print(len(colname))#位數(shù)

? ? ? ? for i in range(len(colname) - 1, -1, -1):#range(start=0,stop,step=1)

? ? ? ? ? ? ch = colname[i] #倒序取字母

? ? ? ? ? ? #print(ch)#所在位上的字母

? ? ? ? ? ? col += (ord(ch) - ord('A') +? 1 ) * power

? ? ? ? ? ? power *= 26

? ? ? ? #print(col-1)

? ? ? ? if start==0:return col-1

? ? ? ? if start==1:return col


? ? def auto_mkdir(self,fpath):

? ? ? ? '''自動補(bǔ)全目錄,目錄不存在就創(chuàng)建目錄'''

? ? ? ? #fpath='D:\\MyPython\\粉筆公考題庫提取\\678\\980\\test.txt'

? ? ? ? fpath=fpath.replace('\\','/')

? ? ? ? if not os.path.exists(fpath):

? ? ? ? ? ? plst=fpath.split(sep='/')

? ? ? ? ? ? path=''

? ? ? ? ? ? if not fpath.endswith('/'):plst=plst[:-1]

? ? ? ? ? ? for p in plst:

? ? ? ? ? ? ? ? path=path+p+'/'

? ? ? ? ? ? ? ? if not os.path.exists(path):os.mkdir(path)

? ? ? ? ? ? return fpath


if __name__=='__main__':

? ? model_fpath='D:\\MyPython\\model.xls'

? ? new_fpath='D:\\MyPython\\abc\\123/out.xls'

#? ? myxls=MyXls()

#? ? myxls.open_copy_xls(model_fpath,new_fpath)

#? ? myxls.get_sheet(0)

? ? myxls=MyXls(new_fpath,model_fpath,2,3)

? ? myxls.write_xls_bycolname(6,'K','K列6行數(shù)據(jù)')

#? ? myxls.save_xls(new_fpath)

? ? myxls.save_xls()

? ? pass

'''

4挽荠、文件保存

保存成xls文件克胳,和txt文件,txt文件再轉(zhuǎn)換成word文檔打印出來圈匆。大概有7個(gè)大類漠另,100+小類,12737道題跃赚。

5笆搓、導(dǎo)入題庫軟件

xls文件導(dǎo)入題庫中。

6纬傲、大功告成


PS:某筆app更新后满败,加入了防抓取數(shù)據(jù)的功能,貌似安卓5.1以上的都不能抓取了叹括。

據(jù)資深網(wǎng)友反應(yīng)算墨,使用安卓模擬器(系統(tǒng)版本4.4)還可以抓到明文數(shù)據(jù),有興趣的讀者可以試一試汁雷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末净嘀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摔竿,更是在濱河造成了極大的恐慌面粮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件继低,死亡現(xiàn)場離奇詭異熬苍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)袁翁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門柴底,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粱胜,你說我怎么就攤上這事柄驻。” “怎么了焙压?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵鸿脓,是天一觀的道長抑钟。 經(jīng)常有香客問我,道長野哭,這世上最難降的妖魔是什么在塔? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拨黔,結(jié)果婚禮上蛔溃,老公的妹妹穿的比我還像新娘。我一直安慰自己篱蝇,他們只是感情好贺待,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著零截,像睡著了一般麸塞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞻润,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天喘垂,我揣著相機(jī)與錄音,去河邊找鬼绍撞。 笑死正勒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傻铣。 我是一名探鬼主播章贞,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼非洲!你這毒婦竟也來了鸭限?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤两踏,失蹤者是張志新(化名)和其女友劉穎败京,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梦染,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赡麦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帕识。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛粹。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肮疗,靈堂內(nèi)的尸體忽然破棺而出晶姊,到底是詐尸還是另有隱情,我是刑警寧澤伪货,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布们衙,位于F島的核電站钾怔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砍艾。R本人自食惡果不足惜蒂教,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一巍举、第九天 我趴在偏房一處隱蔽的房頂上張望脆荷。 院中可真熱鬧,春花似錦懊悯、人聲如沸蜓谋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桃焕。三九已至,卻和暖如春捧毛,著一層夾襖步出監(jiān)牢的瞬間观堂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工呀忧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师痕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓而账,卻偏偏與公主長得像胰坟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子泞辐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345