[PYTHON] Grattez automatiquement le site reCAPTCHA quotidiennement (4/7: traitement des fichiers S3)

  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 des fichiers depuis S3 / Créer des téléchargements de fichiers vers S3 ** 1.2 Captcha implémenté
  5. Autorisez-le à démarrer dans un conteneur Docker
  6. Inscrivez-vous au lot AWS

Fonctionnement de S3

Modifier la structure des fichiers

Jusqu'à la dernière fois, j'écrivais lentement du grattage au traitement du fichier, mais à ce moment-là, j'ai divisé le fichier.

L'un des objectifs est de créer un mode de test car se connecter à S3 = un grand nombre de mots qui deviennent Input = il faut du temps pour exécuter le test.

Cette fois, j'ai essayé de le diviser comme ça.

organisation des fichiers


├── app
│ ├── pilotes sélénium Place pilotes
│   └── source           
│       ├── run.fichier exécutable principal py
│       ├── scraping.processus de grattage py(2e)
│       ├── make_outputs.py Traitement des fichiers téléchargés(3e)
│       ├── s3_operator.Traitement lié à py S3(cette fois:4e)
│       └── configs.variables d'environnement py, mots de passe, etc.
└── tmp
    ├── files
│ ├── à partir de l'exécution principale S3
│ ├── vers l'exécution principale S3
│ └── télécharger Placez le fichier téléchargé en grattant
└── enregistre les journaux(journal de sélénium, etc.)

Appelez le traitement de chaque fichier à partir du fichier exécutable principal = run.py. Puisque les mots récupérés à partir de S3 sont énormes, il est possible de définir le "mode d'exécution de test" de sorte que le temps d'exécution soit court au moment du test.

run.py


if __name__ == '__main__':
  #Soyez prêt à créer un mode d'exécution de test
  parser = argparse.ArgumentParser(description='scraping batch')
  parser.add_argument('--run_mode', dest='run_mode', default = 'normal', help='run_mode: test | normal')
  args = parser.parse_args()
  
  #Récupérer des variables pour chaque environnement
  env = os.getenv('BATCH_ENV', 'LOCAL')
  config = configs.load(env)
  
  #Traitement principal
  words = s3_operator.getFromS3(config) #Récupérez le fichier de S3 et obtenez les mots INPUT
  scraping.main(config,args,words) #Processus de grattage(Lors de l'exécution du test, il se termine par 2 cas)
  make_outputs.main(config,words) #Traitement des fichiers
  s3_operator.sendToS3(config) #Envoyer le fichier vers S3

Au fait, configs.py ressemble à ceci

configs.py


class Config:
    
    login_url = "XXXXXXXXXX"
    login_id =  "XXXXXXXXXX"
    login_password = "XXXXXXXXX"

    #S3
    region_name ="XXXXXXXXXX"
    input_path = "XXXXXXXXXXX"
    output_path = "XXXXXXXXXX"

    @staticmethod
    def load(env_name):
        if env_name == 'PRD':
            return PrdConfig()
        elif env_name == 'STG':
            return StgConfig()
        elif env_name == 'DEV':
            return DevConfig()
        else:
            return LocalConfig()

class LocalConfig(Config):
    access_key_id = 'XXXXXXXXX'
    secret_access_key = 'XXXXXXXXXX'
    bucket_name = 'XXXXX'

#...Sous DevConfig,StgConfig,Idem pour PrdConfig

Processus pour obtenir un fichier de S3

J'écrirai le processus pour obtenir le fichier de S3.

s3_operator


def getFromS3(config):
    #Créer un emplacement de stockage pour les fichiers téléchargés depuis S3
    date = datetime.now().strftime('%Y%m%d')
    dldir_name = os.path.abspath(__file__ + '/../../../tmp/files/fromS3/'.format(date))
    dldir_path = Path(dldir_name)
    dldir_path.mkdir(exist_ok=True)
    download_dir = str(dldir_path.resolve())
    
    #Définir les informations client pour se connecter à S3
    s3_client = boto3.client(
      's3',
      region_name=config.region_name,
      aws_access_key_id=config.access_key_id,
      aws_secret_access_key=config.secret_access_key,
    )
    
    #Obtenir une liste de fichiers avec le chemin spécifié dans le compartiment spécifié
    key_prefix = config.output_path + '/{}/'.format(date)
    response = s3_client.list_objects_v2(Bucket=config.bucket_name,Prefix=key_prefix)
    if response["KeyCount"] == 0:
        print('L'objet n'existe pas:{}'.format(key_prefix))
        return
    
    #Téléchargez les fichiers un par un
    for object in response["Contents"]:
        object_name = object["Key"]
        download_file_name = os.path.basename(object["Key"])
        if len(download_file_name) == 0:
            continue
        download_file_name = download_dir + '/' + download_file_name
        s3_client.download_file(Bucket=config.bucket_name, Key=object_name, Filename=download_file_name)
        print('objet"{}J'ai téléchargé. Destination du téléchargement:{}'.format(object_name,download_file_name))

    #Obtenez des mots
    download_file_name = download_dir + '/words.csv'
    return pd.read_csv(download_file_name).values.tolist()
    

Traitement pour envoyer des fichiers à S3

C'est le processus d'envoi d'un fichier. C'est facile car vous envoyez simplement ce que vous avez fait

s3_operator


def exportToS3(config):
    date = datetime.now().strftime('%Y%m%d')
    s3_client = boto3.client(
        's3',
        region_name=config.region_name,
        aws_access_key_id=config.access_key_id,
        aws_secret_access_key=config.secret_access_key,
    )

    upfiles = glob.glob(os.path.abspath(__file__ + '/../../../tmp/files/toS3/{}/*'.format(date)))
    for f in upfiles :
        filename = os.path.split(f)[1]
        object_name = config.input_path + "/{}/{}".format(date,filename)
        s3_client.upload_file(f,config.bucket_name,object_name)

Achevée

Maintenant, avec python run.py, le programme peut atteindre son objectif.

Mais…

Donc, à partir de la prochaine fois, je vais le gérer.

Recommended Posts

Grattez automatiquement le site reCAPTCHA quotidiennement (4/7: traitement des fichiers S3)
Grattez automatiquement le site reCAPTCHA quotidiennement (3/7: traitement des fichiers xls)
Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)
Grattez automatiquement le site reCAPTCHA quotidiennement (6/7: conteneurisation)
Grattez automatiquement le site reCAPTCHA quotidiennement (5/7: 2captcha)
Grattez automatiquement le site reCAPTCHA tous les jours (1/7: construction de l'environnement python)