1. 程式人生 > >Python爬蟲學習筆記(七)——智高考數據爬取

Python爬蟲學習筆記(七)——智高考數據爬取

pid items bubuko strong eai res har href name

介紹

智高考是一個高考誌願網站,也是基於Ajax的。高中的時候我在wyz大神的幫忙下,嘗試過爬取信息來為填誌願做準備。但是當時沒有系統學習過爬蟲,幾乎都是靠大神帶飛,因此今天再次嘗試爬取智高考的大學信息。(數據全部基於智高考,侵刪)
該網站有多種查詢模式,我打算爬取的有兩種。
1.各省份的本科大學
2.各學科的本科大學

正文

各省份的本科大學

首先分析Ajax,可以看到URL為:

http://www.zhigaokao.cn/university/getRemoteUniversityList.do?userKey=www&req=ajax&universityName=&areaid=110000&type=&educationLevel=1&property=&offset=0&rows=10

其中universityName、type、property均可省略,因為我們沒有傳入數據。然後通過字面翻譯可以知道,areaid是地區代碼的意思,也就是代表著各個省份(直轄市)。這裏可以選擇網上搜索所有省份代碼,預處理弄好,這也是我曾經的做法。但是今天我打算直接從網站上爬取所有省份代碼。
直接刷新界面,可以看到有好幾條xhr信息,仔細觀察就能發現其中一條就是存著省份代碼的信息。
技術分享圖片
接下來事情就簡單了,用requests讀取信息,然後解析就可以了,代碼如下

def get_id():
    url = 'http://www.zhigaokao.cn/university/getRemoteProvinceList.do?'
    payload = {
            'userKey': 'www',
            'req': 'ajax',
        }
    response = requests.get(url, headers=headers, params=payload)
    items = response.json().get('bizData')
    IDs = []
    for item in items:
        IDs.append(item.get('id'))
    return IDs

獲取省份代碼之後,就可以傳入之前的params中,通過offset來爬取所有信息。

各學科的本科大學

這裏比較麻煩的如何傳遞專業。按照智高考的專業分級有三級,因此我打算一二級用文件夾的形式存,三級作為文件的命名。總的思路和上面的類似,就不細細贅述了。我遭遇到的主要問題就是json結構層次太多,經常會搞暈,然後我沒有一開始定下怎麽按層次解析,因此踩了不少坑。說到底應該算是基礎不紮實、代碼量太少的原因吧。
技術分享圖片
還有要提及的一點是,我本打算先爬取所有專業大類存在list裏,然後發現這樣和最後的學校不容易匹配上,發現最終的json中其實也有專業大類的名稱,因此又重新修改了代碼,改為直接解析學校的URL。

總結

通過這次實踐,解決了曾經遺留的一些問題,也搞清楚如何解決Ajax的問題了。不過也發現了一些還不夠的地方。一個是事先對代碼的結構沒有考慮清楚,導致多次重構代碼,浪費了不少時間;另一個是python基礎不夠紮實,對list之類的基本數據結構運用的不熟練。
本次實踐代碼開源在github

Python爬蟲學習筆記(七)——智高考數據爬取