Je consomme (via urllib
/urllib2
) une API qui renvoie des résultats XML. L'API retourne toujours le total_hit_count pour ma requête, mais me permet seulement de récupérer les résultats par lots de, disons, 100 ou 1000. L'API stipule que j'ai besoin de spécifier start_pos et end_pos pour compenser ceci, afin de parcourir les résultats.Pagination de requêtes vers une API
Dites que la requête urllib ressemble à http://someservice?query='test'&start_pos=X&end_pos=Y
.
Si j'envoie une requête initiale de 'taster' avec le transfert de données le plus bas tel que http://someservice?query='test'&start_pos=1&end_pos=1
afin de récupérer un résultat de, pour conjecture, total_hits = 1234
, je voudrais élaborer une approche pour demander plus proprement ces 1234 résultats en lots de, disons encore, 100 ou 1000 ou ...
C'est ce que j'ai trouvé jusqu'à présent, et cela semble fonctionner, mais j'aimerais savoir si vous auriez fait les choses différemment ou si Je pourrais améliorer à ce sujet:
hits_per_page=100 # or 1000 or 200 or whatever, adjustable
total_hits = 1234 # retreived with BSoup from 'taster query'
base_url = "http://someservice?query='test'"
startdoc_positions = [n for n in range(1, total_hits, hits_per_page)]
enddoc_positions = [startdoc_position + hits_per_page - 1 for startdoc_position in startdoc_positions]
for start, end in zip(startdoc_positions, enddoc_positions):
if end > total_hits:
end = total_hits
print "url to request is:\n ",
print "%s&start_pos=%s&end_pos=%s" % (base_url, start, end)
ps Je suis un consommateur de longue date de StackOverflow, en particulier les questions Python, mais c'est ma première question postée. Vous êtes génial.
Une tranche d'or frit, merci. Je retire mon chapeau. Maintenant, comment puis-je "virtuellement" enlever mon chapeau à votre excellente contribution? – craigs
L'upvote était un bon début ;-) –