[PYTHON] Ich kann den Parameter "next_results" nicht in der Twitter API Search API verwenden! ?? Ursachen und Abhilfemaßnahmen

Ich war süchtig danach, Tweets mit der Twitter-API Search API zu sammeln. !! Es gibt eine Falle an einem unerwarteten Ort ...

Informationen zur Twitter-Such-API

Dieses Mal habe ich die Such-API verwendet, um Tweets abzurufen. Eine kurze Zusammenfassung der Such-API-Spezifikationen.

Es gibt drei Arten von Such-APIs. --Standard Search API (kostenlos) --Primium Search API (kostenpflichtig)

Dieses Mal verwenden wir die Standardsuch-API, die kostenlos verwendet werden kann.

Funktionen der Standardsuch-API

Parameter anfordern

Parameter Erläuterung Bemerkungen
q Suchanfrage (erforderlich) Eine Suche ähnlich der Tweet-Suche auf Twitter ist möglich, nur Zeichenketten sind möglich
geocode Wo du getwittert hast Angegeben durch Breite, Länge, Radius
lang Angabe der Sprache des Tweets
locale Abfragesprachenspezifikation Derzeit auf JapanischjaNur gültig
result_type Geben Sie den Typ des erfassten Tweets an recentDann der neueste Tweet,popularDann beliebte Tweets,mixedDann beides
count Geben Sie die Anzahl der Akquisitionen an Der Standardwert ist 15 und das Maximum ist 100.
until Angabe der Tweet-Zeit YYYY-MM-Holen Sie sich Tweets vor DD (kann nicht vor 7 Tagen bekommen)
since_id ID-Wertspezifikation Holen Sie sich Tweets mit ID-Werten, die größer als der angegebene ID-Wert sind
max_id ID-Wertspezifikation Holen Sie sich Tweets mit ID-Werten, die kleiner als der angegebene ID-Wert sind
include_entities entitiesMit oder ohne falseWenn Sie angeben, erhalten Sie Tweets ohne Entitätsinformationen

Antwortparameter

Parameter Erläuterung Bemerkungen
statuses Liste der Tweets Das Tweet-Objekt wird in einer Liste gespeichert
search_metadata Metadaten suchen Enthält Suchmetadaten

Antwortbeispiel

python


{
  "statuses": [
(Weggelassen, weil es sich um ein Tweet-Objekt handelt),
    ...
  ],
  "search_metadata": {
    "max_id": 250126199840518145,
    "since_id": 24012619984051000,
    "refresh_url": "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1",
    "next_results": "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed",
    "count": 4,
    "completed_in": 0.035,
    "since_id_str": "24012619984051000",
    "query": "%23freebandnames",
    "max_id_str": "250126199840518145"
  }
}

Auftreten eines Problems

Hintergrund

Ich habe versucht, viele Tweets mit dem Hashtag "# Qiita" zu sammeln.

Die Standardsuch-API kann jedoch nur bis zu 100 Tweets in einer einzigen Anforderung abrufen. Daher habe ich versucht, 1000 Tweets zu erhalten, indem ich die API rekursiv mithilfe des Anforderungsparameters "next_results" aufgerufen habe. Eine Abfrage wird in "next_results" gespeichert. Wenn Sie diese Abfrage ausführen, können Sie den 101. und die nachfolgenden Tweets abrufen. Mit anderen Worten

Anfrage-> Antwort-> Parse next_results-> Gehe zum nächsten Anforderungsparameter-> Anfrage-> ...

Ich werde es tun, bis ich 1000 Fälle bekomme.

(Referenz: Mehr als 100 Tweets mit Twitter API Search / Tweets (PHP) abrufen)

** Anfragen werden jedoch nur dreimal ausgeführt ** und es können nur 200 Tweets aufgenommen werden! (Die Anzahl der erfassten Tweets beträgt in der dritten Antwort 0) Obwohl es eindeutig über 200 Tweets gibt ...

Programm

Der Code wurde in Python geschrieben. Darüber hinaus sind verschiedene API-Schlüssel in Umgebungsvariablen registriert.

get_tweet.py


from requests_oauthlib import OAuth1Session
import os
import json

#Installation des API-Schlüssels
CONSUMER_KEY = XXXXXXXXXXXXXXXXXXXXXX #API key 
CONSUMER_SECRET = XXXXXXXXXXXXXXXXXXXXXX #API secret
ACCESS_TOKEN = XXXXXXXXXXXXXXXXXXXXXX
ACCESS_SECRET = XXXXXXXXXXXXXXXXXXXXXX

#URL zum Abrufen von Tweets
SEARCH_URL = 'https://api.twitter.com/1.1/search/tweets.json'


def search(params):
    twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET)
    req = twitter.get(SEARCH_URL, params = params)
    tweets = json.loads(req.text)
    return tweets

#In PHP analysieren_Anstelle der str-Funktion
def parseToParam(parse_str, parse=None):
    if parse is None:
        parse = '&'
    return_params = {}
    parsed_str = parse_str.split(parse)
    for param_string in parsed_str:
        param, value = param_string.split('=', 1)
        return_params[param] = value
    return return_params

def main():
    search_word = '#Qiita'
    tweet_data = []

    # Tweet Search
    params = {
                'q'  : search_word,
            'count'  : 100,
             }
    tweet_count = 0

    while tweet_count < 1000:
        tweets = search(params)
        for tweet in tweets['statuses']:
            tweet_data.append(tweet)
        # tweets['search_metadata']['next_results']Parse to param
        if 'next_results' in tweets['search_metadata'].keys():
            next_results = tweets['search_metadata']['next_results']
            next_results = next_results.lstrip('?') #Am Anfang?Löschen
            params = parseToParam(next_results)
            tweet_count += len(tweets['statuses'])
        else:
            break

if __name__=='__main__':
    main()

Untersuchung der Ursache

Da der Antwortparameter "next_results" für den nächsten Anforderungsparameter verwendet wird,

Überprüfen Sie die Anforderungs- und Antwortparameter

Erstes Mal Parameter anfordern

{
  'q'    : '#Qiita',
  'count': 100
}

Antwortparameter next_results

?max_id=1250763045871079425&q=%23Qiita&count=100&include_entities=1

Zweites Mal Parameter anfordern

{
 'max_id': '1250763045871079425', 
  'q'    : '%23Qiita',
  'count': 100,
  'include_entities': '1'
}

Antwortparameter next_results

?max_id=1250673475351572480&q=%2523Qiita&count=100&include_entities=1

Drittes Mal Parameter anfordern

{
 'max_id': '1250673475351572480', 
  'q'    : '%2523Qiita',
  'count': 100,
  'include_entities': '1'
}

Antwortparameter next_results

None

Umfrageergebnisse

Anscheinend wird dieselbe Abfrage ursprünglich vererbt #Qiita%23Qiita%2523Qiita Es scheint, dass sich die Abfrage ändert.

# Qiita und% 23Qiita sind durch URL-Codierung miteinander kompatibel, aber% 2523Qiita ist eine völlig andere Abfrage. (Sie können dies überprüfen, indem Sie versuchen, unter hier zu codieren / decodieren.)

Das ist, Es scheint, dass die Ursache des Problems darin besteht, dass **% im Prozess von % 23Qiita% 2523Qiita dekodiert ** wird.

Lösung

Ersetzen Sie nach dem Parsen des Antwortparameters next_results **% 25 im Anforderungsparameter durch% **.

Programmänderung

Parameterersatzverarbeitung in der while-Anweisung hinzugefügt

get_tweet.py


    while tweet_count < 1000:
        tweets = search(params)
        for tweet in tweets['statuses']:
            tweet_data.append(tweet)
        # tweets['search_metadata']['next_results']Parse to param
        if 'next_results' in tweets['search_metadata'].keys():
            next_results = tweets['search_metadata']['next_results']
            next_results = next_results.lstrip('?') #Am Anfang?Löschen
            params = parseToParam(next_results)
            # %25 Ersatzprozesse hinzugefügt
            params['q'] = params['q'].replace('%25', '%') 
            tweet_count += len(tweets['statuses'])
        else:
            break

Zusammenfassung

In der Abfrage "q", die im Antwortparameter "next_results" enthalten ist, wurde% nach der URL-Codierung extra codiert. Infolgedessen funktionierte die Vererbung von Abfragen nicht und es gab ein Problem beim Abrufen von Tweets.

Die Lösung bestand darin, das extracodierte% in next_results mit String-Ersetzung wiederherzustellen.

Referenz

Offizielle Dokumentation der Twitter API https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets Twitter-Entwicklerdokument Japanische Übersetzung http://westplain.sakuraweb.com/translate/twitter/Documentation/REST-APIs/Public-API/GET-search-tweets.cgi Holen Sie sich über 100 Tweets mit Twitter API Search / Tweets (PHP) https://blog.apar.jp/php/3007/ URL-Codierung / -Decodierung https://tech-unlimited.com/urlencode.html

Recommended Posts

Ich kann den Parameter "next_results" nicht in der Twitter API Search API verwenden! ?? Ursachen und Abhilfemaßnahmen
Ich kann den Darknet-Befehl in Google Colaboratory nicht verwenden!
Greifen Sie mit Python auf die Twitter-API zu
Tweet mit der Twitter-API in Python
Codebeispiel zum Abrufen von oauth_token und oauth_token_secret der Twitter-API in Python 2.7
Ich kann das Element in Selen nicht bekommen!
Verwenden Sie die Twitter-API (API-Kontoregistrierung und Tweet-Erfassung).
Ich kann keine Zeichen in den Textbereich eingeben! ?? !! ?? !! !! ??
Es ist zu einfach, mit rauth auf die Twitter-API zuzugreifen, und ich habe sie ...
Ich habe die Berechnungszeit von "X in Liste" (lineare Suche / dichotome Suche) und "X in Menge" untersucht.
Crawlen mit Python und Twitter API 1-Einfache Suchfunktion
Verwenden Sie die Such-API der National Parliament Library in Python
[Hinweis] Das installierte Modul kann nicht im Jupiter aufgerufen werden.
Ich möchte R-Datensatz mit Python verwenden
Bevor ich es wusste, konnte ich keine Bindestriche in der Client-ID der GAE-Kanal-API verwenden.
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Durchsuche den pandas.DataFrame mit einer Variablen und erhalte die entsprechende Zeile.
Optimieren Sie das Sammeln von Informationen mit Twitter API und Slack Bots
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Ich habe N-Queen in verschiedenen Sprachen implementiert und die Geschwindigkeit gemessen