Worldometer’dan anlık COVID-19 verilerini çekerek kendi veri setimizi oluşturmak.

Mert TOSUN
4 min readFeb 8, 2021

--

Merhaba, ilk yazımda Python ile Web Scraping işlemleri sayesinde basit bir emlak botu yapmayı göstermiştim. Bu yazı da ise COVID-19 pandemi süreciyle birlikte popülaritesi artan Worldometer.info web sitesinden anlık COVID-19 istatistiklerini çekeceğiz. Çektiğimiz istatistikleri Pandas aracılığıyla bir DataFrame haline getirip, bilgisayarımıza yazdıracağız. Kullanacağımız kütüphaneler, Requests, BeautifulSoup, XLSXWriter & Pandas olacak. IDE olarak ise Jupyter Notebook’u tercih ettim.

1- Gerekli kütüphanelerin import edilmesi

import requests
from bs4 import BeautifulSoup
import pandas as pd
import xlsxwriter

2- Senaryomuzu belirleyelim

  • İlk olarak Worldometers.info adresine gidelim. Artık aşina olduğumuz meşhur tabloya erişelim. :)
  • Tablo üzerinde bulunan “Country Name” sütunundan tek tek linklere tıklayarak sayfa içeriklerine girdiğimizi ve açılan sayfadan detaylara eriştiğimizi varsayalım.
  • Elde ettiğimiz verileri Pandas yardımı ile bir DataFrame’e dönüştürelim.
  • DataFrame’e aktardığımız verileri, bir veri seti haline getirip export edelim.

3-Parçalama işlemlerine başlayalım

İstatistik tablomuza eriştiğimize göre “Country” sütununda bulunan ülke isimlerinden URL’leri alabilmemiz için tabloyu parçalamalıyız.

liste = soup.find(id="main_table_countries_today").find_all("tr")

Liste isimli bir değişken tanımladık, tablomuzun ID değeri olan “”main_table_countries_today” değişkenini soup’a verdik. find_all metoduyla tüm ülke isimlerini tutan “tr” etiketini seçmiş olduk. Artık for döngüsü yardımıyla tablomuzun içindeki tüm ülkelere erişim sağlayabiliriz. Senaryomuz da belirttiğimiz gibi Python bizim yerimize tek tek ülke isimlerine tıklayacak, ülke isimlerden detay sayfasına erişip gerekli verileri toplayacak. Bunu gerçekleştirebilmemiz için sayfa adreslerini toplayalım.

URL’lerin toplanması

Ülke isimlerine tıkladığımızda bizi “mt_a” class’ı sayesinde yönlendirdiğini görebiliyoruz. Yalnız bir sorunumuz var! “href” den görebileceğiniz gibi yalnızca URL’in sonunu alabiliyoruz. Peki Python’a URL’in tamamını nasıl vereceğiz?

link = "https://www.worldometers.info/coronavirus/" + list.find("a",{"class":"mt_a"}).get('href')

İşte bu şekilde basit bir string birleştirme işlemiyle artık tüm linkler elimizin altında!

Artık Python bizim yerimize teker teker linklere tıklayacak, açılan sayfadan detayları saniyeler içinde toplayıp bize verecek.

4-Sayfa detayları için isteğimizi yollayalım:

r2 = requests.get(link,headers = parametre)
soup2 = BeautifulSoup(r2.text,”lxml”)

Başlangıçta yaptığımız request işlemi dışında hiç bir değişiklik yok. r2 isimli bir değişken tanımladık, soup2 isimli değişkenimize r2 değişkeninnden gelen content’i verdik. Burada bir noktaya dikkatinizi çekmek istiyorum, r2 değişkeninde istek için yukarıda string birleştirme işlemi gerçekleştirdiğimiz “link” değişkenini verdik. Artık bu istek sayesinde detay sayfalarını teker teker parçalayacağız.

5-Detaylardan gerekli verileri elde edelim:

country_name = list.find(“a”,{“class”:”mt_a”}).text.upper()
total_cases = soup2.find(“div”,{“class”:”maincounter-number”}).find(“span”).text
deaths = soup2.find(string=[“Deaths:”]).next.next.text.strip()
recovered = soup2.find(string=[“Recovered:”]).next.next.text.strip()

‘Country_name’ isimi değişkenimize ülkelerin adını, ‘Total_cases’ değişkenine toplam vaka sayılarını, ‘Deaths’ değişkenine toplam ölümleri ve ‘Recovered’ değişkenimize iyileşen hasta sayılarını tanımlayalım.

Vaka sayılarını class’ı “maincounter-number” olan div etiketinden alacağız.

Toplam ölüm ve iyileşen hasta sayılarını elde edelim. Dikkatinizi çekmiş olmalı, iki değişken aynı class’a sahip. Peki böyle bir durumda ne yapacağız? Telaşa gerek yok. :) Dilersek CSS Selector’ı kullanarak ‘nth-of-type’ yardımıyla “class’ı şu, şu olanın altındaki şunu getir” diyerek nokta atışı seçtirme işlemi yapabiliriz. Biz bu yazıda BeautifulSoup’un oldukça kullanışlı olan “string” metodunu kullanalım.

deaths = soup2.find(string=[“Deaths:”]).next.next.text.strip()
recovered = soup2.find(string=[“Recovered:”]).next.next.text.strip()

“.next”ler kafanızı karıştırmasın. Boşluklardan kaçınmak için “sonrakini getir” komutunu vermiş olduk. Burada yaptığımız (“string=’Deaths’)”] ifadesiyle bize ‘Deaths’ stringini içeren alanları getir demek oldu. Artık verilerimizi bir liste yardımıyla tutabilir ve aktarıma hazır hale getirebiliriz.

ulkeler = [] --> Boş bir listeyi kodlarımızın başına tanımlayalım.ulkeler.append([country_name,total_cases,deaths,recovered]) --> Liste işlemiernden append'i kullanarak boş listemizi besleyelim.

Dilerseniz kodlarımızı çalıştıralım ve çıktıya bir göz atalım:

Gerekli süslemeler sonrası çıktımız gayet başarılı gözüküyor. :)

6-Verileri DataFrame’e çevirip Veri Setimizi elde edelim:

df değişkenine DataFrame’i tanıttık. ulkeler isimli boş listemizi DataFrame içine verip, columns ile gerekli düzenlemeri yapmış olduk.

7-Veri Setini Export Edelim

df.to_excel(‘covidstats.xlsx’, engine=’xlsxwriter’)

“df.to_excel” komutu ile verilerimizi export edelim. Covidstats ismini verdiğim XLSX formatındaki dosyamı ‘xlsxwriter’ yardımıyla yazdırıyorum. Gerekli aracı kullanmak tamamen bize kalmış. Pythonımızın kurulu olduğu dizine gidelim ve veri setimize göz atalım.

covidstats.xlsx

Bingo! Sonuç gayet başarılı gözüküyor. :) Worldometers.info adresinden anlık çektiğimiz tüm veriler elimizin altında. Artık veri setimizi oluşturmuş olduk.

8-Sonuç

Veri biliminin belki de en zor kısmı olan verileri elde etme işlemini hallettik. Veri setimiz üzerinde basit düzenlemeleri yaptık ve dışarıya aktardık. Elde ettiğiniz verileri makine öğrenmesi yardımıyla train ederek başarılı analizler çıkarabilir, projelerinizde kullanabilirsiniz.

İkinci yazımın sonuna geldik, zaman ayırdığınız için teşekkür ederim..

İletişim ve sorularınız için: https://tr.linkedin.com/in/merttosun61

--

--

Mert TOSUN

Interested in Data Science, Data Governance & Data Quality