2017-10-07 16 views
0

내가 내 25K + 여기 게시물에 유사한 이메일을 분석하려고 해요 받아 향상된 보안을 위해 Gmail API를 사용합니다. 저는 Python (및 데이터 분석을 위해 Pandas)을 사용하고 있지만이 질문은 일반적으로 Gmail API 사용에 적용됩니다.의 Gmail API 신속/지금까지 보낸 모든 이메일의 날짜에 액세스은

msgs = service.users().messages().list(userId='me', maxResults=500).execute() 

다음은 루프를 사용하여 데이터 액세스 :

for msg in msgs['messages']: 
    m_id = msg['id'] # get id of individual message 
    message = service.users().messages().get(userId='me', id=m_id).execute() 
    payload = message['payload'] 
    header = payload['headers'] 

    for item in header: 
     if item['name'] == 'Date': 
      date = item['value'] 
      ** DATA STORAGE FUNCTIONS ETC ** 

그러나 이것은 분명히 매우 느립니다 워드 프로세서

, 내가 사용하여 이메일을 읽을 수 있어요. 모든 메시지를 루핑하는 것 외에도 list() API 호출을 여러 번 호출하여 모든 이메일을 순환시켜야합니다.

더 높은 성능의 방법이 있습니까? 예 : 원치 않는 모든 메시지 정보가 아닌 데이터 만 반환하도록 API에 요청하십시오.

감사합니다.

참조 : https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/gmail_v1.users.messages.html 당신은 배치하여 messages.get을() 작업 배치로 할 수

답변

1

, 참조 : 당신은 배치에 100 개 개의 요청까지 넣을 수 있습니다 https://developers.google.com/gmail/api/guides/batch

.

"일괄 처리되는 n 요청 집합은 하나의 요청이 아닌 n 요청으로 사용 제한을 계산합니다." 따라서 요청 비율 한도 이하로 유지하려면 일부 예산 지출을해야 할 수도 있습니다.

여기에 IDS id_list

도와
msgs = [] 
def fetch(rid, response, exception): 
    if exception is not None: 
     print exception 
    else: 
     msgs.append(response) 

# Make a batch request 
batch = gmail.new_batch_http_request() 
for message_id in id_list: 
    t = gmail.users().messages().get(userId='me', id=message_id, format=fmt) 
    batch.add(t, callback=fetch) 

batch.execute(http=http) 
+0

많은 감사의 목록에 의해 주어진 메시지를 가져옵니다 거친 파이썬 예입니다! 일괄 처리는 내가 원하는 것을 소리 쳤다. 하지만 여전히 전체 메시지를 가져온 다음 모든 메시지를 반복하여 데이터를 추출합니다. 특정 데이터 만 반환하는 방법을 알고 있습니까? 아니면 더 효율적으로 수행합니까? 또한, 나는 여전히 목록 ID/메시지를 얻기 위해 일괄 호출 전에 목록/list_next 사용해야 할 것 같아요? 건배 – SLater01

+0

"어떤 특정 데이터"를 원하십니까? (예, list()를 사용하여 mesage id 목록을 얻은 다음 get()을 사용하여 세부 정보를 가져옵니다). – payne

+1

format = 'minimal'로 설정하면 감사하겠습니다. 이렇게하면 메시지 본문 등을 무시하고 낭비되는 데이터 전송을 방지합니다. – SLater01