[PYTHON] Obtenez le lien de téléchargement Splunk en grattant

1. Je souhaite obtenir un lien de téléchargement pour le programme d'installation

J'utilise AWS EC2 lorsque je souhaite créer rapidement un environnement de vérification Splunk pour les entreprises. Chaque fois que j'utilise CloudFormation pour automatiser la construction et la destruction, je dois aller sur le site pour obtenir un lien de téléchargement sur le programme d'installation de Splunk. Le travail d'acquisition de lien étant assez gênant, j'ai décidé de mettre en œuvre le scraping en Python.

2. Fonctions et technologies utilisées

L'implémentation du code dans API Gateway et Lambda est omise dans cet article car les ancêtres ont perdu beaucoup de connaissances au profit de Qiita. Ce qui suit est un article auquel j'ai fait référence.

[Python] Utilisation d'un module externe avec AWS Lambda J'ai créé une API REST simple avec AWS Lambda

3. Bibliothèque

Tirez le HTML du site Web officiel de Splunk avec des demandes. Lisez le HTML acquis avec Beautiful Soup et utilisez re pour extraire les informations nécessaires avec une expression régulière. Je pense qu'il existe de nombreuses autres façons de gratter, mais je pense qu'il est plus facile d'utiliser les demandes dans les cas où les transitions d'écran ne sont pas nécessaires. Je n'ai pas utilisé Selenium cette fois car il est difficile de gérer le pilote du navigateur et j'ai peu d'expérience de son utilisation.

4. Code

Immédiatement, voici le code implémenté.

lambda_function.py


import requests
import re
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    #Acquisition des informations OS
    os_type = event.get("os")

    #Pour Linux, obtenez également l'extension
    filename_extension = ""
    if os_type == "Linux":
        filename_extension = event.get("filename_extension")

    #Obtenir le type d'installation
    installer_type = event.get("installer")

    #Obtenez la version cible
    target_version = event.get("version")

    #Récupérez la balise HTML de la version cible
    html_tag = get_old_installer_link(os_type, installer_type, filename_extension, target_version)
    #Si la version cible n'existe pas dans les versions plus anciennes, obtenez la dernière version
    if len(html_tag) == 0:
        html_tag = get_new_installer_link(os_type, installer_type, filename_extension)

    #Extraire le lien de téléchargement de la balise acquise
    dl_link = dl_link_extraction(html_tag)

    #Retour du résultat de l'exécution
    return {
        'statusCode': 200,
        'body': dl_link
    }


def get_old_installer_link(os, installer, extension, version):
    #Branche le contenu de l'exécution pour chaque installateur
    if installer == "EP":
        # EnterPrise
        #Obtenir l'ancienne version
        old_r = requests.get('https://www.splunk.com/page/previous_releases')
        old_soup = BeautifulSoup(old_r.content, "html.parser")

        #Branche le contenu de l'exécution pour chaque système d'exploitation
        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
        #Obtenir l'ancienne version
        old_r = requests.get('https://www.splunk.com/page/previous_releases/universalforwarder')
        old_soup = BeautifulSoup(old_r.content, "html.parser")

        #Branche le contenu de l'exécution pour chaque système d'exploitation
        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):
    #Branche le contenu de l'exécution pour chaque installateur
    if installer == "EP":
        # EnterPrise
        #Obtenir une nouvelle version
        new_r = requests.get('https://www.splunk.com/ja_jp/download/splunk-enterprise.html')
        new_soup = BeautifulSoup(new_r.content, "html.parser")

        #Branche le contenu de l'exécution pour chaque système d'exploitation
        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")

        #Branche le contenu de l'exécution pour chaque système d'exploitation
        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):
    #Extraire le lien de téléchargement avec l'expression canonique
    link = re.search(r'data-link=\"([^\"]+)\"', str(tag[0])).group(1)
    return link

Fondamentalement, il n'y a pas de contrôle des erreurs. Quoi qu'il arrive, le statut sera retourné à 200. En fait, il vaut mieux avoir une zone solide, mais cette fois, pardonnez-moi.

5. Exemple d'exécution

Donnez des paramètres à API Gateway et atteignez le point de terminaison avec curl. Il existe quatre types de paramètres à ajouter: le système d'exploitation à installer, le programme d'installation cible, l'extension du programme d'installation et la version cible. Les valeurs de réglage correspondant à chaque paramètre sont les suivantes. (Si vous entrez autre chose, le lien de téléchargement ne sera pas retourné ...)

Pour Windows, vous n'avez pas besoin de sélectionner une extension, donc peu importe si filename_extension est vide. Ce qui suit est un cas d'obtention du programme d'installation 7.2.3 Universal Forwarder avec tgz sous Linux.

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\"}"

Voici le résultat de l'exécution. Un code de statut et un lien de téléchargement seront renvoyés. (Le code d'état revient toujours avec 200 ...) WS_000000.JPG

6. Résumé

Même si je l'ai écrit brièvement, j'ai réalisé que le code est assez approximatif. Je vais le réparer si j'ai une chance.

Quoi qu'il en soit, vous pouvez maintenant gratter le lien de téléchargement. Vous pouvez maintenant ajouter une instruction curl à vos données utilisateur CloudFormation pour obtenir un lien de téléchargement lors de la création d'une instance EC2. Je suis heureux d'avoir été libéré du travail de récupération et de collage des liens de téléchargement un par un ... Ensuite, je dois écrire CloudFormation ...

Recommended Posts

Obtenez le lien de téléchargement Splunk en grattant
Nogisaka 46 Obtenez des images de blog en grattant
Obtenez des informations sur la propriété en grattant avec python
Obtenez la maintenance de l'iPad en grattant et en informant Slack
J'ai essayé d'obtenir une image en grattant
Obtenez la liste "J'aime" de Qiita en grattant
Obtenez des informations sur les matchs de course de bateaux avec le web scraping
Télécharger automatiquement des images avec grattage
Collection d'images avec scraping Web
Obtenez l'URL de destination du lien en spécifiant la phrase de texte avec le grattage Python (Beautiful Soup) + XPath
Grattage de bande sur une seule ligne avec du tsé