Wenn Sie beim Erstellen eines Web Scraper mit Python das Ziel mit clientseitigem Javascript erreichen, ist es häufig nicht möglich, die gewünschten Informationen einfach mit urlopen abzurufen. Daher denke ich, dass es oft durch Selen oder API (falls vorhanden) erhalten wird.
Wenn Sie jedoch regelmäßig und wirtschaftlich etwas unternehmen möchten, ist es eine gute Idee, On-Demand-AWS-Lambdas und CloudEvents zu verwenden.
Lasst uns beginnen
Um AWS Lambda mit Amazon Linux als Betriebssystem in einer Windows-Umgebung verwenden zu können, benötigen Sie die Unterstützung von ** Ubuntu unter Windows 10 ** oder einem anderen Remote-Linux-Server. Dieses Mal habe ich Ubuntu unter Windows 10 als wirtschaftlichere Methode gewählt.
Die spezifische Installationsmethode finden Sie im Folgenden.
Verwenden von Linux unter Windows 10
Als nächstes setzen Sie Python ein.
sudo apt-get update
sudo apt-get install python3.6
Wenn die Umgebung fertig ist, gehen Sie unter Ubuntu wie folgt vor.
#Wechseln Sie zur C-Disk
cd /mnt/c/
mkdir /path/to/folder
cd /path/to/folder
So generieren und finden Sie die Datei schnell im Datei-Explorer. (Es wird bequem sein, es später in S3 zu setzen)
――Es ist hier zu beachten, dass selbst bei Verwendung einer neuen Version von Headless-Chrom ein Fehler auftritt, sofern es sich nicht um einen entsprechenden Chromtreiber handelt. Ich habe die folgenden zwei verwendet
stable-headless-chromium-64.0.3282.167-amazonlinux-2017-03.zip
chromedriver_linux64.zip
--Nächste, entpacken Sie sie, passen Sie die Berechtigungen wie unten gezeigt an (chmod 777
) und speichern Sie sie schließlich wie unten gezeigt im Chrome-Ordner und komprimieren Sie sie in eine ZIP-Datei.
chrome.zip
chrome
├── chromedriver
└── headless-chromium
--Erstellen Sie eine ZIP-Datei für ein Selenium-Paket unter Ubuntu.
mkdir python-selenium
cd python-selenium
python3 -m pip install --system --target ./ selenium
zip -r python-selenium.zip ../python-selenium
--Geben Sie chrome.zip
& python-selenium.zip
in S3 ein, notieren Sie sich die Objekt-URL und erstellen Sie eine Ebene.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def lambda_handler(event, context):
options = Options()
#Geben Sie Ihren entsprechenden Dateipfad ein
options.binary_location = '/opt/chrome/headless-chromium'
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
#Geben Sie Ihren entsprechenden Dateipfad ein
browser = webdriver.Chrome('/opt/chrome/chromedriver', chrome_options=options)
browser.get('https://www.google.com')
title = browser.title
browser.close()
browser.quit()
return {"title": title}
Hierbei ist zu beachten, dass die Grundeinstellung der Lambda-Funktion mehr als 256 MB Speicher benötigt, um das Beispiel auszuführen, und die Dauer im Voraus etwa 10 Sekunden (512 MB, Timeout: 20s-Einstellung) dauert. Es ist besser, sich an die Situation anzupassen und sie zu sehen.
Q&A
Sie wundern sich vielleicht, schreiben Sie also auf, über wie viele Dinge Sie verwirrt waren, als Sie es getan haben.
F: Warum in den Chrome-Ordner legen und komprimieren?
A: Es ist nicht erforderlich, aber wenn Sie Lambda eine Ebene hinzufügen, wird die in der Zip-Datei an den Ordner "/ opt" angehängt. Zum Beispiel "/ opt / chrome / chromedriver" und "/ opt / chrome / headless-chrom"
F: Ist es, wie in der Abbildung gezeigt, nicht möglich, das Zippen von Windows zu verwenden?
A: Wenn ich es tatsächlich auf Layer hochlade, wird die Fehlermeldung "Nachricht: Die ausführbare Datei" chromedriver "hat möglicherweise falsche Berechtigungen" angezeigt. Daher habe ich sie überprüft und es scheint, dass die Berechtigungen nicht ordnungsgemäß funktionieren. Passen wir daher die Berechtigungen der Datei unter Ubuntu an und komprimieren sie.
Keine Panik, wenn Fehler auftreten. Überprüfen Sie den Fehlerbericht nach dem Ausführen des Lambda-Tests. Überraschenderweise ist das Problem klar geschrieben.
Recommended Posts