Python запрашивает аргументы/обрабатывает апигментацию
Я играю с API-интерфейсом Angel List (AL) и хочу вытащить все задания в Сан-Франциско.
Поскольку я не смог найти активную оболочку Python для api (если я сделаю какой-то прогресс, я думаю, что хотел бы сделать свой собственный), я использую библиотеку запросов.
Результаты AL API разбиты на страницы, и я не могу понять, как выйти за первую страницу результатов.
Вот мой код:
import requests
r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs").json()
r_sanfran.keys()
# returns [u'per_page', u'last_page', u'total', u'jobs', u'page']
r_sanfran['last_page']
#returns 16
r_sanfran['page']
# returns 1
Я попытался добавить аргументы к requests.get
, но это не сработало. Я также попробовал что-то действительно тупое - изменение значения клавиши "страница", как это было волшебным образом, для меня разбито на страницы.
например. r_sanfran['page'] = 2
Я предполагаю, что это нечто относительно простое, но я не могу понять, что любая помощь была бы потрясающей.
Спасибо, как всегда.
Документация API списка Ангелов, если это полезно.
Ответы
Ответ 1
Прочитайте last_page
и сделайте запрос на получение каждой страницы в диапазоне:
import requests
r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs").json()
num_pages = r_sanfran['last_page']
for page in range(2, num_pages + 1):
r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs", params={'page': page}).json()
print r_sanfran['page']
# TODO: extract the data
Ответ 2
Улучшение ответа @alecxe: если вы используете Python Generator и HTTP-сеанс запросов, вы можете улучшить производительность и использование ресурсов, если запрашиваете много страниц или очень большие страницы.
import requests
session = requests.Session()
def get_jobs():
url = "https://api.angel.co/1/tags/1664/jobs"
first_page = session.get(url).json()
yield first_page
num_pages = first_page['last_page']
for page in range(2, num_pages + 1):
next_page = session.get(url, params={'page': page}).json()
yield next_page
for page in get_jobs():
# TODO: process the page
Ответ 3
Я столкнулся со сценарием, где API не возвращает страницы, а скорее мин/макс. Я создал это, и я думаю, что это будет работать для обеих ситуаций. Это автоматически увеличит приращение до конца, а затем остановит цикл while.
max_version = [1]
while len(max_version) > 0:
r = requests.get(url, headers=headers, params={"page": max_version[0]}).json()
next_page = r['page']
if next_page is not None:
max_version[0] = next_page
Process data...
else:
max_version.clear() # Stop the while loop