Background Fortsetzung von FizzBuzz mit AWS Lambda. Diesmal habe ich versucht, durch Scraping Daten von einer externen Webseite abzurufen.
AWS Architecture
Ich benutze drei Dienste.
Setting
S3
Erstellen Sie einen Bucket zum Speichern von Daten.
Geben Sie nur den Bucket-Namen ein und belassen Sie die Standardeinstellungen für die anderen Einstellungen. (Wählen Sie die entsprechende Region aus.)
Die Bucket-Erstellung ist abgeschlossen.
Lambda
Erstellen Sie ein Lambda für die Datenverarbeitung.
Von Grund auf neu erstellen, nicht ... Hier wird "s3-get-object-python" in "Verwendung von Konstruktionszeichnungen" verwendet.
Geben Sie den Funktionsnamen und den Rollennamen ein. Dieses Mal werden wir die Datei in S3 hochladen. Löschen Sie daher die Richtlinienvorlage "Nur-Lese-Zugriff". Geben Sie für den S3-Trigger den Bucket ein, den Sie zuvor für den Bucket-Namen erstellt haben.
Geben Sie danach ein beliebiges Zeichen in die Präfixoption ** ein. ** ** ** Hier erwähnte beliebige Zeichen sind Zeichen, die sich nicht mit dem Anfang des Dateinamens überschneiden, obwohl die Datei mit Lambda erstellt wurde. Wenn Sie keine doppelten Zeichen eingeben oder eingeben, wird eine Endlosschleife für ** Lambda ausgelöst, für die eine hohe Gebühr anfällt: Schrei: **, was wichtig ist.
Eine andere Problemumgehung besteht darin, Einschränkungen hinzuzufügen, z. B. nur das Kopieren des Ereignistyps.
Nachdem Sie alle Eingaben vorgenommen haben, klicken Sie auf "Funktion erstellen".
Eine Vorlage wird erstellt. Wenn Sie jedoch mit der Entwicklung fortfahren, sie bereitstellen und testen, tritt ein Berechtigungsfehler auf.
Aktivieren Sie zunächst S3.
Wenn Sie sich die Ereignisbenachrichtigung in den Bucket-Eigenschaften von S3 ansehen, können Sie sehen, dass sie hinzugefügt wurde.
Wählen Sie IAM → Rolle, um die Rollenliste anzuzeigen. Wählen Sie hier den zuvor beim Erstellen des Lambda beschriebenen Rollennamen aus.
Drücken Sie "Richtlinie anhängen", ohne nachzudenken.
Filtern Sie nach "LambdaFull", wählen Sie "AWSLambdaFullAccess" und klicken Sie auf "Richtlinie anhängen".
Damit ist das Hinzufügen von Berechtigungen abgeschlossen.
Die Verarbeitung schlug fehl, wenn der Speicher klein war. Speicher: 256 MB, Timeout auf 10 Sekunden einstellen.
Das ist es.
Verwenden Sie das bote3-Paket, um S3-Buckets zu senden und zu empfangen. Wenn Sie beim Erstellen von Lambda "s3-get-object-python" auswählen, wird es eingeschlossen. Wenn Sie das Paket von Anfang an hochladen, ist die Kapazität von bote3 selbst groß und beträgt 10 MB oder mehr. Verwenden Sie daher besser das vorhandene.
import json
import urllib.parse
import boto3
import datetime
def lambda_handler(event, context):
try:
# Get the object from the event and show its content type
s3 = boto3.resource('s3')
bucket = '[Eimername]'
key = 'test_{}.txt'.format(datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'))
file_contents = 'Lambda test'
obj = s3.Object(bucket,key)
obj.put( Body=file_contents )
except Exception as e:
print(e)
raise e
Nach der Bereitstellung und dem Testen werden die Dateien in den Bucket hochgeladen. Obwohl es sich um eine Testereigniseinstellung handelt, wird sie auch mit einem leeren JSON gestartet.
Um zu kratzen, habe ich "Anfragen" "schöne Suppe", aber ich muss das von pip installierte Paket auf Lambda hochladen.
Die Methode besteht darin, das Paket mit pip im Ordner zu installieren und den Ordner zu komprimieren. Erstellen Sie hier eine ausführbare Datei und kopieren Sie den in Lambda geschriebenen Code.
mkdir packages
cd packages
pip install requests -t ./
pip install beautifulsoup -t ./
touch lambda_function.py
Das Paket wird in das Projekt eingefügt. Verschieben Sie dann die Ordner und Dateien unter "Pakete" in den "Artikelspeicher" eine Ebene höher. Stellen Sie dann bereit und testen Sie, um die Datei zu S3 hinzuzufügen.
Alles was Sie tun müssen, ist Web Scraping. Hier werde ich versuchen, das Mainichi Shimbun Editorial heute zu datieren.
import json
import urllib.parse
import boto3
import datetime
from datetime import timedelta, timezone
import random
import os
import requests
from bs4 import BeautifulSoup
print('Loading function')
s3 = boto3.resource('s3')
def lambda_handler(event, context):
# Get the object from the event and show its content type
JST = timezone(timedelta(hours=+9), 'JST')
dt_now = datetime.datetime.now(JST)
date_str = dt_now.strftime('%Y Jahr%m Monat%d Tag')
response = requests.get('https://mainichi.jp/editorial/')
soup = BeautifulSoup(response.text)
pages = soup.find("ul", class_="list-typeD")
articles = pages.find_all("article")
links = [ "https:" + a.a.get("href") for a in articles if date_str in a.time.text ]
for i, link in enumerate(links):
bucket_name = "[Eimername]"
folder_path = "/tmp/"
filename = 'article_{0}_{1}.txt'.format(dt_now.strftime('%Y-%m-%d'), i + 1)
try:
bucket = s3.Bucket(bucket_name)
with open(folder_path + filename, 'w') as fout:
fout.write(extract_article(link))
bucket.upload_file(folder_path + filename, filename)
os.remove(folder_path + filename)
except Exception as e:
print(e)
raise e
return {
"date" : dt_now.strftime('%Y-%m-%d %H:%M:%S')
}
#Editorial extrahieren
def extract_article(src):
response = requests.get(src)
soup = BeautifulSoup(response.text)
text_area = soup.find(class_="main-text")
title = soup.h1.text.strip()
sentence = "".join([txt.text.strip() for txt in text_area.find_all(class_="txt")])
return title + "\n" + sentence
Dadurch werden zwei Textdateien mit den Artikeln hinzugefügt, die in den S3-Bucket extrahiert wurden, indem Sie "Bereitstellen" -> "Testen" auswählen.
Es ist lange her, aber Lambdas Einstellungen sind vollständig.
Amazon EventBridge
Ich konnte damit umgehen, aber es ist wirklich mühsam, jeden Morgen den "Test" -Knopf zu drücken. Verwenden Sie daher Amazon Event Bridge, um die regelmäßige Ausführung einzurichten.
Amazon EventBridge → Ereignisse → Regeln auswählen, Drücken Sie "Regel erstellen".
Schreiben Sie den Regelnamen und die Beschreibung, und da der Cron-Ausdruck in der Standardzeit ausgeführt wird, führen Sie ihn um 7:00 Uhr japanischer Zeit als 0 22 * *? *
Aus.
Wählen Sie den Ziel-Lambda-Namen im Ziel aus und erstellen Sie ihn.
Das ist es.
Post-Scripting Als Plan danach werde ich ein Jahr lang die Leitartikel mehrerer Zeitungsunternehmen auf Lager haben und maschinelles Lernen ausprobieren. Es wäre schön, wenn Sie alle Seiten mit "Anfragen" erhalten könnten, aber wenn Sie eine Site haben, die beim Laden der Seite geladen und aufgelistet wird (z. B. Asahi Shimbun), müssen Sie den Browser mit "Selen" steuern. Es gibt.
Recommended Posts