Last active
January 17, 2024 07:42
-
-
Save victorbordo/5581fdfb89ed93bf3eb2b478529b9e38 to your computer and use it in GitHub Desktop.
Paginate through a Github API request with Python requests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Thanks for the gist! I was looking for something like too.
Thank you!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Great stuff.
Maybe you could remove the
except KeyError
and use:while resp.links.get('next', None) is not None: