[PYTHON] Holen Sie sich Splunk Download-Link durch Scraping

1. Ich möchte einen Download-Link für das Installationsprogramm erhalten

Ich verwende AWS EC2, wenn ich schnell eine Splunk-Überprüfungsumgebung für Unternehmen erstellen möchte. Jedes Mal, wenn ich CloudFormation verwende, um das Erstellen und Zerstören zu automatisieren, muss ich auf der Website einen Download-Link zum Splunk-Installationsprogramm finden. Da die Linkerfassung ziemlich mühsam ist, habe ich mich entschlossen, Scraping in Python zu implementieren.

2. Verwendete Funktionen und Technologien

Die Code-Implementierung in API Gateway und Lambda wird in diesem Artikel weggelassen, da die Vorfahren viel Wissen an Qiita verloren haben. Das Folgende ist ein Artikel, auf den ich mich bezog.

[Python] Verwenden eines externen Moduls mit AWS Lambda Ich habe mit AWS Lambda eine einfache REST-API erstellt

3. Bibliothek

Ziehen Sie mit Anfragen HTML von der offiziellen Website von Splunk. Lesen Sie den erworbenen HTML-Code mit Beautiful Soup und extrahieren Sie mit re die erforderlichen Informationen mit einem regulären Ausdruck. Ich denke, es gibt viele andere Möglichkeiten, um zu kratzen, aber ich denke, es ist einfacher, Anforderungen in Fällen zu verwenden, in denen Bildschirmübergänge nicht benötigt werden. Ich habe Selenium diesmal nicht verwendet, da es schwierig ist, den Treiber des Browsers zu verwalten, und ich wenig Erfahrung damit habe.

4. Code

Das Folgende ist sofort der implementierte Code.

lambda_function.py


import requests
import re
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    #Erfassung von Betriebssysteminformationen
    os_type = event.get("os")

    #Für Linux erhalten Sie auch die Erweiterung
    filename_extension = ""
    if os_type == "Linux":
        filename_extension = event.get("filename_extension")

    #Installer-Typ abrufen
    installer_type = event.get("installer")

    #Holen Sie sich die Zielversion
    target_version = event.get("version")

    #Holen Sie sich das HTML-Tag der Zielversion
    html_tag = get_old_installer_link(os_type, installer_type, filename_extension, target_version)
    #Wenn die Zielversion in älteren Versionen nicht vorhanden ist, rufen Sie die neueste Version ab
    if len(html_tag) == 0:
        html_tag = get_new_installer_link(os_type, installer_type, filename_extension)

    #Extrahieren Sie den Download-Link aus dem erworbenen Tag
    dl_link = dl_link_extraction(html_tag)

    #Rückgabe des Ausführungsergebnisses
    return {
        'statusCode': 200,
        'body': dl_link
    }


def get_old_installer_link(os, installer, extension, version):
    #Verzweigen Sie den Ausführungsinhalt für jedes Installationsprogramm
    if installer == "EP":
        # EnterPrise
        #Holen Sie sich alte Version
        old_r = requests.get('https://www.splunk.com/page/previous_releases')
        old_soup = BeautifulSoup(old_r.content, "html.parser")

        #Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
        if os == "Windows":
            html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Windows"})
        elif os == "Linux":
            html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})

    elif installer == "UF":
        # UniversalForwarder
        #Holen Sie sich alte Version
        old_r = requests.get('https://www.splunk.com/page/previous_releases/universalforwarder')
        old_soup = BeautifulSoup(old_r.content, "html.parser")

        #Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
        if os == "Windows":
            html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Windows"})
        elif os == "Linux":
            html_list = old_soup.find_all("a", attrs={"data-version": version, "data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})

    return html_list


def get_new_installer_link(os, installer, extension):
    #Verzweigen Sie den Ausführungsinhalt für jedes Installationsprogramm
    if installer == "EP":
        # EnterPrise
        #Holen Sie sich eine neue Version
        new_r = requests.get('https://www.splunk.com/ja_jp/download/splunk-enterprise.html')
        new_soup = BeautifulSoup(new_r.content, "html.parser")

        #Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
        if os == "Windows":
            html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Windows"})
        elif os == "Linux":
            html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})

    elif installer == "UF":
        # UniversalForwarder
        new_r = requests.get('https://www.splunk.com/ja_jp/download/universal-forwarder.html')
        new_soup = BeautifulSoup(new_r.content, "html.parser")

        #Verzweigen Sie den Ausführungsinhalt für jedes Betriebssystem
        if os == "Windows":
            html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Windows"})
        elif os == "Linux":
            html_list = new_soup.find_all("a", attrs={"data-arch": "x86_64", "data-platform": "Linux", "data-link": re.compile(r'\.' + extension)})

    return html_list


def dl_link_extraction(tag):
    #Download-Link mit kanonischem Ausdruck extrahieren
    link = re.search(r'data-link=\"([^\"]+)\"', str(tag[0])).group(1)
    return link

Grundsätzlich gibt es keine Fehlerkontrolle. Unabhängig davon, was passiert, wird der Status als 200 zurückgegeben. Eigentlich ist es besser, eine feste Fläche zu haben, aber diesmal bitte verzeihen Sie mir.

5. Ausführungsbeispiel

Geben Sie dem API-Gateway Parameter und treffen Sie den Endpunkt mit Curl. Es müssen vier Arten von Parametern hinzugefügt werden: das zu installierende Betriebssystem, das Zielinstallationsprogramm, die Erweiterung des Installationsprogramms und die Zielversion. Die Einstellwerte für jeden Parameter sind wie folgt. (Wenn Sie etwas anderes eingeben, wird der Download-Link nicht zurückgegeben ...)

Für Windows müssen Sie keine Erweiterung auswählen, sodass es keine Rolle spielt, ob Dateiname_Erweiterung leer ist. Im Folgenden wird das 7.2.3 Universal Forwarder-Installationsprogramm mit tgz unter Linux installiert.

curl -X POST "https://xxxxxxxxxx.execute-api.ap-xxxxxxxxx-x.amazonaws.com/xxx/xxxxx" -d "{\"os\": \"Linux\",\"installer\": \"UF\",\"version\": \"7.2.3\",\"filename_extension\": \"tgz\"}"

Das Folgende ist das Ausführungsergebnis. Ein Statuscode und ein Download-Link werden zurückgegeben. (Der Statuscode kommt immer mit 200 zurück ...) WS_000000.JPG

6. Zusammenfassung

Obwohl ich es kurz geschrieben habe, habe ich festgestellt, dass der Code ziemlich rau ist. Ich werde es reparieren, wenn ich eine Chance habe.

Wie auch immer, Sie können jetzt den Download-Link kratzen. Sie können Ihren CloudFormation-Benutzerdaten jetzt eine Curl-Anweisung hinzufügen, um beim Erstellen einer EC2-Instanz einen Download-Link zu erhalten. Ich bin froh, dass ich von der Arbeit befreit wurde, Download-Links einzeln abzurufen und einzufügen ... Als nächstes muss ich CloudFormation schreiben ...

Recommended Posts

Holen Sie sich Splunk Download-Link durch Scraping
Nogizaka46 Holen Sie sich Blog-Bilder durch Schaben
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
Holen Sie sich iPad Wartung durch Scraping und benachrichtigen Sie Slack
Ich habe versucht, durch Schaben ein Bild zu bekommen
Holen Sie sich Qiitas "Gefällt mir" -Liste durch Schaben
Holen Sie sich Informationen zu Bootsrennen mit Web Scraping
Laden Sie Bilder automatisch mit Scraping herunter
Bildersammlung mit Web Scraping
Rufen Sie die URL des Linkziels ab, indem Sie den Textsatz mit Python Scraping (Beautiful Soup) + XPath angeben
Einzeiliges Web-Scraping mit tse