[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren

Artikelinhalt

Wen erreichen Sie mit den Freunden und Freunden Ihrer Freunde? Diese Person und diese Person sind an einem überraschenden Ort verbunden! Da ist so etwas.

In diesem Artikel habe ich versucht, die Menschen zu visualisieren, die sich auf Twitter folgen.

Was ich getan habe

Es gibt zwei wichtige Dinge, die ich getan habe.

Erhalten Sie Informationen zu Benutzern, denen Sie folgen

import json
import config
from requests_oauthlib import OAuth1Session
from time import sleep
from mongo_dao import MongoDAO
import datetime

# API-Schlüsseleinstellung (definiert in einer anderen Datei config.py)
CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET

# Authentifizierungsprozess
twitter = OAuth1Session(CK, CS, AT, ATS)  

mongo = MongoDAO("db", "followers_info")

 get_friends_url = "https://api.twitter.com/1.1/friends/list.json" # Holen Sie sich das Konto, dem Sie folgen
 get_user_info_url = "https://api.twitter.com/1.1/users/show.json" # Benutzerinformationen abrufen
count = 200
targets = ['yurinaNECOPLA']
registed_list = []
 Tiefe = 2 # Tauchtiefe
 max_friends_count = 1000 # Es gibt viele Leute, die Konten folgen. Wenn es also eine bestimmte Anzahl überschreitet, wird es ausgeschlossen

# Stellen Sie fest, ob die Anzahl der Folgekonten eine bestimmte Anzahl überschreitet
def judge_friends_count(screen_name):
    params = {'screen_name': screen_name}
    while True:
        res = twitter.get(get_user_info_url, params=params)
        result_json = json.loads(res.text)
        if res.status_code == 200:
 #Die Anzahl der Personen, denen Sie folgen, ist "friends_count", die Anzahl der Personen, denen Sie folgen, ist "follers_count".
            if result_json['friends_count'] > max_friends_count:
                return False
            else:
                return True
        elif res.status_code == 429:
 # Sie können Anfragen nur 15 Mal in 15 Minuten senden. Warten Sie also, bis Sie das Limit erreicht haben
            now = datetime.datetime.now()
 print (now.strftime ("% Y /% m /% d% H:% M:% S") + 'Warte auf Verbindungslimit')
 Schlaf (15 * 60) # 15 Minuten warten
        else:
            return False

# Holen Sie sich Follower für den angegebenen Bildschirmnamen
def get_followers_info(screen_name):
    followers_info = []
    params = {'count': count,'screen_name': screen_name}
    while True:
        res = twitter.get(get_friends_url, params=params)
        result_json = json.loads(res.text)

        if res.status_code == 200 and len(result_json['users']) != 0:
                for user in result_json['users']:
 Von den von #API erhaltenen Informationen werden nur die erforderlichen Informationen im Diktatformat festgelegt (ID wird in diesem PG nicht verwendet ...)
                    followers_info.append({'screen_name': user['screen_name'], 'id': user['id']})
 Stellen Sie die folgende Erfassungsposition im Parameter # ein
                params['cursor'] = result_json['next_cursor']
 #Verarbeitung, wenn das Verbindungslimit der API überschritten wird
        elif res.status_code == 429:
            now = datetime.datetime.now()
 print (now.strftime ("% Y /% m /% d% H:% M:% S") + 'Warte auf Verbindungslimit')
 Schlaf (15 * 60) # 1 Minute warten
        else:
            break
    return followers_info

# Ruft eine Liste mit nur screen_name aus der Liste von dict ab
def followers_list(followers_info):
    followers_list = []
    for follower in followers_info:
        followers_list.append(follower['screen_name'])
    return followers_list

# Rekursive Verarbeitung
def dive_search(target_list, d):
    for name in target_list:
        if name in registed_list or not judge_friends_count(name):
            continue
        print(name)
        followers_info = get_followers_info(name)
        mongo.insert_one({'screen_name': name, 'followers_info': followers_info})
        registed_list.append(name)
        if depth > d:
            dive_search(followers_list(followers_info), d + 1)
        else:
            return
    
dive_search(targets, 0)

Entscheiden Sie in diesem Programm das Startkonto. (Ausgehend von dem Konto von Yurina Aoshima, einer Idolgruppe namens // Necopla //)

Danach wird es rekursiv gemäß dem folgenden Ablauf verarbeitet. ① Informieren Sie sich über die Benutzer, denen Sie folgen ② Registrieren Sie die Informationen von ① in mongoDB ③ Holen Sie sich die in ① erfassten Benutzerinformationen nacheinander und führen Sie sie von ① aus

Durch Ändern des Tiefenwerts können Sie ändern, wie viel Sie rekursiv tauchen.

Wenn es 2 ist, ist es ein Bild, um Freunde von Freunden zu bekommen. Ich wollte wirklich mehr Daten erhalten, aber die API zum Abrufen von Follow-bezogenen Informationen kann nur 15 Anfragen in 15 Minuten senden. Das Startkonto folgt derzeit 100 Konten, aber selbst wenn ich mit diesem Konto angefangen habe, dauerte es ungefähr 3 Stunden, um den Vorgang abzuschließen. Außerdem trat unterwegs der Fehler "Die vorhandene Verbindung wurde vom Remote-Host zwangsweise getrennt" auf, und der Vorgang schlug fehl.

Zu diesem Zeitpunkt sind nur etwa 60 der 100 Benutzerkonten, denen ich folge, abgeschlossen. Selbst wenn es funktioniert hat, hat es ungefähr 6 Stunden gedauert.

Der folgende Code wird für die Datenregistrierung bei mongoDB verwendet.

MongoDao

Visualisieren

Wie im vorherigen Abschnitt erwähnt, kann nicht gesagt werden, dass alle Daten gesammelt wurden, aber lassen Sie uns dies vorerst mit den gesammelten Daten visualisieren.

Die zur Visualisierung verwendete Bibliothek war NetworkX. Die Installation kann mit dem folgenden Befehl erfolgen.

pip install networkx
import json
import networkx as nx
import matplotlib.pyplot as plt
from requests_oauthlib import OAuth1Session
from mongo_dao import MongoDAO

mongo = MongoDAO("db", "followers_info")
start_screen_name = 'yurinaNECOPLA'

# Erstellen Sie ein neues Diagramm
G = nx.Graph()
 # Knoten hinzufügen
G.add_node(start_screen_name)

depth = 3
processed_list = []

def get_followers_list(screen_name):
    result = mongo.find(filter={"screen_name": screen_name})
    followers_list = []
    try:
        doc = result.next()
        if doc != None:
            for user in doc['followers_info']:
                followers_list.append(user['screen_name'])
        return followers_list
    except StopIteration:
        return followers_list

def dive(screen_name, d):
    if depth > 0:
        if screen_name in processed_list:
            return
        followers_list = get_followers_list(screen_name)
        for screen_name in followers_list:
            f = get_followers_list(follower)
            if start_screen_name in f:
                G.add_edge(screen_name, follower)
                processed_list.append(screen_name)
                dive(follower, d + 1)
    else:
        return

dive(start_screen_name, 0)

# Diagramm erstellen. figsize ist die Größe der Figur
plt.figure(figsize=(10, 8))
 
# Bestimmen Sie das Layout der Figur. Je kleiner der Wert von k ist, desto dichter ist die Zahl
pos = nx.spring_layout(G, k=0.8)
 
# Zeichnen von Knoten und Kanten
# _color: Geben Sie die Farbe an
# Alpha: Transparenz festlegen
nx.draw_networkx_edges(G, pos, edge_color='y')
nx.draw_networkx_nodes(G, pos, node_color='r', alpha=0.5)
 
# Knotennamen hinzufügen
nx.draw_networkx_labels(G, pos, font_size=10)
 
# Einstellung, dass die X-Achse und die Y-Achse nicht angezeigt werden
plt.axis('off')

plt.savefig("mutual_follow.png ")
# Zeichnen Sie ein Diagramm
plt.show()

Das Verfahren und die Logik zum Abrufen von Followern sind ähnlich. Es erhält rekursiv Follower und fügt Kanten hinzu, wenn Konten gefunden werden, die aufeinander folgen.

Ergebnis

Es stellte sich heraus, dass es so etwas war. mutual_follow.png

Ich verstehe den detaillierten Mechanismus der Bibliothek nicht, aber Konten mit vielen Verbindungen sind überfüllt. Dieses überfüllte Konto ist ein Idol, das zum selben Büro gehört, daher war ich mit dem Ergebnis zufrieden.

Impressionen

Das Ergebnis war sehr interessant. Da das Ausstellungslimit für Twitter-API-Anforderungen 15 / min beträgt, konnten wir die Datenmenge nicht wesentlich erhöhen. Wenn Sie Zeit finden und mehr Daten sammeln können, können Sie möglicherweise die Verbindung von Freunden von Freunden und Freunden von Freunden sehen.

Recommended Posts

[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
[Python] Ich habe versucht, das Preisgeld von "ONE PIECE" über 100 Millionen Zeichen mit matplotlib zu visualisieren.
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die 100-Yen-Lagerstätte von Rakuten-Pferderennen (Python / Selen) zu automatisieren.
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen