当前位置:   article > 正文

python 大学排行网站全部排行数据_python大学排行榜分析

python大学排行榜分析

RANKINGS_CRAWLER

中国大学排名,中国两岸四地排名,全球体育类院系大学排行,世界大学学术排名

中国最好学科排名,中国大学专业排名,世界一流学科排名(每个专业学科排行都有)

(方法跟实际代码有变动)

方法一:

获取中国大学排名,中国两岸四地排名,全球体育类院系大学排行,世界大学学术排名
1)使用headers,coohie模拟浏览器并登陆
2)通过get_payload_js(url)获取对应的payload_js(数据存储在这个包里面)
3)使用get_params()获取网页内容中参数的映射关系
4)使用re.findall()正则匹配所有相关数据,使用循环通过get_data()及正则匹配方式将排名的每一个大学数据各自存在字典里面,最后通过.to.csv()写入文件里面 

方法二:

获取中国最好学科排名,中国大学专业排名,世界一流学科排名,
1)使用headers,coohie模拟浏览器并登陆
2)通过requests.get()获取网页内容并返回保存为一个Response对象
3)使用get_params()获取网页内容中参数的映射关系
4)使用re.findall()正则匹配所有相关数据,使用循环通过get_data()及正则匹配方式获取对应学科或专业的编码及名字存为字典形式

5)通过resp.json()获取网页内容返回json格式,并将各个学校信息循环写入字典里,最后通过.to.csv()写入文件里面 

完整项目链接:基于python 的爬虫及flask框架web大屏交互式可视化

https://download.csdn.net/download/weixin_66397563/87651644?spm=1001.2014.3001.5503

注意: 本文以学习技术为主,不可以用于非法行为, 如有侵权请联系删除

  1. import requests
  2. import re
  3. import os
  4. import pandas as pd
  5. cookie = '''Hm_lvt_af1fda4748dacbd3ee2e3a69c3496570=1656413001,1656428399,1656458742,1656466843; TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTY0ODU5OTMsImp0aSI6IjI3MzA0NSIsImlzcyI6IjE1MCoqKio0NTcyIn0.S6wbuYOwHzcV-VTkCB3MNxy7L5t1mpWJVv-NCsXzJn0; Hm_lpvt_af1fda4748dacbd3ee2e3a69c3496570=1656470377'''
  6. headers = {
  7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.7 Safari/537.36',
  8. 'Cookie': cookie}
  9. # 防反爬虫,模拟浏览器
  10. b1 = "data/软科排行/"
  11. if not os.path.exists(b1) or not os.path.isdir(b1):
  12. os.makedirs(b1)
  13. s1 = os.path.join(b1, "中国大学排名/")
  14. if not os.path.exists(s1):
  15. os.makedirs(s1)
  16. s2 = os.path.join(b1, "中国最好学科排名/")
  17. if not os.path.exists(s2):
  18. os.makedirs(s2)
  19. s3 = os.path.join(b1, "中国大学专业排名/")
  20. if not os.path.exists(s3):
  21. os.makedirs(s3)
  22. s4 = os.path.join(b1, "世界大学学术排名/")
  23. if not os.path.exists(s4):
  24. os.makedirs(s4)
  25. s5 = os.path.join(b1, "世界一流学科排名/")
  26. if not os.path.exists(s5):
  27. os.makedirs(s5)
  28. s6 = os.path.join(b1, "中国两岸四地大学排名/")
  29. if not os.path.exists(s6):
  30. os.makedirs(s6)
  31. s7 = os.path.join(b1, "全球体育类院系学术排名/")
  32. if not os.path.exists(s7):
  33. os.makedirs(s7)
  34. def get_payload_js(url):
  35. # 每个url的 payload.js 是不一样的通过这个函数获取,返回对应数据
  36. resp = requests.get(url, headers=headers)
  37. if resp.status_code == 404:
  38. return None
  39. # 状态值为404,获取失败,榜单不存在的情况
  40. # 正则匹配payload.js
  41. payload_href = re.findall(r'/_nuxt/static/(.*?)/payload\.js"', resp.text, re.S)
  42. payload_href = payload_href[0]
  43. js_url = "https://www.shanghairanking.cn/_nuxt/static/{}/payload.js".format(payload_href)
  44. resp2 = requests.get(js_url, headers=headers)
  45. html = resp2.text
  46. return html
  47. def get_num(s):
  48. s = s.split("-")[0]
  49. return int(s)
  50. # 对字符串进行分割并返回一个列表
  51. def get_bcur_data(year):
  52. # 获取中国大学排名
  53. # https://www.shanghairanking.cn/_nuxt/static/1655530991/rankings/bcur/201511/payload.js
  54. url = f"https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year={year}"
  55. resp = requests.get(url, headers=headers)
  56. if resp.status_code == 404:
  57. return None
  58. data = resp.json()
  59. if year in [2022, 2021, 2020]:
  60. k = "办学层次"
  61. else:
  62. k = "生源质量"
  63. items = {
  64. "排名": [],
  65. "学校名称": [],
  66. "省市": [],
  67. "类型": [],
  68. "总分": [],
  69. k: [],
  70. }
  71. for i in data['data']['rankings']:
  72. items['排名'].append(i['ranking'])
  73. items['学校名称'].append(i['univNameCn'])
  74. items['省市'].append(i['province'])
  75. items['类型'].append(i['univCategory'])
  76. items['总分'].append(i['score'])
  77. if year == 2015:
  78. items[k].append(i['indData']['1'])
  79. if year == 2016:
  80. items[k].append(i['indData']['10'])
  81. if year == 2017:
  82. items[k].append(i['indData']['19'])
  83. if year == 2018:
  84. items[k].append(i['indData']['28'])
  85. if year == 2019:
  86. items[k].append(i['indData']['38'])
  87. if year == 2020:
  88. items[k].append(i['indData']['59'])
  89. if year == 2021:
  90. items[k].append(i['indData']['159'])
  91. if year == 2022:
  92. items[k].append(i['indData']['271'])
  93. return items
  94. def get_rtugc_data(year):
  95. # 中国两岸四地大学排名
  96. url = "https://www.shanghairanking.cn/rankings/rtugc/{}".format(year)
  97. payload_js = get_payload_js(url)
  98. if not payload_js:
  99. return None
  100. params = get_params(payload_js)
  101. data = re.findall(r'\{ranking(.*?)\},', payload_js, re.S)
  102. items = {
  103. "排名": [],
  104. "学校名称": [],
  105. "国家/地区": [],
  106. "总分": [],
  107. "研究生比例": [],
  108. }
  109. for i, _ in enumerate(data):
  110. _ = "ranking" + _
  111. rank = get_data(_, r'ranking\:(.*?)\,', params)
  112. univNameCn = get_data(_, r'univNameCn\:(.*?)\,', params)
  113. score = get_data(_, r'score\:(.*?)\,', params)
  114. region = get_data(_, r'region\:(.*?)\,', params)
  115. indData = get_data(_, r'data\:\{\"(.*?)\"\:(.*?)\,', params)
  116. items['排名'].append(rank)
  117. items['学校名称'].append(univNameCn)
  118. items['国家/地区'].append(region)
  119. items['总分'].append(score)
  120. items['研究生比例'].append(indData)
  121. # 匹配对应数据并写入字典里面
  122. return items
  123. def get_grsssd_data(year):
  124. # 全球体育类院系学术排名
  125. url = "https://www.shanghairanking.cn/rankings/grsssd/{}".format(year)
  126. payload_js = get_payload_js(url)
  127. if not payload_js:
  128. return None
  129. params = get_params(payload_js)
  130. data = re.findall('\{ranking(.*?)\},', payload_js, re.S)
  131. items = {
  132. "排名": [],
  133. "学校名称": [],
  134. "国家/地区": [],
  135. "总分": [],
  136. "论文数": [],
  137. }
  138. for i, _ in enumerate(data):
  139. _ = "ranking" + _
  140. rank = get_data(_, 'ranking\:(.*?)\,', params)
  141. univNameCn = get_data(_, 'univNameCn\:(.*?)\,', params)
  142. score = get_data(_, 'score\:(.*?)\,', params)
  143. region = get_data(_, 'region\:(.*?)\,', params)
  144. indData = get_data(_, 'indData\:\{\"(.*?)\"\:(.*?)\,', params)
  145. items['排名'].append(rank)
  146. items['学校名称'].append(univNameCn)
  147. items['国家/地区'].append(region)
  148. if score:
  149. items['总分'].append(score)
  150. else:
  151. items['总分'].append('')
  152. items['论文数'].append(indData)
  153. return items
  154. def get_arwu_data(year):
  155. # 世界大学学术排名
  156. url = f"https://www.shanghairanking.cn/api/pub/v1/arwu/rank?year={year}"
  157. print(url)
  158. resp = requests.get(url, headers=headers)
  159. data = resp.json()
  160. if year in '2003':
  161. k = "教师获奖"
  162. else:
  163. k = "校友获奖"
  164. items = {
  165. "排名": [],
  166. "学校名称": [],
  167. "国家/地区": [],
  168. "排名(国家/地区)": [],
  169. "总分": [],
  170. k: [],
  171. }
  172. inds = {_['nameCn']: _['code'] for _ in data['data']['inds']}
  173. # 字典生成式
  174. for r in data['data']['rankings']:
  175. items['排名'].append(r['ranking'])
  176. items['学校名称'].append(r['univNameCn'])
  177. items['国家/地区'].append(r['region'])
  178. items['排名(国家/地区)'].append(r['regionRanking'])
  179. items['总分'].append(r['score'])
  180. if k in inds:
  181. items[k].append(r['indData'].get(inds[k], "0"))
  182. else:
  183. items[k].append('')
  184. return items
  185. def get_bcsr_name(year):
  186. # 获取中国最好学科排名的学科编码及名称
  187. # 2017 https://www.shanghairanking.cn/_nuxt/static/1655530991/rankings/bcsr/2017/payload.js
  188. url = f"https://www.shanghairanking.cn/_nuxt/static/1655530991/rankings/bcsr/{year}/payload.js"
  189. resp = requests.get(url, headers=headers)
  190. params = get_params(resp.text)
  191. data = re.findall('\{code(.*?)\},', resp.text, re.S)
  192. id_items = []
  193. for _ in data:
  194. _ = "code" + _
  195. _id = get_data(_, 'code\:(.*?)\,', params)
  196. if len(_id) <= 2:
  197. continue
  198. nameCn = get_data(_, 'nameCn\:(.*?)\,', params)
  199. id_items.append({"id": _id, "name": nameCn})
  200. return id_items
  201. def get_bcsr_data(id_s, year):
  202. # 获取中国最好学科排名的学科编码及名称对应的排行榜
  203. url = f"https://www.shanghairanking.cn/api/pub/v1/bcsr/rank?target_yr={year}&yr={year - 1}&subj_code={id_s}"
  204. resp = requests.get(url, headers=headers)
  205. data = resp.json()
  206. items = {
  207. f"{year}排名": [],
  208. f"{year - 1}排名": [],
  209. "全部层次": [],
  210. "学校名称": [],
  211. "总分": []
  212. }
  213. for j in data['data']['rankings']:
  214. items[f"{year}排名"].append(j['ranking'])
  215. if j['contrastRanking'] and j['contrastRanking'].get(f"{year - 1}"):
  216. items[f"{year - 1}排名"].append(j['contrastRanking'].get(f"{year - 1}"))
  217. else:
  218. items[f"{year - 1}排名"].append('')
  219. items['全部层次'].append(j['rankPctTop'])
  220. items['学校名称'].append(j['univNameCn'])
  221. items['总分'].append(j['score'])
  222. return items
  223. def get_gras_name(year):
  224. # 获取世界一流学科排名排名的学科编码及名称
  225. # https://www.shanghairanking.cn/_nuxt/static/1655530313/rankings/gras/2021/payload.js
  226. if year in [2019, 2020]:
  227. url = f"https://www.shanghairanking.cn/_nuxt/static/1655530991/rankings/gras/{year}/payload.js"
  228. else:
  229. url = f"https://www.shanghairanking.cn/_nuxt/static/1655530313/rankings/gras/{year}/payload.js"
  230. resp = requests.get(url, headers=headers)
  231. params = get_params(resp.text)
  232. data = re.findall('\{code(.*?)\},', resp.text, re.S)
  233. id_items = []
  234. for _ in data:
  235. _ = "code" + _
  236. _id = get_data(_, 'code\:(.*?)\,', params)
  237. if len(_id) <= 4:
  238. continue
  239. nameCn = get_data(_, 'nameCn\:(.*?)\,', params)
  240. id_items.append({"id": _id, "name": nameCn})
  241. return id_items
  242. def get_gras_data(id_s, year):
  243. # 获取世界一流学科排名排名的学科编码及名称对应的排行榜
  244. url = f"https://www.shanghairanking.cn/api/pub/v1/gras/rank?year={year}&subj_code={id_s}"
  245. resp = requests.get(url, headers=headers)
  246. data = resp.json()
  247. if year != 2020 | 2021:
  248. k = "论文总数"
  249. else:
  250. k = "重要期刊论文数"
  251. items = {
  252. f"{year}排名": [],
  253. "学校名称": [],
  254. "国家/地区": [],
  255. "总分": [],
  256. k: [],
  257. }
  258. inds = {_['nameCn']: _['code'] for _ in data['data']['inds']}
  259. for j in data['data']['rankings']:
  260. items[f"{year}排名"].append(j['ranking'])
  261. items['学校名称'].append(j['univNameCn'])
  262. items['国家/地区'].append(j['region'])
  263. items['总分'].append(j['score'])
  264. if k in inds:
  265. items[k].append(j['indData'].get(inds[k], "0"))
  266. else:
  267. items[k].append('')
  268. return items
  269. def get_bcmr_name():
  270. # 获取中国大学专业排名的专业编码及名称
  271. url = "https://www.shanghairanking.cn/rankings/bcmr/2021"
  272. payload_js = get_payload_js(url)
  273. if not payload_js:
  274. return None
  275. params = get_params(payload_js)
  276. data = re.findall('name=(.*?);(.*?)code=(.*?);', payload_js, re.S)
  277. id_items = []
  278. for _ in data:
  279. name = _[0]
  280. if name in params:
  281. name = params[name]
  282. name = name.replace('"', "")
  283. _id = _[-1]
  284. if _id in params:
  285. _id = params[_id]
  286. _id = _id.replace('"', "")
  287. if len(_id) <= 4:
  288. continue
  289. id_items.append({"id": _id, "name": name})
  290. return id_items
  291. def parse(p):
  292. p = p.replace('"', "")
  293. if p == "null":
  294. return None
  295. if p == "false":
  296. return False
  297. return p
  298. # 将js里面的nullfalse转为python里面的None,False,pyhon里面必须大写,将''去除
  299. def get_data(s, re_t, params):
  300. k = re.findall(re_t, s, re.S)[0]
  301. if isinstance(k, tuple):
  302. k = k[-1]
  303. if k in params:
  304. k = params[k]
  305. else:
  306. k = k.replace('"', "")
  307. return k
  308. def get_params(payload_js):
  309. params1 = re.findall('function\((.*?)\)', payload_js, re.S)[0].split(",")
  310. params1 = [x.strip() for x in params1] # 参数列表
  311. params2 = [parse(_) for _ in
  312. re.findall("""}\((.*?)\)""", payload_js, re.S)[0].replace("\n", "").replace('"2021,2020"',
  313. '"2021|2020"').split(
  314. ",")] # 值的列表
  315. # 映射关系
  316. params = {x: y for x, y in zip(params1, params2)}
  317. return params
  318. # 获取参数对应的payload_js数据,
  319. def get_bcmr_data(id_s):
  320. # 获取中国大学专业排名排名的学科编码及名称对应的排行榜
  321. url = f"https://www.shanghairanking.cn/api/pub/v1/bcmr/rank?year=2021&majorCode={id_s}"
  322. resp = requests.get(url, headers=headers)
  323. data = resp.json()
  324. items = {
  325. "评级": [],
  326. "排名": [],
  327. "学校名称": [],
  328. "省市": [],
  329. "总分": [],
  330. }
  331. # inds = {_['nameCn']: _['code'] for _ in data['data']['inds']}
  332. for j in data['data']['rankings']:
  333. items["评级"].append(j['grade'])
  334. items["排名"].append(j['ranking'])
  335. items['学校名称'].append(j['univNameCn'])
  336. city = j['city'] if j['city'] else j['province']
  337. items['省市'].append(city)
  338. # items['省市'].append(j['province'])
  339. items['总分'].append(j['score'])
  340. return items
  341. def mune():
  342. print("RANKINGS爬虫启动")
  343. pid = os.getpid()
  344. print("pid:", pid)
  345. with open("./data/RANKINGS_pid.txt", "w") as f:
  346. f.write(str(pid))
  347. begin_year = 2003
  348. while begin_year <= 2022:
  349. # 总目录下如果没有年份子目录,或者年份子目录不在总目录下则在总目录下建立一个年份子目录
  350. if begin_year >= 2015:
  351. s1_d = os.path.join(s1, str(begin_year))
  352. if not os.path.exists(s1_d):
  353. os.makedirs(s1_d)
  354. ch1 = get_bcur_data(begin_year)
  355. if ch1:
  356. file_name = os.path.join(s1_d, "中国大学排名.csv")
  357. # 在年份子目录下建立对应排名文件
  358. pd.DataFrame(ch1).to_csv(file_name, index=False)
  359. # 写入数据
  360. if 2011 <= begin_year <= 2020:
  361. s6_d = os.path.join(s6, str(begin_year))
  362. if not os.path.exists(s6_d):
  363. os.makedirs(s6_d)
  364. c2 = get_rtugc_data(begin_year)
  365. if c2:
  366. file_name = os.path.join(s6_d, "中国两岸四地大学排名.csv")
  367. pd.DataFrame(c2).to_csv(file_name, index=False)
  368. if begin_year in [2016, 2017, 2018, 2020, 2021]:
  369. s7_d = os.path.join(s7, str(begin_year))
  370. if not os.path.exists(s7_d):
  371. os.makedirs(s7_d)
  372. c3 = get_grsssd_data(begin_year)
  373. if c3:
  374. file_name = os.path.join(s7_d, "全球体育类院系学术排名.csv")
  375. pd.DataFrame(c3).to_csv(file_name, index=False)
  376. if 2017 <= begin_year <= 2021:
  377. s2_d = os.path.join(s2, str(begin_year))
  378. if not os.path.exists(s2_d):
  379. os.makedirs(s2_d)
  380. for rk in get_bcsr_name(begin_year): # 中国最好学科排名
  381. c4 = get_bcsr_data(rk['id'], begin_year)
  382. if c4:
  383. file_name = os.path.join(s2_d, rk['name'] + ".csv")
  384. pd.DataFrame(c4).to_csv(file_name, index=False)
  385. s5_d = os.path.join(s5, str(begin_year))
  386. if not os.path.exists(s5_d):
  387. os.makedirs(s5_d)
  388. for gr in get_gras_name(begin_year): # 世界一流学科排名
  389. c5 = get_gras_data(gr['id'], begin_year)
  390. if c5:
  391. file_name = os.path.join(s5_d, gr['name'] + ".csv")
  392. pd.DataFrame(c5).to_csv(file_name, index=False)
  393. if begin_year in [2021, 2022]:
  394. print(begin_year)
  395. s3_d = os.path.join(s3, str(begin_year))
  396. if not os.path.exists(s3_d):
  397. os.makedirs(s3_d)
  398. for zr in get_bcmr_name(): # 中国大学专业排名
  399. c6 = get_bcmr_data(zr['id'])
  400. if c6:
  401. file_name = os.path.join(s3_d, zr['name'] + ".csv")
  402. pd.DataFrame(c6).to_csv(file_name, index=False)
  403. if 2003 <= begin_year <= 2021:
  404. s4_d = os.path.join(s4, str(begin_year))
  405. if not os.path.exists(s4_d):
  406. os.makedirs(s4_d)
  407. c7 = get_arwu_data(str(begin_year))
  408. file_name = os.path.join(s4_d, "世界大学学术排名.csv")
  409. pd.DataFrame(c7).to_csv(file_name, index=False)
  410. begin_year += 1
  411. if __name__ == '__main__':
  412. begin_year = 2003
  413. while begin_year <= 2022:
  414. # 总目录下如果没有年份子目录,或者年份子目录不在总目录下则在总目录下建立一个年份子目录
  415. if begin_year >= 2015:
  416. s1_d = os.path.join(s1, str(begin_year))
  417. if not os.path.exists(s1_d):
  418. os.makedirs(s1_d)
  419. ch1 = get_bcur_data(begin_year)
  420. if ch1:
  421. file_name = os.path.join(s1_d, "中国大学排名.csv")
  422. # 在年份子目录下建立对应排名文件
  423. pd.DataFrame(ch1).to_csv(file_name, index=False)
  424. # 写入数据
  425. if 2011 <= begin_year <= 2020:
  426. s6_d = os.path.join(s6, str(begin_year))
  427. if not os.path.exists(s6_d):
  428. os.makedirs(s6_d)
  429. c2 = get_rtugc_data(begin_year)
  430. if c2:
  431. file_name = os.path.join(s6_d, "中国两岸四地大学排名.csv")
  432. pd.DataFrame(c2).to_csv(file_name, index=False)
  433. if begin_year in [2016, 2017, 2018, 2020, 2021]:
  434. s7_d = os.path.join(s7, str(begin_year))
  435. if not os.path.exists(s7_d):
  436. os.makedirs(s7_d)
  437. c3 = get_grsssd_data(begin_year)
  438. if c3:
  439. file_name = os.path.join(s7_d, "全球体育类院系学术排名.csv")
  440. pd.DataFrame(c3).to_csv(file_name, index=False)
  441. if 2017 <= begin_year <= 2021:
  442. s2_d = os.path.join(s2, str(begin_year))
  443. if not os.path.exists(s2_d):
  444. os.makedirs(s2_d)
  445. for rk in get_bcsr_name(begin_year): # 中国最好学科排名
  446. c4 = get_bcsr_data(rk['id'], begin_year)
  447. if c4:
  448. file_name = os.path.join(s2_d, rk['name'] + ".csv")
  449. pd.DataFrame(c4).to_csv(file_name, index=False)
  450. s5_d = os.path.join(s5, str(begin_year))
  451. if not os.path.exists(s5_d):
  452. os.makedirs(s5_d)
  453. for gr in get_gras_name(begin_year): # 世界一流学科排名
  454. c5 = get_gras_data(gr['id'], begin_year)
  455. if c5:
  456. file_name = os.path.join(s5_d, gr['name'] + ".csv")
  457. pd.DataFrame(c5).to_csv(file_name, index=False)
  458. if begin_year in [2021,2022]:
  459. print(begin_year)
  460. s3_d = os.path.join(s3, str(begin_year))
  461. if not os.path.exists(s3_d):
  462. os.makedirs(s3_d)
  463. for zr in get_bcmr_name(): # 中国大学专业排名
  464. c6 = get_bcmr_data(zr['id'])
  465. if c6:
  466. file_name = os.path.join(s3_d, zr['name'] + ".csv")
  467. pd.DataFrame(c6).to_csv(file_name, index=False)
  468. if 2003 <= begin_year <= 2021:
  469. s4_d = os.path.join(s4, str(begin_year))
  470. if not os.path.exists(s4_d):
  471. os.makedirs(s4_d)
  472. c7 = get_arwu_data(str(begin_year))
  473. file_name = os.path.join(s4_d, "世界大学学术排名.csv")
  474. pd.DataFrame(c7).to_csv(file_name, index=False)
  475. begin_year += 1

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号