2017-05-11 2 views
1

iterieren Ich bin ein Neuling bei Boto und ich versuche, durch die Ergebnisse der Iteration zu iterieren.Wie kann ich durch Ergebnisse in Boto3 mit mturk

Insbesondere möchte ich alle Arbeiter mit einer bestimmten Qualifikation zählen. Allerdings ist das Limit 100 und ich verstehe nicht, wie es mit NextToken funktioniert. Könnte mir jemand helfen?

# next_token = 1 
qualification_count = 0 
while True: 
    response = s3.list_workers_with_qualification_type(
     QualificationTypeId=qualification_id, 
     Status='Granted', 
     MaxResults=100, 
     NextToken=next_token 
    ) 
    next_token = response['NextToken'] 
    qualification_count += response['NumResults'] 

eindeutig die next_token ist nicht richtig, aber ich weiß nicht, was soll es

+0

ich die Dokumentation überprüft, aber es erklärt nicht den Teil: http://boto3.readthedocs.io/en/latest/reference/services/mturk.html#MTurk.Client.list_workers_with_qualification_type – Niko

Antwort

0

Es gibt ein paar Dinge, die dies für Sie werden Einschrauben könnten. Die erste, die weniger wichtig ist, ist, dass der Client, den Sie verwenden, den Namen s3 hat. Dies könnte nur ein variabler Name sein, den Sie für MTurk ausgewählt haben, aber es lohnt sich, dafür zu sorgen, dass Sie nicht versuchen, dies für den AWS S3-Client aufzurufen.

Die zweite ist, dass Sie bei Ihrem ersten Aufruf in der While-Schleife auf next_token (die Variable) verweisen. Das Problem ist, dass es beim ersten Mal nicht initialisiert wird und somit zum Scheitern verurteilt ist. Auch dies könnte ein Relikt des kurzen Code-Snippets sein, das Sie gezeigt haben, und nicht das eigentliche Problem.

Aber so oder so, sollte der folgende Code funktionieren. Beachten Sie, dass Sie die Größe der zurückzugebenden Seite konfigurieren können (bis zu 100, glaube ich). Aber der wichtige Teil ist, dass es niemals ein NextToken gibt, das nicht initialisiert ist und den MTurk-Client korrekt aufruft. Dieser Code funktioniert an meinem Ende. Lass es mich wissen, wenn du Probleme damit hast. Gerne weiter helfen.

import boto3 

region_name = 'us-east-1' 
aws_access_key_id = 'YOUR_ACCESS_KEY' 
aws_secret_access_key = 'YOUR_SECRET_KEY' 

PAGE_SIZE = 20 

endpoint_url = 'https://mturk-requester-sandbox.us-east-1.amazonaws.com' 

client = boto3.client('mturk', 
    endpoint_url = endpoint_url, 
    region_name = region_name, 
    aws_access_key_id = aws_access_key_id, 
    aws_secret_access_key = aws_secret_access_key, 
) 

qualification_id='9W4ZQKNWM3FZ5HGM2070' 

response = client.list_workers_with_qualification_type(
     QualificationTypeId=qualification_id, 
     Status='Granted', 
     MaxResults=PAGE_SIZE 
    ) 
next_token = response['NextToken'] 

qualification_count = response['NumResults'] 
while (response['NumResults'] == PAGE_SIZE): 
    print "Using next token of {}".format(next_token) 
    response = client.list_workers_with_qualification_type(
      QualificationTypeId=qualification_id, 
      Status='Granted', 
      MaxResults=PAGE_SIZE, 
      NextToken=next_token 
    ) 
    next_token = response['NextToken'] 
    qualification_count += response['NumResults'] 

print "There are {} Workers in Qualification {}".format(qualification_count, qualification_id) 
+0

Außerdem ist es wahrscheinlich offensichtlich, aber bitte beachten Sie, dass das obige Codebeispiel für die MTurk Sandbox festgelegt ist. Wenn Sie dies in der MTurk Production-Umgebung tun müssen, ändern Sie einfach die endpoint_url zu: endpoint_url = 'https://mturk-requester-sandbox.us-east-1.amazonaws.com' – jrb

+0

Vielen Dank für die Antwort! Dieser Code funktioniert perfekt. – Niko

Verwandte Themen