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