Skip to content

Instantly share code, notes, and snippets.

@victorbordo
Last active January 17, 2024 07:42
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save victorbordo/5581fdfb89ed93bf3eb2b478529b9e38 to your computer and use it in GitHub Desktop.
Save victorbordo/5581fdfb89ed93bf3eb2b478529b9e38 to your computer and use it in GitHub Desktop.
Paginate through a Github API request with Python requests
import requests
import logging
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
GITHUB_TOKEN = None
GITHUB_AUTH_HEADER = {
'authorization': "token {0}".format(GITHUB_TOKEN), # Add Github token
}
def search_github():
session = requests.Session()
url = "https://api.github.com/search/code?per_page=100"
querystring = {"q":"filename:FUNDING.yml","type":"Code"}
first_page = session.get(url, params=querystring, headers=GITHUB_AUTH_HEADER)
yield first_page
next_page = first_page
while get_next_page(next_page) is not None:
try:
next_page_url = next_page.links['next']['url']
next_page = session.get(next_page_url, params=querystring, headers=GITHUB_AUTH_HEADER)
yield next_page
except KeyError:
logging.info("No more Github pages")
break
def get_next_page(page):
return page if page.headers.get('link') != None else None
# Iterate through pages
for page in search_github():
print(page)
@rustymagnet3000
Copy link

Great stuff.
Maybe you could remove the except KeyError and use:

while resp.links.get('next', None) is not None:

@JelsB
Copy link

JelsB commented Jan 18, 2023

Thanks for the gist! I was looking for something like too.

@chandan-cordova
Copy link

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment