[PYTHON] Créez un programme qui peut générer votre image préférée avec Selenium

introduction

Récemment, en tant que passe-temps personnel, j'ai créé un programme pour dessiner et tweeter la carte de distribution de l'intensité sismique d'un tremblement de terre, et la génération d'images utilisée ici Je pense que je vais l'écrire sous forme de mémorandum parce que je pense qu'il peut être utilisé avec d'autres choses.

principe

Le framework ** Selenium ** de Python est utilisé pour tester les applications Web, mais il est également utilisé pour le scraping de sites dynamiques. Le rendu est effectué avec Headless Prouser de Google Chrome, un Chrome basé sur CUI.

Puisque Selenium a une fonction de capture d'écran, vous pouvez créer votre image préférée avec HTML / CSS en configurant un serveur local et en y obtenant les informations nécessaires.

Les choses nécessaires

Pour le moment, Selenium semble également être dans Ruby et JS. Un cadre pour capturer des pages Web. La méthode d'installation avec pip est la suivante

pip install selenium

Ce n'est pas nécessaire si Chrome est déjà installé sous Windows ou Mac, mais lors de son exécution sur VPN, il est exécuté en mettant Chrome dans Docker.

Node.js, Deno, etc. sont également OK. Cette fois, nous utiliserons Flsak, un framework Python.

créer

Le code source créé cette fois-ci peut être trouvé à ici.

Créer un serveur Web

Cette fois, créez-le avec Flask et assemblez-le en tant que conteneur avec Docker compose. Par conséquent, j'aimerais gérer les modules Python avec pipenv.

Entrez ce qui suit pour installer Pipenv et installer Flask.

pip install pipenv
pipenv --python 3.8
pipenv install flask

De plus, ajoutez un fichier manquant, etc. et procédez comme suit. La structure des répertoires est la suivante.

server
   ├── Dockerfile
   ├── Pipfile
   ├── Pipfile.lock
   ├── run.py
   ├── static
   │  └── css
   │     └── style.css
   └── templates
      └── index.html

Créez run.py, ʻindex.html et style.css` comme vous le souhaitez. Cette fois, nous afficherons uniquement la chaîne de caractères GET avec le paramètre URL à l'écran.

Le Dockerfile est décrit comme suit. Le port de sortie est de 5000, mais je pense que ça va.

Dockerfile


FROM python:3.8

COPY run.py /run.py
COPY templates /templates
COPY static /static
COPY Pipfile /Pipfile
COPY Pipfile.lock /Pipfile.lock

RUN pip install pipenv
RUN pipenv install --system --deploy

EXPOSE 5000

Essayez pipenv shell && python run.py, et s'il peut être affiché normalement sur un navigateur, etc., c'est OK.

Faire une partie de capture

Créez un fichier programme pour la génération en haut du répertoire server créé précédemment. Le répertoire devrait ressembler à ceci.

.
├── docker-compose.yml
├── Dockerfile
├── images
├── main.py
├── Pipfile
├── Pipfile.lock
├── README.md
└── server

Le module à installer avec pipenv est Selenium.

pipenv install selenium

Le Dockerfile pour la génération d'images est le suivant. Vous devez également installer Google Chrome.

Dockerfile


FROM python:3.8

COPY main.py /main.py
COPY Pipfile /Pipfile
COPY Pipfile.lock /Pipfile.lock

RUN apt-get update && apt-get install -y unzip

#install google-chrome, vim
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add && \
    echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list && \
    apt-get update && \
    apt-get install -y google-chrome-stable
RUN apt-get install -y vim

#install ChromeDriver
ADD https://chromedriver.storage.googleapis.com/84.0.4147.30/chromedriver_linux64.zip /opt/chrome/
RUN cd /opt/chrome/ && \
    unzip chromedriver_linux64.zip

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/chrome

RUN pip install pipenv
RUN pipenv install --system --deploy

ʻADD https://chromedriver.storage.googleapis.com/84.0.4147.30/chromedriver_linux64.zip / opt / chrome / `nécessite un lien vers la version actuelle de Chrome

https://chromedriver.storage.googleapis.com/index.html

De, collez le lien de la version actuelle.

De plus, créez docker-compose.yml pour connecter le conteneur de serveur à ce conteneur.

docker-compose.yml


version:  '3'
services:
    server:
        container_name: server
        build:
            context: server
            dockerfile: Dockerfile
        ports:
            - '5000:5000'
        tty: true
        # restart: always
        command: python3 run.py
    main:
        container_name: main
        build: .
        tty: true
        # restart: always
        links:
            - server
        volumes:
            - ./images/:/images/
        command: python3 main.py

L'important ici est que si vous souhaitez utiliser l'image générée en dehors de Docker, vous devez spécifier le répertoire pour l'enregistrer dans volumes.

Vous trouverez beaucoup de main.py comme méthode de capture Selenium, mais cette fois nous allons le créer comme ça.

main.py


import os

from selenium import webdriver


def main():
    image_save_path = os.path.join('images', 'image.png')

    text = 'Hello'

    captcha(image_save_path, text)


def captcha(image_save_path: str, text: str) -> None:
    url = f'http://server:5000/?text={text}'

    options = webdriver.ChromeOptions()

    options.add_argument('--headless')
    options.add_argument('--no-sandbox')

    driver = webdriver.Chrome(options=options)

    driver.set_window_size(1920, 1080)
    driver.execute_script("document.body.style.zoom='100%'")
    driver.get(url)
    driver.implicitly_wait(3)
    driver.save_screenshot(image_save_path)
    driver.quit()


if __name__ == "__main__":
    main()

Essayez de bouger

docker-compose up

Si l'image est réellement générée dans le répertoire ʻimages`, elle réussit.

Code source: https://github.com/yuto51942/image-generate

finalement

L'image est générée de la même manière pour Earthquake-alert que j'ai récemment créée en tant que passe-temps, alors jetez un œil. Je veux aussi Star.

Vous pourrez peut-être générer des images avec d'autres méthodes, mais je pense que cette méthode est la manière la plus flexible de générer diverses images. Essayez-le.

Recommended Posts

Créez un programme qui peut générer votre image préférée avec Selenium
Créez une API Web capable de fournir des images avec Django
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
[Python] Un programme qui crée des escaliers avec #
[Python] Un programme qui trouve le nombre maximum de jouets pouvant être achetés avec votre argent
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Nogizaka46 Un programme qui enregistre automatiquement les images de blog
Créer une page qui se charge indéfiniment avec python
Vous pouvez facilement créer une interface graphique même avec Python
Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV
Générez des phrases aléatoires à partir de vos tweets avec trigramme
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Créez un lot d'images et gonflez avec ImageDataGenerator
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Configurer un environnement de test automatique du navigateur qui peut exécuter Selenium + Pytest avec Docker Compose
Votre dll est-elle une dll qui peut tirer parti du multi-core?
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Créez une PythonBox qui sort avec Random après l'entrée PEPPER
Générez un mot de passe facile à retenir avec apg
Créons un script qui s'enregistre avec Ideone.com en Python.
Créez un jeu de vie mis à jour manuellement avec tkinter
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
[Golang] Un programme qui détermine le tour avec des nombres aléatoires
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Faisons un diagramme sur lequel on peut cliquer avec IPython
Créer une page d'accueil avec django
Créer un répertoire avec python
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
[Python] Créez un graphique qui peut être déplacé avec Plotly
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
[Python] Sur la base de votre image de bureau préférée, créons automatiquement un thème terminal / Vim / VS Code qui correspond à votre sentiment avec une seule commande.
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Créez un graphique des devises qui peut être déplacé avec Plotly (2)
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Créez un graphique des devises qui peut être déplacé avec Plotly (1)
Introduction de la commande ls lsix qui peut afficher une liste d'images
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
Générer une distribution normale avec SciPy
Créez un environnement virtuel avec Python!
Faisons une image LGTM avec GIMP! (Python-fu)
Générer une URL pré-signée avec golang
[Python] Générer un mot de passe avec Slackbot
Créez un stepper de poisson avec numpy.random
Créer un téléchargeur de fichiers avec Django
Technologie qui prend en charge un service de jet d'argent qui peut monétiser un blog avec une seule balise
[EC2] Comment faire une capture d'écran de votre smartphone avec du sélénium
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
Le panneau Web LXC qui peut faire fonctionner LXC avec un navigateur était merveilleux
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Créez un Discord Bot qui peut rechercher et coller des images