facebook-graph-api から json データを取得しています。
- 私の友達との関係
- 私の友達同士の関係。
現在、私のプログラムは次のようになっています (Python 疑似コードでは、プライバシーのためにいくつかの変数が変更されていることに注意してください)。
import json
import requests
# protected
_accessCode = "someAccessToken"
_accessStr = "?access_token=" + _accessCode
_myID = "myIDNumber"
r = requests.get("https://graph.facebook.com/" + _myID + "/friends/" + _accessStr)
raw = json.loads(r.text)
terminate = len(raw["data"])
# list used to store the friend/friend relationships
a = list()
for j in range(0, terminate + 1):
# calculate terminating displacement:
term_displacement = terminate - (j + 1)
print("Currently processing: " + str(j) + " of " + str(terminate))
for dj in range(1, term_displacement + 1):
# construct urls based on the raw data:
url = "https://graph.facebook.com/" + raw["data"][j]["id"] + "/friends/" + raw["data"][j + dj]["id"] + "/" + _accessStr
# visit site *THIS IS THE BOTTLENECK*:
reqTemp = requests.get(url)
rawTemp = json.loads(reqTemp.text)
if len(rawTemp["data"]) != 0:
# data dumps to list which dumps to file
a.append(str(raw["data"][j]["id"]) + "," + str(rawTemp["data"][0]["id"]))
outputFile = "C:/Users/franklin/Documents/gen/friendsRaw.csv"
output = open(outputFile, "w")
# write all me/friend relationship to file
for k in range(0, terminate):
output.write(_myID + "," + raw["data"][k]["id"] + "\n")
# write all friend/friend relationships to file
for i in range(0, len(a)):
output.write(a[i])
output.close()
つまり、最初に私のページを呼び出して、友達リストを取得します (これは、access_token を使用して Facebook API を介して許可されます)。友達の友達リストを呼び出すことは許可されていませんが、上の友達との関係を要求することで回避できます。私のリストと私のリストの別の友人。そのため、パート 2 (二重の for ループで示されます) では、友人 a が b の友人でもあるかどうかを確認するために別の要求を行っています (どちらも私のリストに含まれています)。その場合、友人 a の名前を持つ長さ 1 の json オブジェクトが存在します。
しかし、約 357 人の友人の場合、文字通り何千ものページ リクエストを行う必要があります。つまり、プログラムは json リクエストを待つだけで多くの時間を費やしています。
私の質問は、これをより効率的に書き直すことができるかということです。現在、セキュリティ上の制限により、フレンドのフレンド リスト属性の呼び出しは許可されていません。APIがこれを許可するようには見えません。これをより速く実行できるPythonのトリックはありますか? 多分平行?
修正されたコードを更新して、回答セクションの下に貼り付けます。