[PYTHON] Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.

Aikatsu! Ich möchte ungefähr jeden Tag Tweets sammeln, und es ist mühsam, dies manuell zu tun. Daher möchte ich es automatisieren, damit es jeden Tag auf AWS Lambda ausgegeben wird.

Zuerst habe ich auf AWS Lambda die Twitter Scraper-Bibliothek (1.4.0) in Lambda Layers registriert, den folgenden Code auf der Ebene der Betriebsüberprüfung grob implementiert und den Test ausgeführt.

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

Dann fehlt der folgende "Pool" -Fehler, der auf AWS Lambda ausgegeben wird.

{
  "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"
  ]
}

Es funktioniert normalerweise auf dem Jupyter-Notizbuch, also habe ich mich gefragt, ob etwas in Lambda-Ebenen nicht stimmt. Was ist also überhaupt die Variable "Pool"? Lassen Sie uns das herausfinden.

Anscheinend ist es eine Twitter Scraper query.py Variable.

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

Wahrscheinlich pool = Pool (poolsize), entfernen Sie diese Variable aus der try-Klausel und führen Sie AWS Lambda aus.

{
  "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"
  ]
}

Da der Fehlerinhalt "Funktion nicht implementiert" ist, wird er anscheinend durch die Multi-Prozess-Billardbibliothek verursacht. Es scheint, dass Multi-Process in AWS Lambda nicht verfügbar ist.

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

Korrespondenz

Es gibt eine Beschreibung eines ähnlichen Phänomens in den Ausgaben von twitterscraper.

Da es in pullrequest auf github eine Problemumgehungsimplementierung gibt, kann dies vermieden werden, indem quert.py durch den Inhalt von pullrequest ersetzt wird. https://github.com/taspinar/twitterscraper/pull/280/commits/685c5b4f601de58c2b2591219a805839011c5faf

Da die Anzahl der Mehrfachprozesse mit der Variablen "poolsize" festgelegt wird, wenn sie an die Funktion "query_tweets" übergeben wird, wird sie so implementiert, dass sie nicht mehrfach verarbeitet wird, wenn sie explizit auf 0 gesetzt wird.

Recommended Posts

Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich habe versucht, Docker unter Windows 10 Home zu installieren, aber es hat nicht funktioniert
Ich habe versucht, Java mit Termux unter Verwendung von Termux Arch zu verwenden, aber es hat nicht funktioniert
Ich habe versucht, schlechte Tweets regelmäßig mit der AWS Lambda + Twitter API zu löschen
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
Docker x Visualization hat nicht funktioniert und ich war süchtig danach, also habe ich es zusammengefasst!
Ich habe mein Bestes versucht, um eine Optimierungsfunktion zu erstellen, aber es hat nicht funktioniert.
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich möchte Lambda mit Python auf Mac AWS!
AWS Lambda unterstützt jetzt Python, also habe ich es versucht
Ich habe versucht, Scrapy auf Anaconda zu installieren und konnte es nicht
Ich habe versucht zu verstehen, wie Pandas und multiple Co-Linearität unter Verwendung des Affairs-Datensatzes als Thema verwendet werden.
Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]
Ich habe versucht, den Ipython-Cluster unter AWS auf das Minimum zu starten
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Ich habe DSX Desktop installiert und ausprobiert
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Ich möchte Linux auf dem Mac verwenden
Erstellen Sie eine Django-App auf Docker und stellen Sie sie in AWS Fargate bereit
Ich habe PySide2 installiert, aber pyside2-uic hat nicht funktioniert, also habe ich es geschafft.
Poste regelmäßig mit AWS Lambda auf Twitter!
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Ich habe versucht, Sphinx-Dokumente an BitBucket zu senden und sie automatisch auf dem Webserver wiederzugeben
Bequem zum Verwenden von Ebenen beim Laden von Bibliotheken auf Lambda
Ich habe versucht, den Teil, in dem die Pflanze gezeigt wird, mithilfe von Deep Learning aus dem Foto der Veranda zu extrahieren, aber es hat nicht funktioniert, daher werde ich den Inhalt von Versuch und Irrtum zusammenfassen. Teil 2
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Als ich versuchte, Python unter WSL (Windows-Subsystem für Linux) zu verwenden, blieb es in Jupyter stecken (gelöst)
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
Ich habe versucht, Resultoon auf Mac + AVT-C875 zu verwenden, war aber unterwegs frustriert.
[Ich bin ein IT-Anfänger] Ich habe mein Bestes versucht, Linux unter Windows zu implementieren
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
So installieren Sie den Cascade-Detektor und wie verwenden Sie ihn
[Einführung in PID] Ich habe versucht, ♬ zu steuern und zu spielen
Ich habe versucht, YouTube zu kratzen, aber ich kann die API verwenden, also tu es nicht.
[Rails] v1.0 kam auf Google-Cloud-Vision von Gem heraus, also habe ich versucht, es zu unterstützen
Memo Ein Anfänger hat versucht, eine Java-Umgebung zu erstellen und unter Ubuntu 18.04.2 LTS ins Japanische zu übersetzen.
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Übersicht und Zusammenfassung
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
So konfigurieren Sie Layer auf Lambda mit AWS SAM
Ich habe versucht, Linux Systemaufrufe und Scheduler hinzuzufügen
Ich habe versucht, TensorFlow in der AWS Lambda-Umgebung auszuführen: Vorbereitung
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich möchte OpenJDK 11 mit Ubuntu Linux 18.04 LTS / 18.10 verwenden
Wie man Decorator in Django benutzt und wie man es macht
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren