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,老王只用到数据接口就足够了,感觉拿到数据基本就可以为所欲为了,有兴趣的同学可以试试,希望对大家有所帮助!


分享到:


相關文章: