鱼C论坛

 找回密码
 立即注册
查看: 2346|回复: 5

如何寻找json数据url的规律

[复制链接]
发表于 2022-6-28 23:58:11 | 显示全部楼层 |阅读模式
60鱼币
侄女今年高考,想给她爬取山东省所有学校专业的数据,代码写好运行之后发现一些学校每一年的评论的json数据的url是不一样的,但是我也没找到规律,所以来求助一下,
举个例子
我发现一些学校的评论json在2020年前是,/37/1/14/,之后是/37/3/1570/,但是运行的时候发现很多是不一样的,应该怎么找规律呢,是不是哪里可以获取?
  1. from time import sleep
  2. import math
  3. import requests
  4. import json
  5. from fake_useragent import UserAgent





  6. #获取学校id
  7. def get_id():
  8.     url = 'https://api.eol.cn/web/api/?&page=3&province_id=37&ranktype=&school_type=&size=20&uri=apidata/api/gk/school/lists'
  9.     wb_data = requests.get(url, headers={'User-Agent':str(UserAgent().random)}).text
  10.     print(wb_data)
  11.     data = json.loads(wb_data)['data']['item']
  12.     print(data)
  13.     # print(data['data'].keys())
  14.     school_id = []
  15.     for i in data:
  16.         dic = {'school_id': i['school_id'], 'nature_name': i['nature_name'],
  17.                'city_name': i['city_name'], 'level_name': i['level_name'],
  18.                'name': i['name']}
  19.         school_id.append(dic)
  20.     print(school_id)
  21.     link = school_id
  22.     return link

  23. #根据不同的学校不同的年份获取不同的基本url
  24. def get_url(link):


  25.     for i in link:
  26.         id = i['school_id']
  27.         #它每一年的url构造是不一样的,这是我找到的规律,但是实际上很多都不一样,所以报错来求助了
  28.         for year in range(2017, 2022):
  29.             if year < 2020:
  30.                 url = f'https://static-data.gaokao.cn/www/2.0/schoolspecialindex/{year}/{id}/37/1/14/'
  31.             else:
  32.                 url= f'https://static-data.gaokao.cn/www/2.0/schoolspecialindex/{year}/{id}/37/3/1570/'
  33.             print(url)
  34.             get_content(url,i,year)


  35. #根据不同的url加上页数获取评论
  36. def get_content(url,i,year):
  37.     urlmax=url
  38.     print(url)
  39.     wb_data = requests.get(url+'1.json', headers={'User-Agent':str(UserAgent().random)}, timeout=2, verify=False).text
  40.     try:
  41.         #获取页数
  42.         page = math.ceil(int(json.loads(wb_data)['data']['numFound'] / 10))
  43.         #有的学校没有数据这里抛出异常
  44.     except:
  45.         page=0

  46.     print(page)
  47.     print(type(page))
  48.     #开始获取评论
  49.     for c_page in range(1, page+1):
  50.         print(urlmax+str(c_page)+'.json')
  51.         wb_data = requests.get(urlmax+str(c_page)+'.json', headers={'User-Agent':str(UserAgent().random)}, timeout=2, verify=False).text
  52.         sleep(6)
  53.         data = json.loads(wb_data)['data']['item']
  54.         for one in data:
  55.             dic = {'学校名称': i['name'], '专业': one['spname'], '层次': one['level1_name'], 'school_id': i['school_id'],
  56.                    '类型': i['nature_name'], '城市': i['city_name'], '年份': year, '最低分': one['min'],
  57.                    '最低排名': one['min_section'], '选课': one['sp_info']
  58.                    }
  59.             # print(one.keys())
  60.             # print(one)
  61.             # min=one['min']#最低分
  62.             # min_section=one['min_section']#最低录取分数线
  63.             # sp_info=one['sp_info']#选课
  64.             # level1_name=one['level1_name']#专科还是本科
  65.             # spname=one['spname']#专业名称
  66.             print(dic)
  67.             print("插入完成")

  68.             # col.insert_one(dic)
  69.             # break
  70.         # print(data.keys())



  71. if __name__ == '__main__':
  72.     link=get_id()
  73.     # link = [{'school_id': 2132, 'nature_name': '公办', 'city_name': '东营市', 'level_name': '普通本科', 'name': '山东石油化工学院'}]
  74.     # print(link)
  75.     get_url(link)
复制代码

代码应该是可以运行的,我已经让封了

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-29 00:00:09 | 显示全部楼层
爬取的网站是中国在线Education,https://www.gaokao.cn/
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-29 09:23:09 | 显示全部楼层
53清 发表于 2022-6-29 00:00
爬取的网站是中国在线Education,https://www.gaokao.cn/

这样可以把学校ID 都提取出来
  1. import requests,json

  2. url="https://static-gkcx.gaokao.cn/www/2.0/json/rank/22/lists.json"
  3. headers={
  4.      "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari",
  5. }
  6. res=requests.get(url,headers=headers)
  7. data=json.loads(res.text)["data"]
  8. for x in data:
  9.     for y in data[x]:
  10.         print(y["school_id"])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-29 12:28:05 | 显示全部楼层
wp231957 发表于 2022-6-29 09:23
这样可以把学校ID 都提取出来

主要是这个37/1/14会变
QQ截图20220629122656.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-6-29 12:34:42 | 显示全部楼层
53清 发表于 2022-6-29 12:28
主要是这个37/1/14会变

是在爬取评论数据的时候出现问题了,id什么的都获取过了,例子
https://static-data.gaokao.cn/ww ... 9/64/37/1/14/1.json,2019是年份,64是学校id,最后的1.json是页数,主要是37/1/14我不知道怎么来的,它有些学校是共用一个,我也获取了一些数据,但总是有不一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-1 09:13:36 | 显示全部楼层
53清 发表于 2022-6-29 12:34
是在爬取评论数据的时候出现问题了,id什么的都获取过了,例子
https://static-data.gaokao.cn/www/2.0/ ...

这里你用正则表达式,通配这几个变化的数字试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 02:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表