Kürzlich habe ich als persönliches Hobby ein Programm zum Zeichnen und Twittern der seismischen Intensitätsverteilungskarte eines Erdbebens und die dort verwendete Bilderzeugung erstellt Ich denke, ich werde es als Memorandum schreiben, weil ich denke, dass es mit anderen Dingen verwendet werden kann.
Das ** Selenium ** -Framework von Python wird zum Testen von Webanwendungen verwendet, aber auch zum Scrapen dynamischer Websites. Das Rendern erfolgt mit dem Headless Prouser von Google Chrome, einem CUI-basierten Chrome.
Da Selenium über eine Screenshot-Funktion verfügt, können Sie Ihr Lieblingsbild mit HTML / CSS erstellen, indem Sie einen lokalen Server einrichten und dort die erforderlichen Informationen abrufen.
Python
Selenium
Derzeit scheint Selen auch in Ruby und JS zu sein. Ein Framework zum Erfassen von Webseiten. Die Installationsmethode mit pip ist wie folgt
pip install selenium
Es ist nicht erforderlich, wenn Chrome bereits unter Windows oder Mac installiert ist. Bei der Ausführung über VPN wird Chrome jedoch in Docker ausgeführt.
--Lokaler Server
Node.js, Deno usw. sind ebenfalls in Ordnung. Dieses Mal werden wir Flsak verwenden, ein Python-Framework.
Der diesmal erstellte Quellcode finden Sie unter hier.
Erstellen Sie es diesmal mit Flask und stellen Sie es als Container mit Docker Compose zusammen. Daher möchte ich Python-Module mit pipenv verwalten.
Geben Sie Folgendes ein, um Pipenv und Flask zu installieren.
pip install pipenv
pipenv --python 3.8
pipenv install flask
Fügen Sie außerdem eine fehlende Datei usw. hinzu und gehen Sie wie folgt vor. Die Verzeichnisstruktur ist wie folgt.
server
├── Dockerfile
├── Pipfile
├── Pipfile.lock
├── run.py
├── static
│ └── css
│ └── style.css
└── templates
└── index.html
Erstellen Sie "run.py", "index.html" und "style.css" nach Ihren Wünschen. Dieses Mal wird nur die Zeichenfolge GET mit dem URL-Parameter auf dem Bildschirm angezeigt.
Die Docker-Datei wird wie folgt beschrieben. Der Ausgangsport ist 5000, aber ich denke, es ist okay.
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
Versuchen Sie pipenv shell && python run.py
und wenn es normal in einem Browser usw. angezeigt werden kann, ist es OK.
Erstellen Sie eine Programmdatei zur Generierung oben im zuvor erstellten "Server" -Verzeichnis. Das Verzeichnis sollte so aussehen.
.
├── docker-compose.yml
├── Dockerfile
├── images
├── main.py
├── Pipfile
├── Pipfile.lock
├── README.md
└── server
Das mit pipenv zu installierende Modul ist Selen.
pipenv install selenium
Die Docker-Datei für die Bilderzeugung lautet wie folgt. Dazu muss auch Google Chrome installiert sein.
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 /
erfordert einen Link zur aktuellen Chrome-Version
https://chromedriver.storage.googleapis.com/index.html
Fügen Sie von den Link für die aktuelle Version ein.
Erstellen Sie außerdem "docker-compose.yml", um den Servercontainer mit diesem Container zu verbinden.
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
Das Wichtigste dabei ist, dass Sie, wenn Sie das generierte Image außerhalb von Docker verwenden möchten, das Verzeichnis angeben müssen, in dem es in "Volumes" gespeichert werden soll.
Sie werden eine Menge von "main.py" als Selenium-Erfassungsmethode finden, aber dieses Mal werden wir es so erstellen.
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
Wenn die Bilder tatsächlich im Verzeichnis "images" generiert werden, ist dies erfolgreich.
Quellcode: https://github.com/yuto51942/image-generate
Das Bild wird auf die gleiche Weise für Erdbeben-Alarm erstellt, die ich kürzlich als Hobby erstellt habe. Schauen Sie also bitte mal rein. Ich will auch Star.
Möglicherweise können Sie Bilder mit anderen Methoden generieren, aber ich denke, diese Methode ist die flexibelste Methode, um verschiedene Bilder zu generieren. Versuch es bitte.