更新時間:2023-10-15 16:09:30作者:佚名
前些日子,朋友的女兒出席中考,曉得分數后讓我幫忙參考報校區,作為一個已過弱冠之年的油膩阿姨,遠離中學早已16年了,各個院校在我省得投檔批次、人數、分數(位次)一無所知,幸好有無所不知的互聯網,并且全省幾千家院校,一個一個查上去太難了,就想假如有個excel表格記錄全省院校在我省得投檔情況,我就可以按照分數(位次)從容的選出才能報名的中學。沮喪的是這個數據沒有。我從2021年的3月開始基礎,這幾天正好自學到爬蟲這一部份,我就想能不能從網路上爬取這種數據。查找網路,有(中國教育在線),在中學——歷年分數頁面有我所須要的數據,具體如下:
紅色圈住的數據就是我須要的。
一、看到了里面的數據,并且還有一個前提條件,找到全省所有的中學,這個也好查找全國大學錄取分數線表,圖片如下:
看一下,全省所有的院校有143頁,接出來我要做的就是看那些數據的真實來源,只有通過瀏覽器中的開發真工具,最好用微軟瀏覽器,按F12,通過仔細觀察,我發覺這種數據的真實來始于網頁中的json,真實網址應當是page=2&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists,看一下這個網址,很容易發覺,page=?是第幾頁列表所顯示的所有中學,由于我自學還沒有學到json數據爬取,我大約用了零零碎碎好幾個小時來查找高手們的文章全國大學錄取分數線表,后來發覺可以通過開發工具可以很清楚的得到下邊信息
你發覺了哪些,20個校區的地址,接著打開小三角,驚喜在這兒:
name=中學名子,=中學的數字代碼,這個我們先保存出來,恐怕之后有用。
曉得那么多,我們是不是可以嘗試先把全省所有的院校信息先爬出來保存,之后遍歷全省院校,爬取每位院校在某省得投檔數據了。我們離成功近了一步,查了很多前輩的代碼,選了一個我勉強才能看得懂得,稍稍做一下改動,具體如下:
json
os
time
先導出庫,有用沒用的我先導出,爬蟲學習的時間段,搞清搞不懂得先用來:
heads={'user-agent':'/5.0(NT10.0;Win64;x64)/537.36(KHTML,likeGecko)/91.0.4472.106/537.36'}#懇求頭,這個還是可以懂的
url='page=%s&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists’#院校列表網址(紅字的部份,這個要設置變量,便于我們爬取所有院校)
list=[]#搞一個空列表,原本想存入爬取院校的名子或則id
foriinrange(1,144):#這個不用說了吧,用i來代替頁腳,從1到143
print(url%(i))#可以不用的,我是想測試地址對不對
=.get(url%(i),=heads)#這個也不用說了,得到一個數據
print()#測試,可以除去
print(.text)#測試,可以除去
=json.loads(.text)#獲得json數據,不懂得可以百度,我也是復制高手的
#try:這個用法百度一下,避免出錯程序不往下運行
=['data']['item']#似乎是獲得josn數據的根目錄
formyin:#做個循環,提取中學id和中學名子
li={my['']:my['name']}#每位中學的id和中學組成一個字典的通配符對
list.(li)#將弄成的字典加入list列表
print(li)#復印通配符對
print(list)#復印列表
#:
#print('pass')
time.sleep(5)#間隔5秒鐘
二、找出各中學的投檔情況
打開網址用開發工具查找,跟查中學的差不多,瞧瞧發覺了哪些
真是網址:
我們須要提取數據為:,min,,,year,還要加上中學名子,
多對比幾次,很容易發覺,2020是年,46是中學id(總算用上了),42是省分代碼,1是理科(可以推測一下2是理科),旁邊的1.json是一樣的,穩當起見,我就先下載2020年全省院校在我省招生理科的全部數據:
='%s/41/2/1.json'#構造真是網址,
res=.get(%(my['']),=heads)#得到數據,來自于上一次爬取中學名稱的循環
=json.loads(res.text)#數據json化
=['data']['item']#找到根目錄
forkzxin:#在根目錄下一次提取具體數據
=[my['name'],kzx['year'],kzx[''],kzx[''],kzx['min'],kzx[''],kzx['']]#將每位中學的每次提取數據放入列表,仔細觀察my['name']來自于上一次爬取中學名稱的循環,
=open('.xls','a+',='gbk')#定義指定輸出Excel文件的名稱,讀入形式,編碼方法,參數'w'表示往指定表格讀入數據,會先將表格中本來的內容清空,若把參數’w'更改為‘a+',即可實現在先前內容的基礎上,降低新寫入的內容
forexinrange(0,len()):這個循環是上一個for循環的子循環
.write(str([ex]))
.write('t')#'t'表示每寫入一個元素后,會聯通到同行的下一個單元格
.write("n")#換行操作
.close()關掉文件
大體就這樣了,很多東西沒理解的情況寫的,肯定有很多錯誤的地方,而且早已試驗過,可以用。