1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- """API module"""
- import re
- from datetime import datetime, date, timedelta
- import requests
- from bs4 import BeautifulSoup
- from app import BASE_URL, HEADERS
- def get_residents(region_id):
- """Get residents from region"""
- return download_players(region_id, 'residency')
- def get_citizens(region_id):
- """Get citizens from region"""
- return download_players(region_id, 'region')
- def get_work_permits(state_id):
- """Get work permits from state"""
- return download_players(state_id, 'permits_state')
- def download_players(region_id, player_type):
- """Download the players"""
- players = []
- more = True
- page = 0
- while more:
- if player_type == 'permits_state':
- url = '{}listed/{}/{}/{}'.format(BASE_URL, player_type, region_id, page*25)
- else:
- url = '{}listed/{}/{}/0/{}'.format(BASE_URL, player_type, region_id, page*25)
- response = requests.get(
- url,
- headers=HEADERS
- )
- if player_type == 'permits_state':
- tmp_players, more = parse_work_permits(response.text)
- else:
- tmp_players, more = parse_players(response.text)
- players = players + tmp_players
- page += 1
- return players
- def parse_players(html):
- """Parse html return players"""
- soup = BeautifulSoup(html, 'html.parser')
- players_tree = soup.find_all(class_='list_link')
- players = []
- for player_tree in players_tree:
- columns = player_tree.find_all('td')
- registration_date = parse_date(columns[2].string)
- players.append({
- 'id': int(re.sub(r'^.*\/', '', columns[1]['action'])),
- 'name': columns[1].string.strip(),
- 'nation': columns[5]['title'],
- 'registration_date': registration_date
- })
- return players, bool(len(players_tree) >= 25)
- def parse_work_permits(html):
- """Parse html return players"""
- soup = BeautifulSoup(html, 'html.parser')
- players_tree = soup.find_all(class_='list_link')
- players = []
- for player_tree in players_tree:
- columns = player_tree.find_all('td')
- registration_date = parse_date(columns[2].string)
- players.append({
- 'id': int(columns[1].find(class_='small')['user']),
- 'name': columns[1].contents[0].strip(),
- 'nation': columns[5]['title'],
- 'from': registration_date
- })
- return players, bool(len(players_tree) >= 25)
- def parse_date(date_string):
- """Parse date to object"""
- if 'Today' in date_string:
- return date.today()
- if 'Yesterday' in date_string:
- return date.today() - timedelta(1)
- return datetime.strptime(date_string, '%d %B %Y').date()
|