亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Python 爬取高校歷年分?jǐn)?shù)線

WilsonLiu95 / 4202人閱讀

摘要:最近一周一直在幫家里小弟看高考志愿,所以更新的沒(méi)那么頻繁了,請(qǐng)大家見(jiàn)諒。在看各高校的往年分?jǐn)?shù)時(shí),忍不住手癢,想著能不能給它爬下來(lái)哈哈,說(shuō)干就干流程分析之前無(wú)意中在這個(gè)網(wǎng)站發(fā)現(xiàn)有各個(gè)高校的歷年錄取分?jǐn)?shù)線。

最近一周一直在幫家里小弟看高考志愿,所以更新的沒(méi)那么頻繁了,請(qǐng)大家見(jiàn)諒。

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

1 流程分析

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

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

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

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

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

先調(diào)用搜索的 URL 獲取到高校的 school_id,拼接到高校的詳情訪問(wèn)地址

訪問(wèn)詳情地址,抓取目標(biāo)數(shù)據(jù)

處理目標(biāo)數(shù)據(jù),存儲(chǔ)到 Excel 中

2 獲取 school_id

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

順著請(qǐng)求流,我們看到了這么一個(gè)請(qǐng)求:

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

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

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

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

    # 返回?cái)?shù)據(jù)包含 ();,需要特殊處理
    text = ((response.text).split(");",1)[0]).split("(",1)[1]
    j = json.loads(text)
3 分?jǐn)?shù)線獲取

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

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

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

4 XML 解析

這里我們使用 xml.etree.ElementTree 來(lái)解析 XML:


    
        2017
        軟件工程(嵌入式培養(yǎng))
        369
        366
        364
        一批
        理科
    

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

areapionts = ET.fromstring(response.text)
for areapiont in areapionts:
    print(areapiont.find("year").text)
    print(areapiont.find("specialname").text)
5 Excel 寫入

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

openpyxl 簡(jiǎn)單使用示例

>>> import openpyxl
>>> wb = openpyxl.Workbook()
# 初始時(shí)會(huì)生成一個(gè) sheet 頁(yè)
>>> wb.sheetnames
["Sheet"]
# 創(chuàng)建 sheet 頁(yè)
>>> wb.create_sheet(index=0,title="First")

# 獲取所有 sheet 頁(yè)
>>> wb.sheetnames
["First", "Sheet"]
# 刪除 sheet 頁(yè)
>>> 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 個(gè)高校:["南京郵電大學(xué)", "南京郵電大學(xué)通達(dá)學(xué)院"]
數(shù)據(jù)獲取完成,已下載到腳本目錄

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


如果覺(jué)得有用,歡迎關(guān)注我的微信,一起學(xué)習(xí),共同進(jìn)步,不定期推出贈(zèng)書活動(dòng)~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41988.html

相關(guān)文章

  • 爬蟲 - 收藏集 - 掘金

    摘要:在這之前,還是有必要對(duì)一些概念超輕量級(jí)反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲修煉之道——從網(wǎng)頁(yè)中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個(gè)爬取多頁(yè)面的網(wǎng)絡(luò)爬蟲主要講解了如何使用python編寫一個(gè)可以下載多頁(yè)面的爬蟲,如何將相對(duì)URL轉(zhuǎn)為絕對(duì)URL,如何限速,...

    1fe1se 評(píng)論0 收藏0
  • Java爬蟲之爬取中國(guó)高校排名前100名并存入MongoDB中

    摘要:介紹在博客爬蟲爬取中國(guó)高校排名前名并寫入中,我們利用來(lái)寫爬蟲,將中的大學(xué)排名表格爬取出來(lái),并存入到中。本次分享將用的來(lái)實(shí)現(xiàn)相同的功能,并將爬取到的數(shù)據(jù)存入到數(shù)據(jù)庫(kù)中。 介紹 ??在博客:Python爬蟲——爬取中國(guó)高校排名前100名并寫入MySQL中,我們利用Python來(lái)寫爬蟲,將http://gaokao.xdf.cn/201702/1... 中的大學(xué)排名表格爬取出來(lái),并存入到My...

    jzzlee 評(píng)論0 收藏0
  • Java爬蟲之爬取中國(guó)高校排名前100名并存入MongoDB中

    摘要:介紹在博客爬蟲爬取中國(guó)高校排名前名并寫入中,我們利用來(lái)寫爬蟲,將中的大學(xué)排名表格爬取出來(lái),并存入到中。本次分享將用的來(lái)實(shí)現(xiàn)相同的功能,并將爬取到的數(shù)據(jù)存入到數(shù)據(jù)庫(kù)中。 介紹 ??在博客:Python爬蟲——爬取中國(guó)高校排名前100名并寫入MySQL中,我們利用Python來(lái)寫爬蟲,將http://gaokao.xdf.cn/201702/1... 中的大學(xué)排名表格爬取出來(lái),并存入到My...

    GeekQiaQia 評(píng)論0 收藏0
  • 我用Python爬取了五千張美女圖壁紙,每天一張忘記初戀!

    摘要:愛(ài)美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開始,好看的桌面壁紙從美女壁紙開始。 大家好,我是辣條,這是我爬蟲系列的第26篇。 愛(ài)美之心人皆有之,正所謂窈窕淑女君子好逑,美好敲代碼的一天從好看的桌面壁紙開始,好看的桌面壁紙從美女壁紙開始。今天給大家?guī)?lái)福利啦,爬...

    huaixiaoz 評(píng)論0 收藏0
  • 23個(gè)Python爬蟲開源項(xiàng)目代碼,包含微信、淘寶、豆瓣、知乎、微博等

    摘要:今天為大家整理了個(gè)爬蟲項(xiàng)目。地址新浪微博爬蟲主要爬取新浪微博用戶的個(gè)人信息微博信息粉絲和關(guān)注。代碼獲取新浪微博進(jìn)行登錄,可通過(guò)多賬號(hào)登錄來(lái)防止新浪的反扒。涵蓋鏈家爬蟲一文的全部代碼,包括鏈家模擬登錄代碼。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天為大家整...

    jlanglang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<