如何在 python 脚本中获取多个分页 api?

How to get a multiple pagination api in a python script?

我学习python,我想使用api。

我制作小程序来获取信息,并阻止我的下一个程序。

我想制作一个程序来抓取我学校 api 上的所有学生。

问题是限制分页,我有 15 个用户,但不是全部。

我在文档上搜索如何使用。

我尝试使用循环"for"和特定的 api 参数获取信息:

The Link HTTP response header contains pagination data with first,

previous, next and last raw pages links when available, under the

format

link: http://xxx.intra.xxx.fr/v2/{Resource}?page=X+1; rel="next",

http://xxx.intra.xxx.fr/v2/{Resource}?page=X-1; rel="prev",

http://xxx.intra.xxx.fr/v2/{Resource}?page=1; rel="first",

http://xxx.intra.xxx.fr/v2/{Resource}?page=X+n; rel="last"

问题,我不知道要抓取所有页面中的所有信息,而不仅仅是第一页。

我的程序代码:

import requests

import json

import sys

from sys import argv

from operator import itemgetter, attrgetter

import json 

import os





UID = 'REDACTED_USER_ID'

SECRET = 'REDACTED_SECRET_KEY'



class CONST(object):

 try:

   campus = sys.argv[1]

   month = sys.argv[2]

   year = sys.argv[3]

 except:

  print("Error : aucun argument")

  print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

  exit()



 d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}

 r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)

 token = r.json()['access_token']

 print(token)

 h = {'Authorization': 'Bearer ' + token}

 get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)



def __setattr__(self, *_):

  pass



CONST = CONST()



def campus_id(CAMPUS, MONTH, YEAR, *args):

  campus = CAMPUS

  if str.isnumeric(campus):

    return(campus)

  else:

    print("Error : campus_id requiert un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_month(CAMPUS, MONTH, YEAR, *args):

  month = MONTH

  if str.isalpha(month):

    return(month)

  else:

    print("Error : pool_month requiert un mois en lettre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_year(CAMPUS, MONTH, YEAR, *args):

  year = YEAR

  if str.isnumeric(year):

    return(year)

  else:

    print("Error : pool_year requiert au moins un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def get_infos(CAMPUS, MONTH, YEAR, *args):

  if len(argv) != 4:

    print('Wrongs arguments !')

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



  campus = campus_id(*argv[1:], *argv[2:], *argv[3:])

  month = pool_month(*argv[1:], *argv[2:], *argv[3:])

  year = pool_year(*argv[1:], *argv[2:], *argv[3:])

  get_level = CONST.get_students

# print(json.dumps(get_level.json(),indent=4))

  level = get_level.json()

  tab = []

  for item in level:

    tab.append(item['login'])

  chain = ' \

'.join(tab)

  fichier = open("test.out","w")

  fichier = open("test.out","a")

  fichier.write(chain +"\

")

  fichier.close()



if __name__ == '__main__':

  test = get_infos(*argv[1:], *argv[2:], *argv[3:])

  print(test)

for item in level:

  tab.append(item['login'])

> api-test python3 api-test3.py"1""september""2017"

> api-test 

> cat test.out

aaiche

abaille

abezanni

abouquet

acourtin

adfourca

adpusel
# ... earlier stuff

h = {'Authorization': 'Bearer ' + token}

params = {

  'filter[primary_campus_id]': campus,

  'filter[pool_month]': month,

  'filter[pool_year]': year,

  'sort': 'login'

}

get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)



# and so on ...
params = { ... } # as before

for page_idx in range(number_of_pages):

  params['page'] = page_idx

  get_students_page = requests.get(...)

  # combine the outputs somehow, but that depends on the response

# and so on...

代码:

import requests

import json

import sys

from sys import argv

from operator import itemgetter, attrgetter

import json 

import os





UID = 'REDACTED_USER_ID'

SECRET = 'REDACTED_SECRET_KEY'



class CONST(object):

 try:

   campus = sys.argv[1]

   month = sys.argv[2]

   year = sys.argv[3]

 except:

  print("Error : aucun argument")

  print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

  exit()



 d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}

 r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)

 token = r.json()['access_token']

 print(token)

 h = {'Authorization': 'Bearer ' + token}

 get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)



def __setattr__(self, *_):

  pass



CONST = CONST()



def campus_id(CAMPUS, MONTH, YEAR, *args):

  campus = CAMPUS

  if str.isnumeric(campus):

    return(campus)

  else:

    print("Error : campus_id requiert un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_month(CAMPUS, MONTH, YEAR, *args):

  month = MONTH

  if str.isalpha(month):

    return(month)

  else:

    print("Error : pool_month requiert un mois en lettre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_year(CAMPUS, MONTH, YEAR, *args):

  year = YEAR

  if str.isnumeric(year):

    return(year)

  else:

    print("Error : pool_year requiert au moins un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def get_infos(CAMPUS, MONTH, YEAR, *args):

  if len(argv) != 4:

    print('Wrongs arguments !')

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



  campus = campus_id(*argv[1:], *argv[2:], *argv[3:])

  month = pool_month(*argv[1:], *argv[2:], *argv[3:])

  year = pool_year(*argv[1:], *argv[2:], *argv[3:])

  get_level = CONST.get_students

# print(json.dumps(get_level.json(),indent=4))

  level = get_level.json()

  tab = []

  for item in level:

    tab.append(item['login'])

  chain = ' \

'.join(tab)

  fichier = open("test.out","w")

  fichier = open("test.out","a")

  fichier.write(chain +"\

")

  fichier.close()



if __name__ == '__main__':

  test = get_infos(*argv[1:], *argv[2:], *argv[3:])

  print(test)

for item in level:

  tab.append(item['login'])

> api-test python3 api-test3.py"1""september""2017"

> api-test 

> cat test.out

aaiche

abaille

abezanni

abouquet

acourtin

adfourca

adpusel
# ... earlier stuff

h = {'Authorization': 'Bearer ' + token}

params = {

  'filter[primary_campus_id]': campus,

  'filter[pool_month]': month,

  'filter[pool_year]': year,

  'sort': 'login'

}

get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)



# and so on ...
params = { ... } # as before

for page_idx in range(number_of_pages):

  params['page'] = page_idx

  get_students_page = requests.get(...)

  # combine the outputs somehow, but that depends on the response

# and so on...

是我找到的登录名的数组列表(例如:暂时我已经 "a" "b" "c" "d"),我想获取所有用户

控制台示例:

import requests

import json

import sys

from sys import argv

from operator import itemgetter, attrgetter

import json 

import os





UID = 'REDACTED_USER_ID'

SECRET = 'REDACTED_SECRET_KEY'



class CONST(object):

 try:

   campus = sys.argv[1]

   month = sys.argv[2]

   year = sys.argv[3]

 except:

  print("Error : aucun argument")

  print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

  exit()



 d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}

 r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)

 token = r.json()['access_token']

 print(token)

 h = {'Authorization': 'Bearer ' + token}

 get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)



def __setattr__(self, *_):

  pass



CONST = CONST()



def campus_id(CAMPUS, MONTH, YEAR, *args):

  campus = CAMPUS

  if str.isnumeric(campus):

    return(campus)

  else:

    print("Error : campus_id requiert un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_month(CAMPUS, MONTH, YEAR, *args):

  month = MONTH

  if str.isalpha(month):

    return(month)

  else:

    print("Error : pool_month requiert un mois en lettre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_year(CAMPUS, MONTH, YEAR, *args):

  year = YEAR

  if str.isnumeric(year):

    return(year)

  else:

    print("Error : pool_year requiert au moins un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def get_infos(CAMPUS, MONTH, YEAR, *args):

  if len(argv) != 4:

    print('Wrongs arguments !')

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



  campus = campus_id(*argv[1:], *argv[2:], *argv[3:])

  month = pool_month(*argv[1:], *argv[2:], *argv[3:])

  year = pool_year(*argv[1:], *argv[2:], *argv[3:])

  get_level = CONST.get_students

# print(json.dumps(get_level.json(),indent=4))

  level = get_level.json()

  tab = []

  for item in level:

    tab.append(item['login'])

  chain = ' \

'.join(tab)

  fichier = open("test.out","w")

  fichier = open("test.out","a")

  fichier.write(chain +"\

")

  fichier.close()



if __name__ == '__main__':

  test = get_infos(*argv[1:], *argv[2:], *argv[3:])

  print(test)

for item in level:

  tab.append(item['login'])

> api-test python3 api-test3.py"1""september""2017"

> api-test 

> cat test.out

aaiche

abaille

abezanni

abouquet

acourtin

adfourca

adpusel
# ... earlier stuff

h = {'Authorization': 'Bearer ' + token}

params = {

  'filter[primary_campus_id]': campus,

  'filter[pool_month]': month,

  'filter[pool_year]': year,

  'sort': 'login'

}

get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)



# and so on ...
params = { ... } # as before

for page_idx in range(number_of_pages):

  params['page'] = page_idx

  get_students_page = requests.get(...)

  # combine the outputs somehow, but that depends on the response

# and so on...

使用 requests.get 函数,您应该在 params 关键字参数中传递查询参数。

所以你会想要像

这样的东西

import requests

import json

import sys

from sys import argv

from operator import itemgetter, attrgetter

import json 

import os





UID = 'REDACTED_USER_ID'

SECRET = 'REDACTED_SECRET_KEY'



class CONST(object):

 try:

   campus = sys.argv[1]

   month = sys.argv[2]

   year = sys.argv[3]

 except:

  print("Error : aucun argument")

  print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

  exit()



 d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}

 r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)

 token = r.json()['access_token']

 print(token)

 h = {'Authorization': 'Bearer ' + token}

 get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)



def __setattr__(self, *_):

  pass



CONST = CONST()



def campus_id(CAMPUS, MONTH, YEAR, *args):

  campus = CAMPUS

  if str.isnumeric(campus):

    return(campus)

  else:

    print("Error : campus_id requiert un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_month(CAMPUS, MONTH, YEAR, *args):

  month = MONTH

  if str.isalpha(month):

    return(month)

  else:

    print("Error : pool_month requiert un mois en lettre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_year(CAMPUS, MONTH, YEAR, *args):

  year = YEAR

  if str.isnumeric(year):

    return(year)

  else:

    print("Error : pool_year requiert au moins un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def get_infos(CAMPUS, MONTH, YEAR, *args):

  if len(argv) != 4:

    print('Wrongs arguments !')

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



  campus = campus_id(*argv[1:], *argv[2:], *argv[3:])

  month = pool_month(*argv[1:], *argv[2:], *argv[3:])

  year = pool_year(*argv[1:], *argv[2:], *argv[3:])

  get_level = CONST.get_students

# print(json.dumps(get_level.json(),indent=4))

  level = get_level.json()

  tab = []

  for item in level:

    tab.append(item['login'])

  chain = ' \

'.join(tab)

  fichier = open("test.out","w")

  fichier = open("test.out","a")

  fichier.write(chain +"\

")

  fichier.close()



if __name__ == '__main__':

  test = get_infos(*argv[1:], *argv[2:], *argv[3:])

  print(test)

for item in level:

  tab.append(item['login'])

> api-test python3 api-test3.py"1""september""2017"

> api-test 

> cat test.out

aaiche

abaille

abezanni

abouquet

acourtin

adfourca

adpusel
# ... earlier stuff

h = {'Authorization': 'Bearer ' + token}

params = {

  'filter[primary_campus_id]': campus,

  'filter[pool_month]': month,

  'filter[pool_year]': year,

  'sort': 'login'

}

get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)



# and so on ...
params = { ... } # as before

for page_idx in range(number_of_pages):

  params['page'] = page_idx

  get_students_page = requests.get(...)

  # combine the outputs somehow, but that depends on the response

# and so on...

要特别回答您的分页问题,??您需要在 params 字典中添加一个额外的 page 参数。所以你可以添加一个循环

import requests

import json

import sys

from sys import argv

from operator import itemgetter, attrgetter

import json 

import os





UID = 'REDACTED_USER_ID'

SECRET = 'REDACTED_SECRET_KEY'



class CONST(object):

 try:

   campus = sys.argv[1]

   month = sys.argv[2]

   year = sys.argv[3]

 except:

  print("Error : aucun argument")

  print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

  exit()



 d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}

 r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)

 token = r.json()['access_token']

 print(token)

 h = {'Authorization': 'Bearer ' + token}

 get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)



def __setattr__(self, *_):

  pass



CONST = CONST()



def campus_id(CAMPUS, MONTH, YEAR, *args):

  campus = CAMPUS

  if str.isnumeric(campus):

    return(campus)

  else:

    print("Error : campus_id requiert un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_month(CAMPUS, MONTH, YEAR, *args):

  month = MONTH

  if str.isalpha(month):

    return(month)

  else:

    print("Error : pool_month requiert un mois en lettre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def pool_year(CAMPUS, MONTH, YEAR, *args):

  year = YEAR

  if str.isnumeric(year):

    return(year)

  else:

    print("Error : pool_year requiert au moins un chiffre")

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



def get_infos(CAMPUS, MONTH, YEAR, *args):

  if len(argv) != 4:

    print('Wrongs arguments !')

    print('Usage:"campus_id" (EX:1)"month" (july)"year" (2016)')

    exit()



  campus = campus_id(*argv[1:], *argv[2:], *argv[3:])

  month = pool_month(*argv[1:], *argv[2:], *argv[3:])

  year = pool_year(*argv[1:], *argv[2:], *argv[3:])

  get_level = CONST.get_students

# print(json.dumps(get_level.json(),indent=4))

  level = get_level.json()

  tab = []

  for item in level:

    tab.append(item['login'])

  chain = ' \

'.join(tab)

  fichier = open("test.out","w")

  fichier = open("test.out","a")

  fichier.write(chain +"\

")

  fichier.close()



if __name__ == '__main__':

  test = get_infos(*argv[1:], *argv[2:], *argv[3:])

  print(test)

for item in level:

  tab.append(item['login'])

> api-test python3 api-test3.py"1""september""2017"

> api-test 

> cat test.out

aaiche

abaille

abezanni

abouquet

acourtin

adfourca

adpusel
# ... earlier stuff

h = {'Authorization': 'Bearer ' + token}

params = {

  'filter[primary_campus_id]': campus,

  'filter[pool_month]': month,

  'filter[pool_year]': year,

  'sort': 'login'

}

get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)



# and so on ...
params = { ... } # as before

for page_idx in range(number_of_pages):

  params['page'] = page_idx

  get_students_page = requests.get(...)

  # combine the outputs somehow, but that depends on the response

# and so on...

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161