[PYTHON] Web Scraping mit AWS Lambda

Background Fortsetzung von FizzBuzz mit AWS Lambda. Diesmal habe ich versucht, durch Scraping Daten von einer externen Webseite abzurufen.

AWS Architecture archtecture.png

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.

S3-Einstellungen

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.

Fügen Sie einer Rolle Berechtigungen hinzu

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.

Grundlegende Konfiguration

Die Verarbeitung schlug fehl, wenn der Speicher klein war. Speicher: 256 MB, Timeout auf 10 Sekunden einstellen.

Das ist es.

Entwicklung (Datei senden)

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.

Entwicklung (Web Scraping)

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

Web Scraping mit AWS Lambda
[Python] Scraping in AWS Lambda
Web Scraping mit Selenium (Python)
Web Scraping
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Tweet WakaTime Zusammenfassung mit AWS Lambda
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
[Anfänger] Leicht verständliches Python-Web-Scraping mit Google Colaboratory
Web Scraping (Prototyp)
Poste regelmäßig mit AWS Lambda auf Twitter!
Scraping mit Python
Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
Ich habe versucht, Web-Scraping mit Python und Selen
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1.8
Ein Forscher eines Pharmaunternehmens fasste das Web-Scraping mit Python zusammen
Erste Schritte mit Web Scraping
Tweet von AWS Lambda
Webanwendung mit Flasche (1)
Beispiel für die Verwendung von Lambda
Probieren Sie AWS Lambda Destinations aus
Entwickeln, Ausführen und Bereitstellen von AWS Lambda remote mit dem Lambda-Uploader
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
So konfigurieren Sie Layer auf Lambda mit AWS SAM
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Scraping mit Python 3.5 async / await
WEB-Anwendungsentwicklung mit Django-Entwicklung Teil 1-
Die einfachste AWS Lambda-Implementierung
Speichern Sie Bilder mit Web Scraping
Scraping mit Python 3.5 Async-Syntax
Suchtpunkte beim Herunterladen von Dateien mit boto auf AWS Lambda
WEB-Scraping-Technologie und Bedenken
Kompromisse beim Web Scraping & Crawlen
Versuchen Sie es mit AWS SageMaker Studio
Einfaches Web-Scraping mit Scrapy
Bildersammlung mit Web Scraping
PyTorch mit AWS Lambda [Lambda-Import]
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
Web Scraping Anfänger mit Python
Web-Scraping-Bibliothek mit Algorithmen Scrapely
Einzeiliges Web-Scraping mit tse
Ich habe versucht, AWS Chalice zu verwenden
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
Ich habe eine Instanz zu einem bestimmten Zeitpunkt mit AWS Lambda gestoppt
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Ich habe Node.js und Python beim Erstellen eines Miniaturbilds mit AWS Lambda verglichen
Lassen Sie uns einen Web-Chat mit WebSocket mit AWS serverless (Python) durchführen!
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Entwicklung einer WEB-Anwendung mit Django [Django-Start]
Gegenmaßnahmen gegen Proxy bei Verwendung der WEB-API
Entwicklung einer WEB-Anwendung mit Django [Anwendungszusatz]
Berühren Sie Unterstützung für AWS Lambda-Umgebungsvariablen
[AWS] API mit API Gateway + Lambda erstellen
Meteorologie x Ruby ~ Ruby Scraping mit Mechanize ~
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Scraping von Alexas Web Rank mit pyQuery