api.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """API module"""
  2. import re
  3. import requests
  4. from bs4 import BeautifulSoup
  5. from app import BASE_URL, HEADERS
  6. def get_residents(region_id):
  7. """Get residents from region"""
  8. return download_players(region_id, 'residency')
  9. def get_citizens(region_id):
  10. """Get citizens from region"""
  11. return download_players(region_id, 'state')
  12. def download_players(region_id, player_type):
  13. """Download the players"""
  14. players = []
  15. more = True
  16. page = 0
  17. while more:
  18. response = requests.get(
  19. '{}listed/{}/{}/0/{}'.format(BASE_URL, player_type, region_id, page*25),
  20. headers=HEADERS
  21. )
  22. tmp_players, more = parse_players(response.text)
  23. players = players + tmp_players
  24. page += 1
  25. return players
  26. def read_citizens():
  27. """Read from department file"""
  28. with open('citizens.html') as file:
  29. citizens = parse_players(file)
  30. return citizens
  31. def parse_players(html):
  32. """Parse html return players"""
  33. soup = BeautifulSoup(html, 'html.parser')
  34. players_tree = soup.find_all(class_='list_link')
  35. players = []
  36. for player_tree in players_tree:
  37. columns = player_tree.find_all('td')
  38. players.append({
  39. 'id': int(re.sub(r'^.*\/', '', columns[1]['action'])),
  40. 'name': columns[1].string.strip(),
  41. })
  42. more = bool(soup.find(class_='more'))
  43. return players, more