2016 കേരള അസംബ്ലി തിരഞ്ഞെടുപ്പിന്റെ ഫലം ശേഖരിക്കാനുപയോഗിച്ച പൈത്തൺ സ്ക്രിപ്റ്റ്

കഴിഞ്ഞ "2016 ലെ കേരള അസംബ്ലി തിരഞ്ഞെടുപ്പ് ഫലം" എന്ന പോസ്റ്റിൽ തിരഞ്ഞെടുപ്പ് ഫലം ശേഖരിക്കാനുപയോഗിച്ചെന്നു സൂചിപ്പിച്ച പൈത്തൺ സ്ക്രിപ്റ്റ് ഇവിടെ നൽകുന്നു. http://trend.kerala.gov.in/ വെബ്സൈറ്റിൽ നിന്നുമാണ് ഇത് ഫലം ശേഖരിക്കുന്നത്.

തിരഞ്ഞെടുപ്പ് ഫലം ഡാറ്റ ഫയലുകൾ ഇതിനകം തന്നെ ശേഖരിച്ച് മുകളിൽ പറഞ്ഞ പോസ്റ്റിൽ നൽകിയിട്ടുണ്ട്. അതോടെ സ്ക്രിപ്റ്റിന്റെ ഉപയോഗം കഴിഞ്ഞു.കൂടാതെ, http://trend.kerala.gov.in/ സൈറ്റിലെ വിവരങ്ങൾ ഒരോ തിരഞ്ഞെടുപ്പിനു ശേഷവും മാറ്റുന്നുണ്ടെന്നാണ് എനിക്ക് തോന്നുന്നത്. അതായത്, അടുത്ത തിരഞ്ഞെടുപ്പോടെ സ്ക്രിപ്റ്റ് റൺ ചെയ്യാതെ വരും.

ഈ സ്ക്രിപ്റ്റ് requests, xlwt എന്നീ പൈത്തൺ ലൈബ്രറികൾ ഉപയോഗിക്കുന്നുണ്ട്. സ്ക്രിപ്റ്റ് റൺ ചെയ്യുന്നതിനുമുൻപ് ആ ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കണം.

import requests, xlwt, time, sys, json, os.path

# Maximum times to try to fetch data when failed.
try_limit = 3
# Delay in seconds
delay = 15

# Not sure if it is required. Just lie it is Chrome browser.
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36'}
# Directory to store cache files.
cache_dir = '.cache'
# Create cache directory if not created.
if not os.path.exists(cache_dir):
    os.makedirs(cache_dir)

def get_data(param_data, filenamepart):
    """To get data from site for given parameters."""
    filename = cache_dir + '/' + filenamepart + '.json'
    # If cached file exist for this request then load data from it.
    if os.path.isfile(filename):
        with open(filename) as infile:
            data = json.load(infile)
            return data

    for try_num in range(try_limit):
        try:
            # Delay before issuing HTTP request to avoid load on server.
            time.sleep(delay)

            response = requests.post('http://trend.kerala.gov.in/includes/trend.php', data=param_data, headers=headers)
            if response.status_code == 200:
                data = response.json()
                # Write data to cache file.
                with open(filename, 'w') as outfile:
                    json.dump(data, outfile)

                return data
            else:
                print "Failed with", response.status_code
        except:
            # Let user know we are trying again.
            if try_num < (try_limit - 1):
                print "Trying again..."
            pass
    raise Exception('Data could not be feteched for ' + param_data)

def get_district_overview(dist_num, dist_name):
    """To get state wide district data."""
    print "Getting district level overview for", dist_name, "..."
    return get_data({'_p':'sv2', '_d': dist_num}, 'sv2.' + dist_num)

def get_constituency_overview(constituency_num, constituency_name):
    """To get constituency result data."""
    print "Getting instituion level overview for", constituency_name, "..."
    return get_data({'_p':'lv', '_l': constituency_num}, 'lv.' + constituency_num)

if len(sys.argv) < 3:
    print "Please provide spreadsheet and json filenames with extention."
    exit(0)

wb = xlwt.Workbook()

# Add header row to Districts sheet.
districts_sheet = wb.add_sheet('Districts')
districts_sheet.write(0, 0, 'District Number')
districts_sheet.write(0, 1, 'District Name')

# To keep districts data part for JSON output.
districts_data = {}

# Add header row to Constituencies sheet.
constituency_sheet = wb.add_sheet('Constituencies')
constituency_sheet.write(0, 0, 'Constituency District')
constituency_sheet.write(0, 1, 'Constituency Number')
constituency_sheet.write(0, 2, 'Constituency Name')

# To keep constituencies data part for JSON output.
constituency_data = {}

# Add header row to Votes sheet.
votes_sheet = wb.add_sheet('Votes')
votes_sheet.write(0, 0, 'Constituency Number')
votes_sheet.write(0, 1, 'Order Number')
votes_sheet.write(0, 2, 'Candidate')
votes_sheet.write(0, 3, 'Party')
votes_sheet.write(0, 4, 'Votes')
votes_sheet.write(0, 5, 'Position')
votes_sheet.write(0, 6, 'Group')

# To keep votes data part for JSON output.
votes_data = []

print "Getting districts overivew data..."
overview = get_data({'_p':'sv1', '_l': 'trend'}, 'sv1.trend')

# Row number to start putting data in each sheet.
district_row = 1
constituency_row = 1
votes_row = 1

for item in overview['payload']:
    districts_sheet.write(district_row, 0, item[0])
    districts_sheet.write(district_row, 1, item[1])
    districts_data[item[0]] = {
        'num': item[0],
        'name': item[1],
    }
    district_row += 1

    district_overview = get_district_overview(item[0], item[1])

    wards = {}
    for constituency in district_overview['payload']:
        district_num, constituency_num, constituency_name, _, _, _, _, _, _, _, _, _= constituency
        if not constituency_num in wards:
            wards[constituency_num] = constituency_name
            constituency_sheet.write(constituency_row, 0, district_num)
            constituency_sheet.write(constituency_row, 1, constituency_num)
            constituency_sheet.write(constituency_row, 2, constituency_name)
            constituency_data[constituency_num] = {
                'district_num': district_num,
                'num': constituency_num,
                'name': constituency_name
            }
            constituency_row += 1

            result = get_constituency_overview(constituency_num, constituency_name)

            for lac in result['list']:
                order_num, candidate, party, votes, position, group = lac
                votes_sheet.write(votes_row, 0, constituency_num)
                votes_sheet.write(votes_row, 1, order_num)
                votes_sheet.write(votes_row, 2, candidate)
                votes_sheet.write(votes_row, 3, party)
                votes_sheet.write(votes_row, 4, votes)
                votes_sheet.write(votes_row, 5, position)
                votes_sheet.write(votes_row, 6, group)
                votes_data.append({
                    'constituency_num': constituency_num,
                    'order_num': order_num,
                    'candidate': candidate,
                    'party': party,
                    'votes': votes,
                    'position': position,
                    'group': group
                })
                votes_row += 1

# Write data to JSON file.
with open(sys.argv[2], 'w') as outfile:
    json.dump({'districts': districts_data, 'constituencies': constituency_data, 'votes': votes_data}, outfile)

# Write data to spreadsheet file.
wb.save(sys.argv[1])

kerala-ae-2016.py എന്നാണ് ഫയൽനാമമെങ്കിൽ, ചുവടെ കൊടുത്തിരിക്കുന്ന പ്രകാരം സ്ക്രിപ്റ്റ് റൺ ചെയ്യാം:

python kerala-ae-2016.py kerala-ae-2016-result.xlsx kerala-ae-2016-result.json