-
Notifications
You must be signed in to change notification settings - Fork 0
/
cowin_parser.py
82 lines (73 loc) · 3.01 KB
/
cowin_parser.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
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import FirefoxOptions
import time
import re
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from utils import Cowinutils
import constants
class CowinParser():
def __init__(self):
options = FirefoxOptions()
profile = FirefoxProfile()
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0"
profile.set_preference("general.useragent.override", user_agent)
options.add_argument("--headless")
self.driver = webdriver.Firefox(firefox_profile=profile,options=options)
self.driver.get("https://www.cowin.gov.in/home")
time.sleep(3)
def setStateAndDistrictInWeb(self):
stateName, districtName = self.cowin_utils.getStateAndDistrictName()
self.driver.find_element_by_class_name("status-switch").click()
time.sleep(1)
stateBox = self.driver.find_element_by_xpath(constants.STATE_BOX_XPATH)
time.sleep(0.3)
stateBox.click()
time.sleep(0.5)
stateBox.send_keys(stateName)
time.sleep(0.5)
stateBox.send_keys(Keys.ENTER)
districtBox = self.driver.find_element_by_xpath(constants.DISTRICT_BOX_XPATH)
time.sleep(0.3)
districtBox.click()
time.sleep(0.5)
districtBox.send_keys(districtName)
time.sleep(0.5)
districtBox.send_keys(Keys.ENTER)
time.sleep(0.5)
self.clickOnSearch()
def clickOnSearch(self):
self.driver.find_element_by_xpath(constants.SEARCH_BUTTON_XPATH).click()
time.sleep(3)
self.selectFilters()
def selectFilters(self):
filterButtons = self.driver.find_elements_by_class_name(constants.FILTERS_CLASSNAME)
userFilters = self.cowin_utils.getQueryDettails()['filters']
for filterButton in filterButtons:
if filterButton.text in userFilters:
filterButton.click()
time.sleep(0.3)
self.getRows()
def getRows(self):
rows = self.driver.find_elements_by_css_selector(constants.ROWS_CSS_SELECTOR)
file = None
for row in rows:
row_text = row.text
row_split = row_text.split("\n")
isSlotAvailable = self.isSlotAvailable(row_split)
if isSlotAvailable:
file = open("hospitaldata.txt", "a")
file.write(row_split[0])
file.close()
def isSlotAvailable(self, row_split):
for index in range(2, len(row_split)):
isAvailable = re.search(constants.AVAILABILITY_REGEX, row_split[index])
if isAvailable:
return isAvailable
def startSearch(self, queryParameters):
self.cowin_utils = Cowinutils()
self.cowin_utils.setQueryDetails(queryParameters)
self.cowin_utils.getListOfStatesAndDistrict()
self.setStateAndDistrictInWeb()
self.driver.quit()
# cowinParser = CowinParser()