更新時(shí)間:2023-10-15 16:09:30作者:佚名
前些日子,朋友的女兒出席中考,曉得分?jǐn)?shù)后讓我?guī)兔⒖紙?bào)校區(qū),作為一個(gè)已過弱冠之年的油膩阿姨,遠(yuǎn)離中學(xué)早已16年了,各個(gè)院校在我省得投檔批次、人數(shù)、分?jǐn)?shù)(位次)一無所知,幸好有無所不知的互聯(lián)網(wǎng),并且全省幾千家院校,一個(gè)一個(gè)查上去太難了,就想假如有個(gè)excel表格記錄全省院校在我省得投檔情況,我就可以按照分?jǐn)?shù)(位次)從容的選出才能報(bào)名的中學(xué)。沮喪的是這個(gè)數(shù)據(jù)沒有。我從2021年的3月開始基礎(chǔ),這幾天正好自學(xué)到爬蟲這一部份,我就想能不能從網(wǎng)路上爬取這種數(shù)據(jù)。查找網(wǎng)路,有(中國(guó)教育在線),在中學(xué)——?dú)v年分?jǐn)?shù)頁(yè)面有我所須要的數(shù)據(jù),具體如下:
紅色圈住的數(shù)據(jù)就是我須要的。
一、看到了里面的數(shù)據(jù),并且還有一個(gè)前提條件,找到全省所有的中學(xué),這個(gè)也好查找全國(guó)大學(xué)錄取分?jǐn)?shù)線表,圖片如下:
看一下,全省所有的院校有143頁(yè),接出來我要做的就是看那些數(shù)據(jù)的真實(shí)來源,只有通過瀏覽器中的開發(fā)真工具,最好用微軟瀏覽器,按F12,通過仔細(xì)觀察,我發(fā)覺這種數(shù)據(jù)的真實(shí)來始于網(wǎng)頁(yè)中的json,真實(shí)網(wǎng)址應(yīng)當(dāng)是page=2&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists,看一下這個(gè)網(wǎng)址,很容易發(fā)覺,page=?是第幾頁(yè)列表所顯示的所有中學(xué),由于我自學(xué)還沒有學(xué)到j(luò)son數(shù)據(jù)爬取,我大約用了零零碎碎好幾個(gè)小時(shí)來查找高手們的文章全國(guó)大學(xué)錄取分?jǐn)?shù)線表,后來發(fā)覺可以通過開發(fā)工具可以很清楚的得到下邊信息
你發(fā)覺了哪些,20個(gè)校區(qū)的地址,接著打開小三角,驚喜在這兒:
name=中學(xué)名子,=中學(xué)的數(shù)字代碼,這個(gè)我們先保存出來,恐怕之后有用。
曉得那么多,我們是不是可以嘗試先把全省所有的院校信息先爬出來保存,之后遍歷全省院校,爬取每位院校在某省得投檔數(shù)據(jù)了。我們離成功近了一步,查了很多前輩的代碼,選了一個(gè)我勉強(qiáng)才能看得懂得,稍稍做一下改動(dòng),具體如下:
json
os
time
先導(dǎo)出庫(kù),有用沒用的我先導(dǎo)出,爬蟲學(xué)習(xí)的時(shí)間段,搞清搞不懂得先用來:
heads={'user-agent':'/5.0(NT10.0;Win64;x64)/537.36(KHTML,likeGecko)/91.0.4472.106/537.36'}#懇求頭,這個(gè)還是可以懂的

url='page=%s&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists’#院校列表網(wǎng)址(紅字的部份,這個(gè)要設(shè)置變量,便于我們爬取所有院校)
list=[]#搞一個(gè)空列表,原本想存入爬取院校的名子或則id
foriinrange(1,144):#這個(gè)不用說了吧,用i來代替頁(yè)腳,從1到143
print(url%(i))#可以不用的,我是想測(cè)試地址對(duì)不對(duì)
=.get(url%(i),=heads)#這個(gè)也不用說了,得到一個(gè)數(shù)據(jù)
print()#測(cè)試,可以除去
print(.text)#測(cè)試,可以除去
=json.loads(.text)#獲得json數(shù)據(jù),不懂得可以百度,我也是復(fù)制高手的
#try:這個(gè)用法百度一下,避免出錯(cuò)程序不往下運(yùn)行
=['data']['item']#似乎是獲得josn數(shù)據(jù)的根目錄
formyin:#做個(gè)循環(huán),提取中學(xué)id和中學(xué)名子
li={my['']:my['name']}#每位中學(xué)的id和中學(xué)組成一個(gè)字典的通配符對(duì)
list.(li)#將弄成的字典加入list列表
print(li)#復(fù)印通配符對(duì)
print(list)#復(fù)印列表
#:
#print('pass')
time.sleep(5)#間隔5秒鐘

二、找出各中學(xué)的投檔情況
打開網(wǎng)址用開發(fā)工具查找,跟查中學(xué)的差不多,瞧瞧發(fā)覺了哪些
真是網(wǎng)址:
我們須要提取數(shù)據(jù)為:,min,,,year,還要加上中學(xué)名子,
多對(duì)比幾次,很容易發(fā)覺,2020是年,46是中學(xué)id(總算用上了),42是省分代碼,1是理科(可以推測(cè)一下2是理科),旁邊的1.json是一樣的,穩(wěn)當(dāng)起見,我就先下載2020年全省院校在我省招生理科的全部數(shù)據(jù):
='%s/41/2/1.json'#構(gòu)造真是網(wǎng)址,
res=.get(%(my['']),=heads)#得到數(shù)據(jù),來自于上一次爬取中學(xué)名稱的循環(huán)
=json.loads(res.text)#數(shù)據(jù)json化

=['data']['item']#找到根目錄
forkzxin:#在根目錄下一次提取具體數(shù)據(jù)
=[my['name'],kzx['year'],kzx[''],kzx[''],kzx['min'],kzx[''],kzx['']]#將每位中學(xué)的每次提取數(shù)據(jù)放入列表,仔細(xì)觀察my['name']來自于上一次爬取中學(xué)名稱的循環(huán),
=open('.xls','a+',='gbk')#定義指定輸出Excel文件的名稱,讀入形式,編碼方法,參數(shù)'w'表示往指定表格讀入數(shù)據(jù),會(huì)先將表格中本來的內(nèi)容清空,若把參數(shù)’w'更改為‘a(chǎn)+',即可實(shí)現(xiàn)在先前內(nèi)容的基礎(chǔ)上,降低新寫入的內(nèi)容
forexinrange(0,len()):這個(gè)循環(huán)是上一個(gè)for循環(huán)的子循環(huán)
.write(str([ex]))
.write('t')#'t'表示每寫入一個(gè)元素后,會(huì)聯(lián)通到同行的下一個(gè)單元格
.write("n")#換行操作
.close()關(guān)掉文件
大體就這樣了,很多東西沒理解的情況寫的,肯定有很多錯(cuò)誤的地方,而且早已試驗(yàn)過,可以用。