Облачные функции GCP для python выходного файла данных - PullRequest
0 голосов
/ 21 января 2020

Я очень плохо знаком с GCP и не был уверен, что облачные функции - это способ go для этого.

  1. У меня есть скрипт python, который вызывает твиттер-API с помощью tweepy и генерирует файл csv со списком твитов для этого конкретного имени пользователя.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tweepy
import datetime
import csv

def fetchTweets(username):
  # credentials from https://apps.twitter.com/
  consumerKey = "" # hidden for security reasons
  consumerSecret = "" # hidden for security reasons
  accessToken = "" # hidden for security reasons
  accessTokenSecret = "" # hidden for security reasons

  auth = tweepy.OAuthHandler(consumerKey, consumerSecret)
  auth.set_access_token(accessToken, accessTokenSecret)

  api = tweepy.API(auth)

  startDate = datetime.datetime(2019, 1, 1, 0, 0, 0)
  endDate =   datetime.datetime.now()
  print (endDate)

  tweets = []
  tmpTweets = api.user_timeline(username)

  for tweet in tmpTweets:
      if tweet.created_at < endDate and tweet.created_at > startDate:
          tweets.append(tweet)

  lastid = ""
  while (tmpTweets[-1].created_at > startDate and tmpTweets[-1].id != lastid):
      print("Last Tweet @", tmpTweets[-1].created_at, " - fetching some more")
      lastid = tmpTweets[-1].id
      tmpTweets = api.user_timeline(username, max_id = tmpTweets[-1].id)
      for tweet in tmpTweets:
          if tweet.created_at < endDate and tweet.created_at > startDate:
              tweets.append(tweet)

  # # for CSV

  #transform the tweepy tweets into a 2D array that will populate the csv   
  outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode("utf-8")] for tweet in tweets]

  #write the csv    
  with open('%s_tweets.csv' % username, 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(["id","created","text"])
    writer.writerows(outtweets)
  pass

  f = open('%s_tweets.csv' % username, "r")
  contents = f.read()
  return contents

fetchTweets('usernameofusertoretrieve') # this will be set manually in production
Я хотел запустить этот скрипт и получить результаты (либо в виде файла csv, либо в виде return contents) по запросу http, например, с использованием javascript. Скрипт нужно запускать только один раз в день. Но сгенерированные данные (CSV) должны быть доступны по мере необходимости.

Поэтому мой вопрос

a. Является ли GCP Cloud Functions правильным инструментом для работы? или это потребует чего-то более обширного и, следовательно, экземпляра виртуальной машины GCP?

b. Что нужно изменить в коде, чтобы он работал на GCP?

Также приветствуется любая помощь / совет относительно направления.

1 Ответ

2 голосов
/ 21 января 2020

На ваши вопросы нелегко ответить без подробностей. Но я попытаюсь дать некоторую информацию

Является ли GCP Cloud Functions правильным инструментом для работы? или это потребует чего-то более обширного и, следовательно, экземпляра виртуальной машины GCP?

Это зависит. Ваша продолжительность обработки займет менее 9 минут с 1 процессором? И ваш процесс займет менее 2 ГБ памяти (объем памяти приложения + размер файла + tweets размер массива)?

Почему размер файла? Потому что только каталог /tmp доступен для записи и это файловая система в памяти.

Если вам нужно до 15 минут тайм-аута, вы можете посмотреть Cloud Run , очень похожий на Cloud Function и , лично я предпочитаю . Ограничения в процессоре и памяти одинаковы между функцией Cloud и Cloud Run (но она должна измениться в 2020 году с увеличением количества процессора и памяти)

Что нужно изменить в коде, чтобы он работал на GCP?

Начните с записи и чтения в / из каталога /tmp. В конце, если вы хотите, чтобы ваш файл был доступен в течение всего дня, сохраните его в облачном хранилище (https://cloud.google.com/storage/docs) и получите его в начале функции. Если не существует, сгенерируйте его для текущего дня, иначе получите существующий.

Затем замените подпись функции def fetchTweets(username): на def fetchTweets(request): и получите имя пользователя в параметрах запроса

В конце концов, настройте Cloud Scheduler , если вы хотите генерацию каждый день.


Вы не говорили о безопасности. Я рекомендую вам развернуть вашу функцию в приватном режиме

Итак, в этом ответе много концепции GCP-сервера, я не знаю ваших знаний об GCP. Если вам нужна точность на некоторых деталях, не стесняйтесь спрашивать!

...