-
Notifications
You must be signed in to change notification settings - Fork 0
/
users.py
96 lines (83 loc) · 3.15 KB
/
users.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import os
import urllib2
from bs4 import BeautifulSoup
import json
URL = 'https://codechef.com/users/'
user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
class User:
request_status = ''
handle = ''
name = ''
country = ''
state = ''
city = ''
motto = ''
link = ''
group = ''
institution = ''
profile_img = 'https://s3.amazonaws.com/codechef_shared/sites/all/themes/abessive/images/user_default_thumb.jpg'
rating = ''
global_rank = ''
country_rank = ''
fully_solved = ''
partially_solved = ''
def serialize(self, Found):
if Found == True:
return {'request_status':200, 'handle':self.handle, 'name':self.name, 'link':self.link, 'country':self.country, 'state':self.state, 'city':self.city, 'motto':self.motto, 'group':self.group, 'institution':self.institution, 'profile_img':self.profile_img, 'rating':self.rating, 'global_rank':self.global_rank, 'country_rank':self.country_rank, 'fully_solved':self.fully_solved, 'partially_solved':self.partially_solved}
else:
return {'request_status':404, 'handle':self.handle, 'name':self.name, 'link':self.link, 'country':self.country, 'state':self.state, 'city':self.city, 'motto':self.motto, 'group':self.group, 'institution':self.institution, 'profile_img':self.profile_img, 'rating':self.rating, 'global_rank':self.global_rank, 'country_rank':self.country_rank, 'fully_solved':self.fully_solved, 'partially_solved':self.partially_solved}
def getUser(handle):
user = User()
req = urllib2.Request(URL + handle, headers={'User-Agent': user_agent})
#page = urllib2.urlopen(req)
try:
page = urllib2.urlopen(req)
except urllib2.HTTPError as e:
if e.code == 404:
return user.serialize(False)
soup = BeautifulSoup(page, 'html.parser')
is_motto = False
is_link = False
if soup.find_all('span')[6].string == handle:
user.handle = handle
# Retrieving profile image
for link in soup.find_all('img'):
if '/sites/default' in link.get('src'):
user.profile_img = 'https://codechef.com' + link.get('src')
break
# Retrieving user's full name
user.name = soup.find_all('h2')[1].string
if 'Motto' in soup.text:
is_motto = True
if 'Link' in soup.text:
is_link = True
print(str(is_link) + " " + str(is_motto))
val = 8
user.country = soup.find_all('span')[val].string
val+=1
user.state = soup.find_all('span')[val].string
val+=1
user.city = soup.find_all('span')[val].string
if(is_motto):
val+=1
user.motto = soup.find_all('span')[val].string
if(is_link):
val+=1
user.link = soup.find_all('span')[val].string
val+=1
user.group = soup.find_all('span')[val].string
val+=1
user.institution = soup.find_all('span')[val].string
user.rating = soup.find('div', class_="rating-number").string
ranks = []
for rank in soup.find_all('strong'):
if rank.string == None:
continue
if rank.string.isdigit():
print(rank.string)
ranks.append(rank.string)
user.global_rank = ranks[8]
user.country_rank = ranks[9]
user.fully_solved = soup.find_all('h5')[0].string.split('(')[1].split(')')[0]
user.partially_solved = soup.find_all('h5')[1].string.split('(')[1].split(')')[0]
return user.serialize(True)