Сброс соединения по пиру при извлечении данных из Twitter API - PullRequest
0 голосов
/ 20 октября 2018

Я использую следующий код, чтобы получить список друзей из идентификаторов пользователей Twitter.Я использую Oauth в Python для этого:

import oauth2 as oauth
import json
import twitter
import time

CONSUMER_KEY = 'xxxxx'
CONSUMER_SECRET = 'xxxxxxx'
ACCESS_KEY = 'xxxxxxx'
ACCESS_SECRET = 'xxxxxxxxx'


consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
access_token = oauth.Token(key=ACCESS_KEY, secret=ACCESS_SECRET)
client = oauth.Client(consumer, access_token)
api_path = "https://api.twitter.com/1.1/friends/ids.json?user_id="

def friendsids(user_id):
    cursor='-1'
    all_ids=[]
    errors=[]
    while (cursor!='0'):
        url_with_cursor = api_path+str(user_id) +"&cursor="+cursor
        response,data = client.request( url_with_cursor )
        data=data.decode('utf8')
        data = json.loads(data)
        if 'ids' in data.keys():
            for each in data['ids']:
                all_ids.append(each)
            cursor=data['next_cursor_str']
        elif 'errors' in data.keys():
            time.sleep(60*15)
            continue
        else:

            errors.append(str('error')+str(user_id))
            cursor='0'
    if len(all_ids)>0:
        return all_ids
    else:
        return errors


with open('a.txt') as f:
    for line in f:
        line=line.rstrip()
        twitter_id=line[2]
        frnds=friendsids(twitter_id)
        print(twitter_id+'\t'+str(frnds))

файл a.txt содержит данные.Программа иногда завершается со следующей ошибкой:

  File "import2.py", line 54, in <module>
    frnds=friendsids(twitter_id)
  File "import2.py", line 23, in friendsids
    response,data = client.request( url_with_cursor )
  File "/usr/local/lib/python3.5/dist-packages/oauth2/__init__.py", line 687, in request
    connection_type=connection_type)
  File "/usr/lib/python3/dist-packages/httplib2/__init__.py", line 1312, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/usr/lib/python3/dist-packages/httplib2/__init__.py", line 1062, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "/usr/lib/python3/dist-packages/httplib2/__init__.py", line 1015, in _conn_request
    response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 258, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.5/socket.py", line 575, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3.5/ssl.py", line 929, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/lib/python3.5/ssl.py", line 791, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib/python3.5/ssl.py", line 575, in read
    v = self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 104] Connection reset by peer

Есть ли способ предотвратить это?Метод, который я использую, очень медленный.Вряд ли можно собрать данные 100 пользователей за 2 часа.Существует ли более быстрый способ сбора списка друзей в Твиттере (всех друзей) в python для 1000 пользователей?

...