08.16 藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

獨樂了不如眾樂樂,老王私人收藏,有下價值的放出來大家一起用(能放出來的都是實踐過的喲),大家順手存一下,保不齊哪天就用上了。

疑難雜症隨手解壓,心中一股NB感悠然而生啊,祝各位大牛事業豐順。

經過我的分析發現QS全球大學排名網頁是通過Ajax進行加載的。

首先介紹一下Ajax:

AJAX = 異步 JavaScript 和 XML。

AJAX 是一種用於創建快速動態網頁的技術。

通過在後臺與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。

Ajax 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術,它並不是新的編程語言,而是一種使用現有標準的新方法。

這是要爬取的url(2018年的QS排名):

https://www.topuniversities.com/university-rankings/world-university-rankings/2018

第一步,分析請求:

首先,打開Chrome裡面的開發者工具,右鍵----檢查----Network----XHR

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

點擊檢查:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

點擊Network:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

點擊XHR:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

重新加載後,便會才採集到XHR數據

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

查看請求的具體數據:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

Headers裡面是請求和響應的頭。包括請求的url,請求的方式,響應的狀態碼等等。

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

Preview裡面是請求之後服務器返回的內容。Response裡面也是返回的內容。

通過分析我們知道第4個請求返回來的數據正是我要爬取的內容。

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

上面 是點擊preview之後出現的內容。

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

方框中的內容正是我們要爬取的內容,因此我們只需要爬取這些數據即可。

接下來,點擊headers,我們找到它的url:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

URL: https://www.topuniversities.com/sites/default/files/qs-rankings-data/357051.txt?_=1525140700107

找到url後,第二步就是獲取這些數據。這裡定義一個函數來獲取數據:

# 獲取數據

def get_page(url):

try:

r = requests.get(url, headers=headers)

if r.status_code == 200:

return r.json()

except requests.ConnectionError as e:

print(e)

第三步,解析數據

# 解析數據

def parser_page(json):

if json:

items = json.get('data')

for i in range(len(items)):

item = items[i]

qsrank = {}

if "=" in item['rank_display']:

rk_str = str(item['rank_display']).split('=')[-1]

qsrank['rank_display'] = rk_str

else:

qsrank['rank_display'] = item['rank_display']

qsrank['title'] = item['title']

qsrank['region'] = item['region']

qsrank['score'] = item['score']

# url可根據需求提取

qsrank['url'] = item['url']

yield qsrank

第四步,定義主函數

# 主函數

def main():

json = get_page(url)

results = parser_page(json)

for result in results:

with open(path, 'a') as f: # path 是文件要存儲的地方

f.write('{:10}{:50}{:^88}{:>}\\n'.format(result['rank_display'], result['title'], result['region'],

result['score']))

f.close()

最後調用主函數即可,可以看到爬到的數據如下圖:

藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名

至此,通過分析Ajax接口,用Python爬取QS全球大學排名的Python爬蟲就完成了。

PS:由於不熟Python,老王只用到數據接口就足夠了,感覺拿到數據基本就可以為所欲為了,有興趣的同學可以試試,希望對大家有所幫助!


分享到:


相關文章: