Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
Einführung
`Dies ist ein Artikel über die Mac-Umgebung, aber die Vorgehensweise ist für die Windows-Umgebung dieselbe. Bitte lesen und probieren Sie den umweltabhängigen Teil. ``
Zweck
Nachdem Sie diesen Artikel bis zum Ende gelesen haben, können Sie:
| No. |
Überblick |
Stichwort |
| 1 |
Codierung |
Python |
| 2 |
WEB-Scraping |
Selenium,chromedriver,headless-chromium |
| 3 |
Lambda-Einstellungen |
Lambda |
Ausführungsumgebung
| Umgebung |
Ver. |
| macOS Catalina |
10.15.3 |
| Python |
3.7.3 |
| selenium |
3.141.0 |
Quellcode
Ich denke, dass Sie Ihr Verständnis vertiefen können, indem Sie den Implementierungsinhalten und dem Quellcode tatsächlich folgen. Bitte benutzen Sie es auf jeden Fall.
GitHub
Zum Thema passende Artikel
Merkmale von AWS-Lambda
Dieser Service ist ein Pay-as-you-go-System. Bitte beachten Sie.
Gesamtdurchfluss
- Schreiben Sie Python-Code
- Erstellen Sie eine Zip-Datei zum Hochladen auf Lambda
- Erstellen Sie eine Lambda-Funktion
- Laden Sie den Reißverschluss in die Lambda-Funktion hoch
- (Ergänzung) Hochladen mit Ebenen
- Legen Sie Umgebungsvariablen für Lambda-Funktionen fest
- (Ergänzung) Legen Sie Umgebungsvariablen fest, wenn Sie Ebenen verwenden
- Richten Sie Cron so ein, dass es regelmäßig ausgeführt wird
1. Schreiben Sie Python-Code
Codierung
app/lambda_function.py
"""app/lambda_function.py
"""
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
def lambda_handler(event, context):
"""lambda_handler
"""
print('event: {}'.format(event))
print('context: {}'.format(context))
headless_chromium = os.getenv('HEADLESS_CHROMIUM', '')
chromedriver = os.getenv('CHROMEDRIVER', '')
options = Options()
options.binary_location = headless_chromium
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(executable_path=chromedriver, options=options)
driver.get('https://info.finance.yahoo.co.jp/fx/')
usd_jpy = driver.find_element(By.ID, 'USDJPY_top_bid').text
driver.close()
driver.quit()
return {
'status_code': 200,
'usd_jpy': usd_jpy
}
if __name__ == '__main__':
print(lambda_handler(event=None, context=None))
`Um mit Lambda arbeiten zu können, müssen Options () eingestellt werden. ``
2. Erstellen Sie eine Zip-Datei zum Hochladen auf Lambda
Skripterstellung
- Sie müssen die Version / den Pfad von "Chromedriver" und "Headless-Chrom" an Ihre Umgebung anpassen.
- Betrieb bestätigt ab Mai 2020.
make_upload.sh
rm upload.zip
rm -r upload/
rm -r download/
mkdir -p download/bin
curl -L https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip -o download/chromedriver.zip
curl -L https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-55/stable-headless-chromium-amazonlinux-2017-03.zip -o download/headless-chromium.zip
unzip download/chromedriver.zip -d download/bin
unzip download/headless-chromium.zip -d download/bin
mkdir upload
cp -r download/bin upload/bin
cp app/lambda_function.py upload/
pip install -r app/requirements.txt -t upload/
cd upload/
zip -r ../upload.zip --exclude=__pycache__/* .
cd ../
rm -r upload/
rm -r download/
Erstellen Sie upload.zip
command_line.sh
sh make_upload.sh
3. Erstellen Sie eine Lambda-Funktion
Voraussetzungen
--AWS-Konto erstellt
--Lambda-Funktionsrolle erstellt
Lambda-Funktionserstellung
- Melden Sie sich bei AWS an
- Öffnen Sie Lambda aus dem Dienst
- Wählen Sie im Untermenü "Funktion" und klicken Sie auf "Funktion erstellen".
- Wählen Sie "Von Grund auf neu erstellen", geben Sie "Funktionsname", "Laufzeit", "Ausführungsrolle" ein und klicken Sie auf "Funktion erstellen".
4. Laden Sie den Reißverschluss in die Lambda-Funktion hoch
`Ich habe es über S3 hochgeladen, weil es 10 MB überschritten hat. ``
hochladen
- Zeigen Sie den Abschnitt "Funktionscode" der Lambda-Funktion an
- Wählen Sie "ZIP-Datei hochladen"
- Wählen Sie "upload.zip" unter "Upload" und klicken Sie auf "Speichern"
Hochladen, wenn die Zip-Größe 10 MB überschreitet
- Laden Sie
upload.zip in S3 hoch
- Zeigen Sie den Abschnitt "Funktionscode" der Lambda-Funktion an
- Wählen Sie "Dateien von Amazon S3 hochladen"
- Geben Sie die "Amazon S3 Link URL" ein und klicken Sie auf "Speichern"
5. (Ergänzung) Hochladen mit Ebenen
Fluss hochladen
- Trennen Sie "bin" von "upload.zip" und erstellen Sie eine Zip-Datei mit bin allein
- Registrieren Sie "bin" in "Layers"
- Fügen Sie der Lambda-Funktion "Ebenen" hinzu
- Wählen Sie "ZIP-Datei hochladen", um "upload.zip" hochzuladen
5-1. Trennen Sie "bin" von "upload.zip" und erstellen Sie eine Zip-Datei mit bin allein
bin.sh
bin.zip
├── chromedriver
└── headless-chromium
5-2. Registrieren Sie "bin" in "Layers"
- Wählen Sie im Untermenü "Ebene" und klicken Sie auf "Ebene erstellen"
- Geben Sie einen beliebigen Namen ein
- Klicken Sie auf "Hochladen" und wählen Sie "bin.zip"
- Wählen Sie
Compatible Runtime-Option und klicken Sie auf Create
5-3. Fügen Sie der Lambda-Funktion "Ebenen" hinzu
- Wählen Sie die "Ebenen" aus, die in der Mitte des Abschnitts "Designer" der Lambda-Funktion angezeigt werden.
- Klicken Sie auf "Ebene hinzufügen" der unten angezeigten Ebene.
- Wählen Sie den in Layern registrierten Namen "bin.zip" aus und klicken Sie auf "Hinzufügen"
5-4. Wählen Sie "ZIP-Datei hochladen", um "upload.zip" hochzuladen
6. Legen Sie Umgebungsvariablen für Lambda-Funktionen fest
Einstellungen für Umgebungsvariablen
- Zeigen Sie den Abschnitt "Umgebungsvariable" der Lambda-Funktion an
| Schlüssel |
Wert |
| CHROMEDRIVER |
/var/task/bin/chromedriver |
| HEADLESS_CHROMIUM |
/var/task/bin/headless-chromium |
7. (Ergänzung) Legen Sie Umgebungsvariablen fest, wenn Sie Ebenen verwenden
Einstellung der Umgebungsvariablen für Ebenen
- Zeigen Sie den Abschnitt "Umgebungsvariable" der Lambda-Funktion an
| Schlüssel |
Wert |
| CHROMEDRIVER |
/opt/bin/chromedriver |
| HEADLESS_CHROMIUM |
/opt/bin/headless-chromium |
8. Richten Sie Cron so ein, dass es regelmäßig ausgeführt wird
Erstellen Sie Cron
- Zeigen Sie den Abschnitt "Designer" der Lambda-Funktion an und klicken Sie auf "Trigger hinzufügen"
- Wählen Sie in den Triggereinstellungen "CloudWatch Events / EventBridge"
- Wählen Sie in der Regel "Neue Regel erstellen"
- Geben Sie im Regelnamen einen beliebigen Regelnamen ein
- Wählen Sie im Regeltyp "Zeitplanausdruck"
- Geben Sie im Zeitplanausdruck "cron (0 17? * MON-FRI *)" ein und klicken Sie auf "Hinzufügen"
Beispiel für einen Cron-Ausdruck
| Frequenz |
Formel |
| Jeden Tag 10 Uhr:15 (UTC) |
cron(15 10 * * ? *) |
| Jeden Montag bis Freitag 18 Uhr:00 |
cron(0 18 ? * MON-FRI *) |
| 8 Uhr am ersten Tag eines jeden Monats:00 |
cron(0 8 1 * ? *) |
| Wochentags alle 10 Minuten |
cron(0/10 * ? * MON-FRI *) |
| Montag bis Freitag 8 Uhr:00 bis 17 Uhr:Alle 5 Minuten bis zu 55 |
cron(0/5 8-17 ? * MON-FRI *) |
| Jeden ersten Montag im Monat um 9 Uhr |
cron(0 9 ? * 2#1 *) |