Ich war süchtig danach, Tweets mit der Twitter-API Search API zu sammeln. !! Es gibt eine Falle an einem unerwarteten Ort ...
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.
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 Japanischja Nur gültig |
result_type | Geben Sie den Typ des erfassten Tweets an | recent Dann der neueste Tweet,popular Dann beliebte Tweets,mixed Dann 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 | false Wenn Sie angeben, erhalten Sie Tweets ohne Entitätsinformationen |
Parameter | Erläuterung | Bemerkungen |
---|---|---|
statuses | Liste der Tweets | Das Tweet-Objekt wird in einer Liste gespeichert |
search_metadata | Metadaten suchen | Enthält Suchmetadaten |
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"
}
}
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 ...
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()
Da der Antwortparameter "next_results" für den nächsten Anforderungsparameter verwendet wird,
next_results
Überprüfen Sie die beiden Punkte.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
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.
Ersetzen Sie nach dem Parsen des Antwortparameters next_results
**% 25 im Anforderungsparameter durch% **.
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
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.
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