[PYTHON] Holen Sie sich Twitter userData

Da die Follower-Liste von Twitter nur screen_name enthält, habe ich beschlossen, die Benutzer-ID-Informationen zur Follower-Liste von Twitter hinzuzufügen.

Twitter API GET users/show https://dev.twitter.com/rest/reference/get/users/show

Daten der Twitter-Follower-Liste (csv)

name account followdate
Kuwa kazhu 2015/12/26
Giri noko123 2015/12/26
Taro taro123 2017/09/21

API-Limit Benutzer / Show bis zu 900/15 Minuten

API-Einschränkungen sind für Twitter problematisch, aber die Möglichkeit, dies zu vermeiden, besteht in der Methode des Administrators von Code 7 Ward. Ich bin immer dankbar für Ihre Hilfe. Holen Sie sich viele Tweets mit TwitterAPI. Berücksichtigen Sie serverseitige Fehler (in Python)

twitter_user_get.py



# coding=utf-8

import sys
import tweetkey
import os
from requests_oauthlib import OAuth1Session
import csv
import time
import json
import datetime


def init():

    #Stellen Sie verschiedene Schlüssel aus der üblichen externen Datei ein
    CONSUMER_KEY = tweetkey.twkey['CONSUMER_KEY']
    CONSUMER_SECRET = tweetkey.twkey['CONSUMER_SECRET']
    ACCESS_TOKEN = tweetkey.twkey['ACCESS_TOKEN']
    ACCESS_SECRET = tweetkey.twkey['ACCESS_SECRET']

    twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET)

    return(twitter)

def twittergetter(input_name,output_name,api):

    TweetIDList = []
    with open(input_name, 'r') as f:
        reader = csv.reader(f)
        header = next(reader)  #Wenn Sie die Kopfzeile überspringen möchten

        #ID-Spalte zur Ausgabe für HEAD hinzugefügt
        header.append("id")

        fout = open(output_name, 'wt')
        writer = csv.writer(fout)
        writer.writerow(header)

        for row in reader:
            #Holen Sie sich Konto von Array 2 von CSV und werfen
            screen_name = row[2]
            print(screen_name)
            url = "https://api.twitter.com/1.1/users/show.json?screen_name=" + screen_name
            # params = {'count': 100}
            # get_Benutzer hat keine Parameter
            req = api.get(url)

            if req.status_code == 200:
                users = json.loads(req.text)
                print(users)
                #Benutzer-ID ist in ID
                id = users["id"]
                print(id)
                #Fügen Sie die zurückgegebene ID zum Array hinzu und schreiben Sie
                row.append(id)
                writer.writerow(row)

            else:
          #Bei 404 Bildschirm_Da sich der Name bereits geändert oder zurückgezogen hat, schreiben Sie so wie er ist
                if req.status_code == 404:
                    writer.writerow(row)
                else:
                    print ("Error: %d" % req.status_code)
                    time.sleep(240)

            #Header-Bestätigung (Anzahl der Male)
            # X-Rate-Limit-Überprüfen Sie, da es selten vorkommt, dass der Rest nicht enthalten ist
            if ('X-Rate-Limit-Remaining' in req.headers and 'X-Rate-Limit-Reset' in req.headers):
                if (int(req.headers['X-Rate-Limit-Remaining']) == 0):
                    waitUntilReset(int(req.headers['X-Rate-Limit-Reset']))
                    checkLimit()
            else:
                print('not found  -  X-Rate-Limit-Remaining or X-Rate-Limit-Reset')
                checkLimit()

        fout.close()
    return()


def checkLimit():
    '''
Fragen Sie das Limit ab und warten Sie, bis es verfügbar ist
    '''
    unavailableCnt = 0
    while True:
        url = "https://api.twitter.com/1.1/application/rate_limit_status.json"
        res = api.get(url)
        print(res.text)

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        unavailableCnt = 0

        if res.status_code != 200:
            raise Exception('Twitter API error %d' % res.status_code)

        remaining, reset = getLimitContext(json.loads(res.text))
        if (remaining == 0):
            waitUntilReset(reset)
        else:
            break

def getLimitContext(res_text):
    '''
Informieren Sie sich über die Anzahl der Zeitlimits (beim Start).
    '''
    remaining = res_text['resources']['users']['/users/show/:id']['remaining']
    reset = res_text['resources']['users']['/users/show/:id']['reset']
    print(reset)
    return int(remaining), int(reset)

def waitUntilReset(reset):
    '''
Schlaf bis zum Zurücksetzen der Zeit
    '''
    seconds = reset - time.mktime(datetime.datetime.now().timetuple())
    seconds = max(seconds, 0)
    print('\n     =====================')
    print('     == waiting %d sec ==' % seconds)
    print('     =====================')
    sys.stdout.flush()
    time.sleep(seconds + 10)  #Nur für den Fall+10 Sekunden

if __name__ == '__main__':
    api = init()
    input_name = os.getcwd() + "/twitterList.csv"
    output_name = os.getcwd() + "/twitterList_add_id.csv"
    twittergetter(input_name,output_name, api)

Wenn ich jedoch versuche, screen_name für 120.000 Personen zu konvertieren, endet er auch nach 2 Tagen nicht. .. ..

Recommended Posts

Holen Sie sich Twitter userData
Holen Sie sich Twitter-Timeline mit Python
Holen Sie sich Promi-Tweet-Geschichte von Twitter
Holen Sie sich Daten von Twitter mit Tweepy
Erhalten Sie Verzögerungsinformationen auf Twitter und twittern Sie
Holen Sie sich Bilder per Stichwortsuche von Twitter
Holen Sie sich mit Selenium Twitter-Lesezeichen auf CentOS
[Python] Twitter-Timeline für mehrere Benutzer abrufen
Programm, um Lieblingsbilder von Twitter zu erhalten
Holen Sie sich viele Twitter-Tweets auf einmal