Проблема с циклом Python While — API Instagram возвращает объекты разбивки на страницы, но не новые результаты

#python #while-loop #instagram

#python #цикл while #Instagram

Вопрос:

Я пытаюсь извлечь список сообщений Instagram, которые были помечены определенным хэштегом. Я использую RAPIDAPI, найденный здесь. Instagram разбивает возвращаемые результаты на страницы, поэтому мне приходится перебирать страницы, чтобы получить все результаты. Я сталкиваюсь с очень странной ошибкой / ошибкой, когда я получаю следующую страницу в соответствии с запросом, но сообщения взяты с предыдущей страницы.

Чтобы использовать аналогию с книгой, я могу видеть страницу 1 книги, и я могу попросить книгу показать мне страницу 2. Книга показывает мне страницу с надписью page 2, но содержимое страницы совпадает со страницей 1.

Используя контейнер, предоставляемый веб-сайтом RapidAPI, я не сталкиваюсь с этой ошибкой. Это наводит меня на мысль, что проблема должна быть на моем конце, предположительно в цикле while, который я написал.

Если бы кто-нибудь мог просмотреть мой цикл ‘while’ или предложить что-нибудь еще, что могло бы исправить проблему, я был бы очень признателен. Список ошибок диапазона индексов внизу легко исправим, поэтому меня это не беспокоит.

Другая информация: этот конкретный хэштег содержит 694 результата, а API возвращает страницу, содержащую 50 элементов результатов.

 import http.client
import json
import time


conn = http.client.HTTPSConnection("instagram-data1.p.rapidapi.com") #endpoint supplied by RAPIDAPI
##Begin Credential Section
headers = {
    'x-rapidapi-key': "*removed*",
    'x-rapidapi-host': "instagram-data1.p.rapidapi.com"
    }
##End Credential Section
hashtag = 'givingtuesdayaus'

conn.request("GET", "/hashtag/feed?hashtag="   hashtag, headers=headers)

res = conn.getresponse()
data = res.read()
print(data.decode("utf-8")) #Purely for debugging, can be disabled
json_dictionary = json.loads(data.decode("utf-8")) #Saving returned results into JSON format, because I find it easier to work with
i = 1 # Results need to cycle through pages, using 'i' to track the number of loops and for input in the name of the file which is saved
with open(hashtag   str(i)   '.json', 'w') as json_file:
    json.dump(json_dictionary['collector'], json_file)

#JSON_dictionary contains five fields, 'count' which is number of results for hashtag query, 'has_more' boolean indicating if there are additional pages
# 'end_cursor' string which can be added to the url to cycle to the next page, 'collector' list containing post information, and 'len'

#while loop essentially checks if the 'has_more' indicates there are additional pages, if true uses the 'end_cursor' value to cycle to the next page
while json_dictionary['has_more']:
    time.sleep(1)
    cursor = json_dictionary['end_cursor']
    conn.request("GET", "/hashtag/feed?hashtag="   hashtag  'amp;end-cursor='   cursor, headers=headers)
    res = conn.getresponse()
    data = res.read()
    json_dictionary = json.loads(data.decode("utf-8"))
    i  = 1
    print(i)
    print(json_dictionary['collector'][1]['id'])
    print(cursor) #these three prints rows are only used for debugging.
    with open(hashtag   str(i)   '.json', 'w') as json_file:
        json.dump(json_dictionary['collector'], json_file)
 

Результаты из консоли python: (Как вы можете видеть, курсор и «i» перемещаются, но идентификатор записи остается прежним. Все сохраненные файлы JSON также содержат одни и те же сообщения.

 > {"count":694,"has_more":true,"end_cursor":"QVFCd2pVdEN2d01rNkw3UmRKSGVUN1EyanBlYzBPMS15MkIyUG1VdHhjWlJWMDBwRmVhaEYxd0czSE0wMktFcGhfMnItak5ZOE1GTzJvd05FU0pTMWxmVg==","collector":[{"id":"2467140087692742224","shortcode":"CI9CtaaDU5Q","type":"GraphImage",.....}
> #shortened by poster 2 2464906276234990574 QVFCd2pVdEN2d01rNkw3UmRKSGVUN1EyanBlYzBPMS15MkIyUG1VdHhjWlJWMDBwRmVhaEYxd0czSE0wMktFcGhfMnItak5ZOE1GTzJvd05FU0pTMWxmVg==
> 3 2464906276234990574
> QVFDVUlROFVKVVB3SEwyR05MSzJHZ2V1UXZqSzlzTVFhWDNBM3hXNENMcThKWExwWU90RFRnRm1FNWtSRGtrbTdORFIwRlU2QWZaSVByOHZhSXFnQnJsVg==
> 4 2464906276234990574
> QVFEVFpheV9SeFZCcWlKYkc3NUZZdG00Rk5KMWJsQVBNakJlZDcyMGlTWm9rUTlIQzRoYjVtTU1uRmhJZG5TTFBSOXdhbHozVUViUjZEbVpLdjVUQlJtVQ==
> Traceback (most recent call last):   File "<input>", line 33, in
> <module> IndexError: list index out of range
 

Ответ №1:

Я вижу, что вы разбиваете список списков, просто вы берете список списков больше, чем список списков

пример:

данные = [1,2,3,4,5]

Вы должны предоставить список чисел

данные [4]

не так

данные [6]

Вы допустили ошибку

Ошибка IndexError: индекс списка выходит за пределы диапазона

возможно, это неправильно

 print(json_dictionary['collector'][1]['id'])
print(cursor) #these three prints rows are only used for debugging.
with open(hashtag   str(i)   '.json', 'w') as json_file:
    json.dump(json_dictionary['collector'], json_file)
 

Ответ №2:

Прошу прощения у всех, кто дочитал до этого места, я идиот.

Я обнаружил ошибку вскоре после публикации:

 conn.request("GET", "/hashtag/feed?hashtag="   hashtag  'amp;end-cursor='   cursor, headers=headers)
 

‘end-cursor’ должен быть ‘end_cursor’.