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
J'écrirai le processus pour obtenir le fichier de S3.
/ AAAAMMJJ / words.csv, donc ce sera un peu redondant. peu importe.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()
    
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)
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