tweepy: получить все упоминания с помощью api.search, используя max_id и since_id - PullRequest
0 голосов
/ 09 сентября 2018

Я перешел по этой ссылке здесь, чтобы получить все твиты, в которых упоминается определенный запрос. Пока код работает отлично, я просто хочу убедиться, что я действительно что-то понимаю, так как я не хочу использовать какой-то код, даже если я даже не знаю, как он делает то, что делает. Это мой соответствующий код:

def searchMentions (tweetCount, maxTweets, searchQuery, tweetsPerQry, max_id, sinceId) :

while tweetCount < maxTweets:

    if (not max_id):

        if (not sinceId):

            new_tweets = api.search(q=searchQuery, count=tweetsPerQry)

        else:
            new_tweets = api.search(q=searchQuery, count = tweetsPerQry, since_id = sinceId)

    else: 

        if (not sinceId):

            new_tweets = api.search(q=searchQuery, count= tweetsPerQry, max_id=str(max_id -1))

        else:
            new_tweets = api.search(q=searchQuery, count=tweetsPerQry, max_id=str(max_id -1), since_id=sinceId)

    if not new_tweets:
        print("No new tweets to show")
        break

    for tweet in new_tweets :

        try :
            tweetCount += len(new_tweets)
            max_id = new_tweets[-1].id

            tweetId = tweet.user.id
            username = tweet.user.screen_name
            api.update_status(tweet.text)
            print(tweet.text)

        except tweepy.TweepError as e:
            print(e.reason)

        except StopIteration:
            pass

max_id и sinceId установлены на None, поскольку, я полагаю, твиты еще не найдены. tweetCount установлен в ноль. Насколько я понимаю, цикл while работает, пока tweetCount < maxTweets. Я не совсем уверен, почему это так и почему я не могу использовать while True, например. Сначала я подумал, может быть, это связано со скоростью звонков API, но это не имеет смысла.

После этого функция проверяет max_id и sinceId. Я предполагаю, что он проверяет, есть ли уже max_id, и если max_id не равен ни одному, он проверяет, поскольку SinceId. Если SinceId равен none, он просто получает сколько угодно твитов, для которых установлен параметр count, в противном случае он устанавливает нижнюю границу для SinceId и получает сколько твитов, для которых установлен параметр count, начиная с sinceId. Если max_id не равно none, но, так как посколькуIId имеет значение «нет», верхний предел устанавливается равным max_id и получает определенное количество твитов до и после этой границы. Таким образом, если бы у вас были твиты с идентификаторами 1,2,3,4,5 и с count = 3 и max_id = 5, вы получите твиты 3,4,5. В противном случае он устанавливает нижнюю границу с SinceId, а верхнюю границу на max_id и получает твиты "между". Найденные твиты сохраняются в новых твитах.

Теперь функция перебирает все твиты в new_tweets и устанавливает tweetCount в длину этого списка. Тогда max_id устанавливается на new_tweets[-1].id. Так как в твиттере указано, что max_id является включающим, я предполагаю, что он установлен для следующего твита перед последним твитом, поэтому твиты не повторяются, однако я не уверен в этом и не понимаю, как моя функция узнает, что идентификатор перед последним твитом может быть. Публикуется твит, повторяющий то, что сказано в твиттере new_tweets. Итак, подведем итог, мои вопросы:

  1. Могу ли я сделать while True вместо while tweetCount < maxTweets и если нет, то почему?
  2. Правильно ли я объяснил функцию, если нет, то где я ошибся?
  3. Что делает max_id = new_tweets[-1].id точно?
  4. Почему мы не устанавливаем sinceId на новое значение в цикле for? Поскольку вначале для IDI задано значение «Нет», кажется, что нет необходимости просматривать параметры, поскольку в качестве значения «Идентификатор» не задано значение «Нет», если мы нигде не меняем значение.

В качестве отказа от ответственности: я прочитал твиттеры объяснение объяснение max_id, since_id, count и т. Д., Но оно не ответило на мои вопросы.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Несколько месяцев назад я использовал ту же ссылку для API поиска. Я пришел к пониманию нескольких вещей, которые могут вам помочь. Я предположил, что API возвращает твиты упорядоченным образом (по убыванию tweet_id).

Предположим, у нас есть куча твитов, которые твиттер предоставляет нам для запроса, с идентификаторами твитов от 1 до 10 (1 - самый старый, а 10 - самый новый).

1 2 3 4 5 6 7 8 9 10

since_id = нижняя граница и max_id = верхняя граница

Твиттер начинает возвращать твиты в порядке от самых новых до самых старых (от 10 до 1). Давайте рассмотрим несколько примеров:

# This would return tweets having id between 4 and 10 ( 4 and 10 inclusive )    
since_id=4,max_id=10

# This means there is no lower bound, and we will receive as many 
# tweets as the Twitter Search API permits for the free version ( i.e. for the last 7 
# days ). Hence, we will get tweets with id 1 to 10 ( 1 and 10 inclusive )
since_id=None, max_id=10

Что именно делает max_id = new_tweets [-1] .id?

Предположим, что в первом вызове API мы получили только 4 твита, т. Е. 10, 9, 8, 7. Таким образом, список new_tweets становится (я предполагаю, что это список идентификаторов для целей объяснения, это на самом деле список объектов):

new_tweets=[10,9,8,7] 
max_id= new_tweets[-1]   # max_id = 7

Теперь, когда наша программа использует API во второй раз:

max_id = 7
since_id = None

new_tweets = api.search (q = searchQuery, count = tweetsPerQry, max_id = str (max_id -1), since_id = sinceId)

# We will receive all tweets from 6 to 1 now.
max_id = 6  # max_id=str(max_id -1)
#Therefore
new_tweets = [6,5,4,3,2,1]

Этот способ использования API (как упомянуто в ссылке) может возвращать максимум 100 твитов за каждый вызов API, который мы делаем. Фактическое количество возвращаемых твитов меньше 100, а также зависит от сложности вашего запроса: чем сложнее, тем лучше .

Почему мы не устанавливаем sinceId на новое значение в цикле for? Поскольку вначале для IDI задано значение «Нет», кажется, что нет необходимости просматривать параметры, поскольку в качестве значения «Идентификатор» не задано значение «Нет», если мы нигде не меняем значение.

Установка SinceId = None возвращает самый старый из твитов, но я не уверен, какое значение по умолчанию для SinceId, если мы не упомянем его.

Могу ли я делать, пока True, а не tweetCount

Вы можете сделать это, но затем вам нужно обработать исключения, которые вы получите при достижении ограничения скорости (т. Е. 100 твитов за звонок). Использование этого облегчает обработку программы.

Надеюсь, это поможет вам.

0 голосов
/ 09 сентября 2018

Могу ли я делать, пока True, а не tweetCount

Прошло много времени с тех пор, как я использовал Twitter API, но если я правильно помню, у вас ограниченное количество звонков и твитов за час. Это делается для того, чтобы Twitter был относительно чистым. Я помню, что maxTweets должен быть суммой, которую вы хотите получить. Вот почему вы, вероятно, не захотите использовать while True, но я считаю, что вы можете заменить его без проблем. В конце концов вы получите исключение, которое будет API, сообщающим вам, что вы достигли максимальной суммы.

Что именно делает max_id = new_tweets [-1] .id?

У каждого твита есть идентификатор, который вы видите в URL, когда открываете его. Вы используете его для ссылки на конкретный твит в вашем коде. То, что делает этот код, обновляет идентификатор последнего твита в возвращенном списке до идентификатора вашего последнего твита. (в основном обновить переменную). Помните, что вызов отрицательных индексов относится к элементам с конца списка и обратно.

Я не уверен на 100% в ваших двух других вопросах, я отредактирую позже, если найду что-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...