溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python 助你填寫高考志愿

發(fā)布時間:2020-07-16 10:57:05 來源:網(wǎng)絡(luò) 閱讀:892 作者:hoxis 欄目:編程語言

最近一周一直在幫家里小弟看高考志愿,所以更新的沒那么頻繁了,請大家見諒。

在看各高校的往年分?jǐn)?shù)時,忍不住手癢,想著能不能給它爬下來?哈哈,說干就干!

1 流程分析

之前無意中在這個網(wǎng)站發(fā)現(xiàn)有各個高校的歷年錄取分?jǐn)?shù)線:https://gkcx.eol.cn。

我們的目標(biāo)是用 Python 將下面頁面的數(shù)據(jù)導(dǎo)出到 Excel:

Python 助你填寫高考志愿

這個頁面的 URL 是:https://gkcx.eol.cn/schoolhtm/schoolTemple/school160.htm,顯然是需要一個 school_id 拼接而成的,那么如何獲取這個 school_id 呢?

除非想辦法爬取到所有院校的 school_id,這里我想著是從上面圖中的搜索框進(jìn)入:

Python 助你填寫高考志愿

這樣,整體的業(yè)務(wù)流程我們就理清楚了:

  • 先調(diào)用搜索的 URL 獲取到高校的 school_id,拼接到高校的詳情訪問地址
  • 訪問詳情地址,抓取目標(biāo)數(shù)據(jù)
  • 處理目標(biāo)數(shù)據(jù),存儲到 Excel 中

2 獲取 school_id

按下 F12,可以看出搜索調(diào)用的 URL 是:https://gkcx.eol.cn/soudaxue/queryschool.html?&keyWord1=南京郵電大學(xué),但是我們發(fā)現(xiàn)該請求的 response 里并沒有高校列表,所以猜測這里是有二次數(shù)據(jù)請求獲取到高校的列表,然后解析顯示到頁面的。

順著請求流,我們看到了這么一個請求:

Python 助你填寫高考志愿

并且它的 response 剛好是一個包含高校信息的 json,到這里應(yīng)該還是順利的,我們只要從這個 json 里解析出我們想要的東西,然后繼續(xù)后面的步驟就可以了。要注意該請求的 Referer。

但是在解析這個 json 時會遇到一個小問題,返回的數(shù)據(jù)格式是這樣的:

({
 "totalRecord": {"num": "2"},
 "school":  [
    {
   "schoolid": "160",
   "schoolname": "南京郵電大學(xué)",
...
});

它是被 (); 包圍著的,不是一個合法的 json 數(shù)據(jù),這里需要對其進(jìn)行處理后才能解析 json:

    # 返回數(shù)據(jù)包含 ();,需要特殊處理
    text = ((response.text).split(');',1)[0]).split('(',1)[1]
    j = json.loads(text)

3 分?jǐn)?shù)線獲取

學(xué)校的詳情頁面是:https://gkcx.eol.cn/schoolhtm/schoolTemple/school160.htm,同樣的套路,在點(diǎn)擊后 response 里并沒有分?jǐn)?shù)線數(shù)據(jù),我想也是二次請求吧,果然在請求流里找到了這個:

Python 助你填寫高考志愿

這里的兩個請求剛好將高校的每年分?jǐn)?shù)線和各專業(yè)的分?jǐn)?shù)線以 XML 的格式返回,Very Good!

下面要做的就是 XML 解析啦。

4 XML 解析

這里我們使用 xml.etree.ElementTree 來解析 XML:

<areapionts>
    <areapiont>
        <year>2017</year>
        <specialname>軟件工程(嵌入式培養(yǎng))</specialname>
        <maxfs>369</maxfs>
        <varfs>366</varfs>
        <minfs>364</minfs>
        <pc>一批</pc>
        <stype>理科</stype>
    </areapiont>

由于數(shù)據(jù)比較規(guī)整,解析也很簡單:

areapionts = ET.fromstring(response.text)
for areapiont in areapionts:
    print(areapiont.find('year').text)
    print(areapiont.find('specialname').text)

5 Excel 寫入

Excel 的寫入需要借助于 openpyxl 模塊。

  • openpyxl 簡單使用示例
>>> import openpyxl
>>> wb = openpyxl.Workbook()
# 初始時會生成一個 sheet 頁
>>> wb.sheetnames
['Sheet']
# 創(chuàng)建 sheet 頁
>>> wb.create_sheet(index=0,title='First')
<Worksheet "First">
# 獲取所有 sheet 頁
>>> wb.sheetnames
['First', 'Sheet']
# 刪除 sheet 頁
>>> wb.remove(wb['Sheet'])
>>> wb.sheetnames
['First']
>>> sheet = wb['First']
# 設(shè)置單元格
>>> sheet['A1'] = '省份'
>>> sheet['B1'] = '學(xué)校'
# 設(shè)置指定的單元格
>>> sheet.cell(1,3).value='test'
>>> wb.save('test.xlsx')
  • XML 解析寫入 Excel
def gen_excel(school,xml,wb):
    sheet = wb.create_sheet(title='各專業(yè)歷年錄取分?jǐn)?shù)線')
    sheet.column_dimensions['B'].width = 40
    sheet['A1'] = '年份'
    sheet['B1'] = '專業(yè)'
    sheet['C1'] = '最高分'
    sheet['D1'] = '平均分'
    sheet['E1'] = '最低分'
    sheet['F1'] = '批次'
    sheet['G1'] = '錄取批次'

    areapionts = ET.fromstring(xml)
    column = 1 
    for areapiont in areapionts:
        column += 1
        sheet.cell(column,1).value = areapiont.find('year').text
        sheet.cell(column,2).value = areapiont.find('specialname').text
        sheet.cell(column,3).value = areapiont.find('maxfs').text
        sheet.cell(column,4).value = areapiont.find('varfs').text
        sheet.cell(column,5).value = areapiont.find('minfs').text
        sheet.cell(column,6).value = areapiont.find('pc').text
        sheet.cell(column,7).value = areapiont.find('stype').text
    wb.save('{}.xlsx'.format(school['schoolname']))

執(zhí)行效果

$ python gkcx.py
Please the school name:南京郵電大學(xué)
共檢索到 2 個高校:['南京郵電大學(xué)', '南京郵電大學(xué)通達(dá)學(xué)院']
數(shù)據(jù)獲取完成,已下載到腳本目錄

Python 助你填寫高考志愿

結(jié)果看著還可以,但是還是有問題的,因為各省的分?jǐn)?shù)線肯定是不一樣的,這里默認(rèn)檢索出的是學(xué)校所在省的分?jǐn)?shù)線,因此若要獲取在其他省的分?jǐn)?shù)線,還需要進(jìn)一步處理,有興趣的同學(xué)不妨動手試一下。后臺回復(fù)「高考」可以獲取源碼。


Python 助你填寫高考志愿

最近搜集到慕課網(wǎng)視頻,視頻內(nèi)容涵蓋 Python、Java、PHP、前端、小程序、算法、架構(gòu)、數(shù)據(jù)庫等等!關(guān)注本公眾號,后臺回復(fù)「慕課網(wǎng)」即可獲取下載地址。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI