獨樂了不如眾樂樂,老王私人收藏,有下價值的放出來大家一起用(能放出來的都是實踐過的喲),大家順手存一下,保不齊哪天就用上了。
疑難雜症隨手解壓,心中一股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全球大學排名](http://p2.ttnews.xyz/loading.gif)
點擊檢查:
![藏寶分享|通過分析Ajax接口用Python爬取QS全球大學排名](http://p2.ttnews.xyz/loading.gif)
點擊Network:
點擊XHR:
重新加載後,便會才採集到XHR數據
查看請求的具體數據:
Headers裡面是請求和響應的頭。包括請求的url,請求的方式,響應的狀態碼等等。
Preview裡面是請求之後服務器返回的內容。Response裡面也是返回的內容。
通過分析我們知道第4個請求返回來的數據正是我要爬取的內容。
上面 是點擊preview之後出現的內容。
方框中的內容正是我們要爬取的內容,因此我們只需要爬取這些數據即可。
接下來,點擊headers,我們找到它的url:
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全球大學排名的Python爬蟲就完成了。
PS:由於不熟Python,老王只用到數據接口就足夠了,感覺拿到數據基本就可以為所欲為了,有興趣的同學可以試試,希望對大家有所幫助!
閱讀更多 龍城勇哥 的文章