-
Notifications
You must be signed in to change notification settings - Fork 0
/
populate.py
85 lines (69 loc) · 2.69 KB
/
populate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import requests as req
from core.database import SessionLocal
from core.schemas.PokemonData import PokemonData
from core.models.PokemonData import get_pkdata_by_id
""" Script to populate "pokemon_data" table on database with data from PokeAPI """
res = req.get("https://pokeapi.co/api/v2/pokemon?limit=151")
if res.status_code != 200:
print("Failed to request from PokeAPI: status", res.status_code)
res = res.json()
pokemons = res["results"]
db = SessionLocal()
for pokemon in pokemons:
# Request pokemon info
poke_res = req.get(pokemon['url'])
if poke_res.status_code != 200:
print(f"Failed to request {pokemon['name'].capitalize()} data from PokeAPI: status", poke_res.status_code)
break
poke_info = poke_res.json()
if get_pkdata_by_id(db, poke_info['id']) is not None:
# Pokemon already registred
continue
# Request pokemon species info
poke_species_res = req.get(f"https://pokeapi.co/api/v2/pokemon-species/{poke_info['id']}")
if poke_res.status_code != 200:
print(f"Failed to request {pokemon['name'].capitalize()}({poke_info['id']}) data from PokeAPI: status", poke_res.status_code)
break
poke_species = poke_species_res.json()
# Handle pokemon species description language and special characters
description = None
for flavor_txt_entry in poke_species["flavor_text_entries"]:
if flavor_txt_entry["language"]["name"] == "en":
description = flavor_txt_entry["flavor_text"]\
.replace("\n", " ")\
.replace("\u000c", " ")
break
if description is None:
print(f"Failed to fetch {pokemon['name'].capitalize()}({poke_info['id']}) description in english from PokeAPI")
# Format types
types = poke_info['types'][0]['type']['name'].capitalize()
try:
types+= "," + poke_info['types'][1]['type']['name'].capitalize()
except:
pass
# Format data
pk_data = {
"id": poke_info['id'],
"name": pokemon['name'].capitalize(),
"types": types,
"description": description,
"weight": poke_info['weight'],
"sprite": poke_info['sprites']['front_default']
}
# Save in DB
try:
db_pkdata = PokemonData(**pk_data)
db.add(db_pkdata)
db.commit()
db.refresh(db_pkdata)
if db_pkdata is None:
raise Exception
except Exception as e:
print(f"Failed to insert {pk_data['name']} data on database. [{e}]\nSkiping...")
db.rollback()
continue
# Print status
if pk_data['id'] < 151:
print(f" {pk_data['id']}/151", end='\r', flush=True)
else:
print(f" {pk_data['id']}/151")