| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | """API module"""import refrom datetime import datetime, date, timedeltaimport requestsfrom bs4 import BeautifulSoupfrom app import BASE_URL, HEADERSdef 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 playersdef 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()
 |