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
| name | account | followdate | 
|---|---|---|
| Kuwa | kazhu | 2015/12/26 | 
| Giri | noko123 | 2015/12/26 | 
| Taro | taro123 | 2017/09/21 | 
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