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