How to Track Coronavirus with Python | Towards Data Science

With massive outbreaks and news spreading faster than the Coronavirus (COVID-19) itself, we have to be aware of the actual stats that are affecting the areas that we live in.
Note from the editors: towardsdatascience.com is a Medium publication primarily based on the study of data science and machine learning. We aren’t health professionals or epidemiologists. To learn more about the coronavirus pandemic, you can click here.
Today we are going to explore the fact of how you can stay on top of the information for the Coronavirus and do it that fun way, with Python.
I will show you how you can get the data and get the email every day on how many effected people there are and similar information.
I am going to be using a method, which is called Web Scraping and tools Selenium and Python.
Let’s just jump right into it!
First, we have to find where are we going to get our data from. I decided I am going to go with Worldometers for this one, just because I find the data pretty accurate and website good looking.
Here is a table that shows us data by every country affected and with different data in many columns.
So what we want to do is to take that data from the table based on the country you want to get the data from and that it sends us an email.
You are going to have to install a ChromeDriver, which is going to enable us to manipulate the browser and send commands to it for testing and after for use.
Open the link and download the file for your operating system. I recommend the latest stable release unless you know what you are doing already.
Next up, you need to unzip that file. I would recommend going into Files and doing it manually by right-clicking and then “Extract here”.
Inside the folder, there is a file called “chromedriver”, which we have to move to a specific folder on your computer.
Open the terminal and type these commands:
sudo su #enter the root modecd      #go back to base from the current locationmv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin #move the file to the right location
Just instead of *your_pc_name* insert your actual name of the computer.
Once we are done with that, we open the editor. My personal choice is Visual Studio Code. It is straightforward to use, customizable, and light for your computer.
Open a new Project where ever you like and create two new files. This is an example of how mine looks like to help you:
In the VS Code, there is a “Terminal” tab with which you can open an internal terminal inside the VS Code, which is very useful to have everything in one place.
When you have that open, there is few more thing we need to install and that is the virtual environment and selenium for web driver. Type these commands into your terminal.
pip3 install virtualenvsource venv/bin/activatepip3 install selenium
After activating the virtual environment, we are completely ready to go.
Now that we made sure we know what we want and where we are going to get it from, we have to do the “how” part.
We will create it as a class and make functions for it. So let’s start!
Create your tool with any name and start the driver for Chrome.
class Coronavirus():  def __init__(self):    self.driver = webdriver.Chrome()
That is all we need to start developing. Now go to your terminal and type:
python -i coronavirus.py
This command lets us our file as an interactive playground. The new tab of the browser will be opened and we can start issuing commands to it.If you want to experiment you can use the command line instead of just typing it directly to your source file. Just instead of self use bot.
For Terminal:
bot = Coronavirus()bot.driver.get('https://www.worldometers.info/coronavirus/')
And now for the source code:
self.driver.get('https://www.worldometers.info/coronavirus/')
When we get to the website, we need to scrape the table mentioned before and we are going to do it this way:
We are going to take the table as the Web element and save it under ‘table’. In order to find that element on the webpage, we use find_element_by_xpath() and filter it by using the id that it was defined under.
table = self.driver.find_element_by_xpath('//*[@id="main_table_countries_today"]/tbody[1]')
In that table, we need to get the country to make sure it is the same country that we initially wanted to find.
country_element = table.find_element_by_xpath("//td[contains(., 'USA')]")
Again we use XPath and we find our example of ‘USA’.
Since we need the data next to ‘USA’, we have to make sure it belongs to that row and that is why we are going to take the parent element from the country_element.
row = country_element.find_element_by_xpath("./..")
Inside that row, we get all the data we need and we are just going to split that string into each column and save it into variables.
data = row.text.split(" ")total_cases = data[1]new_cases = data[2]total_deaths = data[3]new_deaths = data[4]active_cases = data[5]total_recovered = data[6]serious_critical = data[7]
Basically ‘data’ is a list that came from string splitting and then we just spread it into different variables to use them later.
We have to set up the email sending server, go to google account service and go into “Passwords for apps”, there you should generate a new password and use it in this little script.
We also make our template for the email we will receive.
def send_mail(country_element, total_cases, new_cases, total_deaths, new_deaths, active_cases, total_recovered, serious_critical):server = smtplib.SMTP('smtp.gmail.com', 587)server.ehlo()server.starttls()server.ehlo()server.login('email', 'password')subject = 'Coronavirus stats in your country today!'body = 'Today in ' + country_element + '\\nThere is new data on coronavirus:\\nTotal cases: ' + total_cases +'\\nNew cases: ' + new_cases + '\\nTotal deaths: ' + total_deaths + '\\nNew deaths: ' + new_deaths + '\\nActive cases: ' + active_cases + '\\nTotal recovered: ' + total_recovered + '\\nSerious, critical cases: ' + serious_critical  + '\\nCheck the link: https://www.worldometers.info/coronavirus/'msg = f"Subject: {subject}\n\n{body}"server.sendmail('Coronavirus','email',msg)print('Hey Email has been sent!')server.quit()
And If you want to put this script on repeat each day check out this link.
We are done!
Here is the complete code:
github.com
If you want to learn more about Selenium’s functions here are Top 25 Selenium Functions That Will Make You Pro In Web Scraping.
Similar tutorials like this one, for automation and putting good code to work, here are How to Save Money with Python and How to make an Analysis Tool with Python.
Also If you want to learn more about Web Scraping here is Everything you Need to Know About Web Scraping.
Just a reminder before you go, make sure to always take care of your hygiene and especially while this epidemic lasts, also do not make much physical contact with other people!
Thanks for reading!