[PYTHON] J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.

Aikatsu! Je souhaite collecter des tweets tous les jours et il est difficile de le faire manuellement.Je souhaite donc l'automatiser pour qu'il soit diffusé tous les jours sur AWS Lambda.

Tout d'abord, sur AWS Lambda, j'ai enregistré la bibliothèque Twitter Scraper (1.4.0) dans Lambda Layers, mis en œuvre approximativement le code suivant au niveau de la vérification des opérations et exécuté le test.

from twitterscraper import query_tweets
import datetime as dt

def lambda_handler(event, context):
    
    begin_date = dt.date(2020,6,5)
    end_date = dt.date(2020,6,6)
    pool_size = (end_date - begin_date).days
    
    tweets = query_tweets("Aikatsu", begindate = begin_date, enddate = end_date, poolsize=pool_size, lang="ja")
    tuple_tweet=[(tweet.user_id, tweet.tweet_id, tweet.text.replace("\n","\t"), tweet.timestamp) for tweet in tweets]
      
    return True

Ensuite, l'erreur «pool» suivante est manquante est générée sur AWS Lambda.

{
  "errorMessage": "name 'pool' is not defined",
  "errorType": "NameError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 14, in lambda_handler\n    tweets = query_tweets(\"Aikatsu\", begindate = begin_date, enddate = end_date, poolsize=pool_size, lang=\"ja\")\n",
    "  File \"/opt/python/twitterscraper/query.py\", line 246, in query_tweets\n    pool.close()\n"
  ]
}

Cela fonctionne normalement sur Jupyter Notebook, donc je me suis demandé si quelque chose dans Lambda Layers n'allait pas, alors quelle est la variable "pool" en premier lieu? Découvrons cela.

Apparemment, c'est une variable query.py de Twitter Scraper.

query.py


def query_tweets(query, limit=None, begindate=dt.date(2006, 3, 21), enddate=dt.date.today(), poolsize=20, lang=''):
    no_days = (enddate - begindate).days
    
    if(no_days < 0):
        sys.exit('Begin date must occur before end date.')
    
    if poolsize > no_days:
        # Since we are assigning each pool a range of dates to query,
		# the number of pools should not exceed the number of dates.
        poolsize = no_days
    dateranges = [begindate + dt.timedelta(days=elem) for elem in linspace(0, no_days, poolsize+1)]

    if limit and poolsize:
        limit_per_pool = (limit // poolsize)+1
    else:
        limit_per_pool = None

    queries = ['{} since:{} until:{}'.format(query, since, until)
               for since, until in zip(dateranges[:-1], dateranges[1:])]

    all_tweets = []
    try:
        pool = Pool(poolsize)
        logger.info('queries: {}'.format(queries))
        try:
            for new_tweets in pool.imap_unordered(partial(query_tweets_once, limit=limit_per_pool, lang=lang), queries):
                all_tweets.extend(new_tweets)
                logger.info('Got {} tweets ({} new).'.format(
                    len(all_tweets), len(new_tweets)))
        except KeyboardInterrupt:
            logger.info('Program interrupted by user. Returning all tweets '
                         'gathered so far.')
    finally:
        pool.close()
        pool.join()

    return all_tweets

Probablement pool = Pool (poolsize), supprimez cette variable de la clause try et exécutez AWS Lambda.

{
  "errorMessage": "[Errno 38] Function not implemented",
  "errorType": "OSError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 14, in lambda_handler\n    tweets = query_tweets(\"Aikatsu\", begindate = begin_date, enddate = end_date, poolsize=pool_size, lang=\"ja\")\n",
    "  File \"/opt/python/twitterscraper/query.py\", line 233, in query_tweets\n    pool = Pool(poolsize)\n",
    "  File \"/opt/python/billiard/pool.py\", line 995, in __init__\n    self._setup_queues()\n",
    "  File \"/opt/python/billiard/pool.py\", line 1364, in _setup_queues\n    self._inqueue = self._ctx.SimpleQueue()\n",
    "  File \"/opt/python/billiard/context.py\", line 150, in SimpleQueue\n    return SimpleQueue(ctx=self.get_context())\n",
    "  File \"/opt/python/billiard/queues.py\", line 390, in __init__\n    self._rlock = ctx.Lock()\n",
    "  File \"/opt/python/billiard/context.py\", line 105, in Lock\n    return Lock(ctx=self.get_context())\n",
    "  File \"/opt/python/billiard/synchronize.py\", line 182, in __init__\n    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)\n",
    "  File \"/opt/python/billiard/synchronize.py\", line 71, in __init__\n    sl = self._semlock = _billiard.SemLock(\n"
  ]
}

Puisque le contenu d'erreur est "Fonction non implémentée", il est apparemment causé par la bibliothèque de billard multi-processus. Il semble que le multi-processus ne soit pas disponible dans AWS Lambda.

https://aws.amazon.com/es/blogs/compute/parallel-processing-in-python-with-aws-lambda/

Correspondance

Il y a une description d'un phénomène similaire dans les numéros de twitterscraper.

Il existe une implémentation de solution de contournement dans pullrequest sur github, je pourrais donc contourner ce problème en remplaçant quert.py par le contenu de pullrequest. https://github.com/taspinar/twitterscraper/pull/280/commits/685c5b4f601de58c2b2591219a805839011c5faf

Etant donné que le nombre de multi-processus est défini à l'aide de la variable "poolsize" lors de son passage à la fonction "query_tweets", il est implémenté de sorte qu'il ne soit pas multi-traité s'il est explicitement mis à 0.

Recommended Posts

J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
J'ai essayé d'installer Docker sur Windows10 Home mais cela n'a pas fonctionné
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
J'ai essayé de supprimer régulièrement les mauvais tweets avec l'API AWS Lambda + Twitter
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
J'ai essayé de réduire les coûts en démarrant / arrêtant EC2 dans un lot avec AWS Lambda
Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
J'ai fait de mon mieux pour créer une fonction d'optimisation, mais cela n'a pas fonctionné.
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
Je veux AWS Lambda avec Python sur Mac!
AWS Lambda prend désormais en charge Python, je l'ai donc essayé
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé de comprendre comment utiliser les pandas et la colinéarité multiple en utilisant l'ensemble de données Affaires comme thème.
C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.
Je voulais utiliser la feuille de calcul Google avec AWS lambda, alors je l'ai essayé [Partie 2]
J'ai essayé de lancer le cluster ipython au minimum sur AWS
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Je veux tweeter Twitter avec Python, mais j'y suis accro
J'ai installé DSX Desktop et l'ai essayé
J'ai créé un robot pour publier sur Twitter en grattant sur le Web un site dynamique avec AWS Lambda (suite)
Je veux utiliser Linux sur mac
Créez une application Django sur Docker et déployez-la sur AWS Fargate
J'ai installé PySide2, mais pyside2-uic ne fonctionnait pas, alors j'ai réussi à le faire.
Publiez régulièrement sur Twitter en utilisant AWS lambda!
Touches de karaoké assorties ~ J'ai essayé de le mettre sur Laravel ~ <en route>
J'ai essayé de pousser les documents Sphinx vers BitBucket et de les refléter automatiquement sur le serveur Web
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
J'ai essayé d'utiliser l'apprentissage en profondeur pour extraire la partie où la plante est montrée de la photo de la véranda, mais cela n'a pas fonctionné, je vais donc résumer le contenu des essais et erreurs. Partie 2
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
Quand j'ai essayé d'utiliser Python sur WSL (sous-système Windows pour Linux), il est resté bloqué dans Jupyter (résolu)
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
J'ai essayé d'utiliser Resultoon sur Mac + AVT-C875, mais j'étais frustré en chemin.
[Je suis un débutant en informatique] J'ai fait de mon mieux pour implémenter Linux sur Windows
[Introduction à AWS] J'ai essayé de porter une application de conversation et de jouer avec text2speech @ AWS ♪
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé de connecter AWS Lambda à d'autres services
Résumé de l'étude de Python pour utiliser AWS Lambda
Comment installer le détecteur Cascade et comment l'utiliser
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de gratter YouTube, mais je peux utiliser l'API, alors ne le faites pas.
[Rails] v1.0 est sorti sur google-cloud-vision de gem, j'ai donc essayé de le soutenir
Mémo Un débutant a essayé de créer un environnement Java et de le traduire en japonais sur Ubuntu 18.04.2 LTS.
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
J'ai essayé d'exécuter TensorFlow dans l'environnement AWS Lambda: Préparation
J'ai essayé de résumer comment utiliser les pandas de python
Je souhaite utiliser OpenJDK 11 avec Ubuntu Linux 18.04 LTS / 18.10
Comment utiliser Decorator dans Django et comment le créer
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow