കഴിഞ്ഞ “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
Leave a Reply