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.
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.
Python
Selenium
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.
Le code source créé cette fois-ci peut être trouvé à ici.
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.
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()
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
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