Skip to content

Commit df84da0

Browse files
authored
fix: handle NCBI rate limit (#407) (#406)
fix: handle NCBI rate limit
1 parent 769e23c commit df84da0

File tree

1 file changed

+18
-1
lines changed
  • catalog/build/py/package/catalog_build

1 file changed

+18
-1
lines changed

catalog/build/py/package/catalog_build/build.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import requests
44
import urllib
55
import time
6+
from functools import partial
67
from bs4 import BeautifulSoup
78
import logging
89

@@ -11,6 +12,21 @@
1112
log = logging.getLogger(__name__)
1213

1314

15+
def rate_limit_handler(request_call):
16+
try:
17+
response = request_call()
18+
response.raise_for_status()
19+
return response
20+
except requests.HTTPError:
21+
if response.status_code == 429:
22+
retry_after = int(response.headers.get("Retry-After"))
23+
print(f"Rate limited, waiting {retry_after} seconds")
24+
time.sleep(retry_after)
25+
response = request_call()
26+
response.raise_for_status()
27+
return response
28+
raise
29+
1430
def read_assemblies(assemblies_path):
1531
with open(assemblies_path) as stream:
1632
return pd.DataFrame(yaml.safe_load(stream)["assemblies"])
@@ -23,7 +39,8 @@ def get_paginated_ncbi_results(base_url, query_description):
2339
while next_page_token or page == 1:
2440
print(f"Requesting page {page} of {query_description}")
2541
request_url = f"{base_url}?page_size=1000{"&page_token=" + next_page_token if next_page_token else ""}"
26-
page_data = requests.get(request_url).json()
42+
response = rate_limit_handler(partial(requests.get, request_url))
43+
page_data = response.json()
2744
if len(page_data["reports"][0].get("errors", [])) > 0:
2845
raise Exception(page_data["reports"][0])
2946
results += page_data["reports"]

0 commit comments

Comments
 (0)