[PYTHON] Grattez automatiquement le site reCAPTCHA quotidiennement (6/7: conteneurisation)

  1. Définition de l'exigence ~ construction de l'environnement python
  2. Créer un mécanisme de grattage de site
  3. Traitez le fichier téléchargé (xls) pour créer le produit final (csv)
  4. Télécharger le fichier depuis S3 / Créer un téléchargement de fichier vers S3
  5. Mettre en œuvre 2captcha
  6. ** Autoriser le démarrage dans le conteneur Docker **
  7. Inscrivez-vous au lot AWS

Faites-le fonctionner sur le serveur

Jusqu'à la dernière fois, une fois que vous l'avez démarré, il fonctionnera automatiquement sans rien faire d'autre. Si vous le définissez avec cron, vous pouvez l'exécuter tous les jours, mais si vous le laissez tel quel, vous maintiendrez votre PC en marche. Je veux le faire démarrer sur le serveur d'une manière ou d'une autre.

Le mur ici est que ** ce grattage nécessite l'affichage **. J'ai également essayé le mode sans tête de Chrome, mais cela n'a pas fonctionné.

Donc, cette fois, j'ai décidé de l'implémenter en utilisant un mécanisme appelé Xvfb qui peut créer un affichage virtuel, bien que ce soit une technologie un peu ancienne.

Xvfb est une application qui fonctionne sous Linux. J'ai donc décidé de l'implémenter à l'aide du conteneur Linux Docker et d'exécuter enfin le lot en utilisant AWS batch.

Création d'image Docker

Vérification pour la création

Commencez par créer l'image Docker que vous utilisez. J'utiliserai CentOS, qui semble avoir été beaucoup utilisé lorsque j'enquêtais sur Xvfb.

Commencez par partir de l'image centOS existante et installez effectivement l'application requise.

mac(host)


docker pull centos          #Extraction d'une image centOS depuis Docker Hub
docker run -it -d centos    #Début
docker ps                   #Confirmer le démarrage&Obtenir l'ID du conteneur
docker exec -it b7948c7802eb /bin/bash  #Entrez dans le terminal côté conteneur

Tout ce dont tu as besoin

Je vais donc installer chacun d'eux.

Essayez différentes choses dans le conteneur


yum install -y python36 #python mis
python3 -m pip install --upgrade pip #mettre pip
pip install requests #Essayez de mettre les packages nécessaires
...
yum -y install xorg-x11-server-Xvfb  #Installez Xvfb
yum -y install firefox  #Installez Firefox
Xvfb :1 -screen 0 1600x1200x16 & #Lancez Xvfb
export DISPLAY=:1 #:Utilisez l'affichage défini comme 1
firefox #Lancez Firefox

Oh. Je ne vois pas bien l'écran, mais il semble que Firefox fonctionne ...? Alors maintenant, exécutons mon programme ici.

Maintenant, j'ai commencé à créer le Dockerfile. En fait, il peut être plus efficace d'essayer d'utiliser la commande docker cp ou quelque chose comme ça.

Créer un Dockerfile

FROM centos
ENV TZ JST-9  #(1)

#Définir le répertoire personnel
ENV HOME=/home
WORKDIR $HOME

#Mon appli(Sous l'application)Sous la maison
COPY .  $HOME/

RUN yum install -y python36
RUN python3 -m pip install --upgrade pip
RUN pip install -r app/requirements.txt #(2)
RUN yum -y install xorg-x11-server-Xvfb
RUN yum -y install firefox

RUN chmod 744 startup.sh
CMD ["./startup.sh"]  #(3)

(1) Apparemment, le fuseau horaire sera UTC. Le temps étant important pour ce lot, nous modifions le fuseau horaire (2) Au début, j'écrivais ligne par ligne, mais c'était plus simple de les assembler, alors j'ai rassemblé les paquets nécessaires dans requirements.txt. Les packages requis sont ceux qui sont sortis avec la commande pip freeze. (3) J'ai trouvé qu'il était nécessaire de démarrer la commande Xvfb au moment de docker run, j'ai donc créé un shell et l'ai assemblé.

startup.sh


#!/usr/bin/env bash
Xvfb :1 -screen 0 1600x1200x16 &
export DISPLAY=:1
python3 app/source/run.py --run_mode test #À la fin je vais le rendre normal

Légèrement modifié pour fonctionner sous Linux

--gecko téléchargement du pilote pour linux

La structure finale du fichier ressemble à ceci.

├── Dockerfile
├── README.md
├── app
│   ├── drivers
│   │   ├── geckodriver
│   │   └── geckodriver_linux
│   ├── requirements.txt
│   └── source
│       ├── run.py
│       ├── scraping.py
│       ├── make_outputs.py
│       ├── s3_operator.py
│       └── configs.py
├── startup.sh
└── tmp
    ├── files
    │   ├── download
    │   ├── fromS3
    │   └── toS3
    └── logs

Essayez de commencer

Il peut être exécuté avec la commande suivante.

docker build -t myapp .
docker run -it myapp

En fait, ça ne s'est pas passé comme ça ... J'ai l'impression d'avoir tapé la commande ci-dessus environ 40 fois.

Cependant, quand ça se passe bien, c'est émouvant! Je ne vois pas du tout l'écran, mais la console est sortie et il y a des fichiers dans S3.

À la fin, exécutez-le simplement sur AWS ... Je peux voir le but.

Recommended Posts

Grattez automatiquement le site reCAPTCHA quotidiennement (6/7: conteneurisation)
Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)
Grattez automatiquement le site reCAPTCHA quotidiennement (5/7: 2captcha)
Grattez automatiquement le site reCAPTCHA quotidiennement (4/7: traitement des fichiers S3)
Grattez automatiquement le site reCAPTCHA tous les jours (1/7: construction de l'environnement python)
Grattez automatiquement le site reCAPTCHA quotidiennement (3/7: traitement des fichiers xls)
L'édition définitive du grattage python! (Site cible: grande caméra)
J'ai essayé de gratter la publicité du site de dessin animé piraté