Web Scraping Using Python

Herkese merhaba,

Bu yazımızda Python kullanarak Web Scraping işlemlerini inceleyeceğiz. Web sitelerinden otomatik olarak veri çekme isteğimiz her geçen gün artarak devam etmektedir. Çoğu zaman web sitelerinden veri çekme ve bunları analizlerimizde kullanma ihtiyacı ile karşı karşıya oluruz. Buna bir örnek vermek gerekirse makalemizde de değineceğimiz üzere Gittigidiyor gibi bir e-ticaret sitesinde ihtiyacımız olan alanlarla ilgili satış bilgilerini çekip daha sonrasında bunların üzerinde çeşitli analizler yapabiliriz.

Web sitelerinden verileri çekmek için çeşitli yöntemler vardır. En iyi yöntem ise API'lerin kullanılmasıdır. Neredeyse bütün sosyal medya siteleri (Facebook, Twitter, Instagram gibi bunların dışında da büyük verileri barındıran Google gibi), sitelerine erişime izin vermek için API sağlar. Eğer istediğiniz verileri API ile çekebiliyorsanız, bu yöntem Web Scraping işlemine göre daha çok tercih edilir.

Maalesef her web sitesi API kolaylığı sağlamamaktadır. Bazı web siteleri API kolaylığı sağlıyor çünkü izin verdikleri dışında diğer bilgilerin web sitelerinden çekilmesini istemiyorlar. Bazıları ise teknik bilgi eksikliği nedeniyle API desteği sağlayamıyor. Peki API'lerin kullanılamadığı durumlarda ne yapmamız gerekiyor? Verileri çekebilmek için Web Scraping işlemini kullanmamız gerekiyor.



Web Scraping Nedir?

Web Scraping, web sitelerinden istenilen bilgileri ayıklayan bir yazılım tekniğidir. Bu teknik çoğunlukla web üzerindeki unstructured verilerin (HTML biçimi), structured verilere (veritabanı veya spreadsheet'lere) dönüştürülmesinde kullanılır. Web Scraping işlemi için bir çok programlama dili kullanılabilir. Python'ın kullanım kolaylığı ve sahip olduğu kütüphaneler dolayısıyla (BeautifulSoup gibi) Python'la Web Scraping işlemlerini yapacağız.


HTML Tags


Web Scraping işlemlerini kolay bir şekilde yapabilmek için HTML dilinin yapısına hakim olmamız gerekiyor. Bazı basic bilgilerden bahsetmek gerekirse:




1. <! DOCTYPE html>: HTML belgeleri bu bildirim ile başlamalıdır.
2.HTML belgesi <html> ve </ html> arasında bulunur.
3.HTML belgesinin görünür kısmı <body> ve </ body> arasındadır.
4.HTML başlıkları  <h1> ile <h6> etiketleri ile tanımlanır.
5.HTML paragrafları <p> etiketi ile tanımlanır.



Diğer faydalı HTML etiketleri şunlardır:



1.HTML bağlantıları <a> etiketi ile tanımlanır. "<a href="http://www.gittigidiyor.com/"> gittigidiyor.com için bir bağlantıdır.
2.HTML tabloları <Table> ile, satır ise <tr> olarak tanımlanır ve satır içindeki veriler <td> ile tanımlanır.
3. HTML listesi <ul> (sırasız) ve <ol> (sıralı) ile başlar. Listenin her bir öğesi <li> ile başlar.


Scrapping a Web Page using BeautifulSoup in Python

Artık http://www.gittigidiyor.com/ sitesi üzerinde Web Scraping işlemine geçebiliriz. Bir Python geliştirme ortamında (ben Spyder'ı kullanıyorum) kodlarımızı yazmaya başlayalım.

# import the library used to query a website
import urllib.request
from bs4 import BeautifulSoup

# specify the url
URL= "http://www.gittigidiyor.com/"

# Query the website and return the html to the variable 'page'
page=urllib.request.urlopen(URL)

# Parse the html in the 'page' variable, and store it in Beautiful Soup format
soup = BeautifulSoup(page)

# Work with HTML tags
print(soup.title)
print(soup.title.string)

# out: <title>GittiGidiyor – Türkiye’nin Lider E-ticaret Sitesi</title>
GittiGidiyor – Türkiye’nin Lider E-ticaret Sitesi

# Find all the links within page’s <a> tags
print(soup.a)

# out: <a class="logo_gg imglink" href="http://www.gittigidiyor.com/" onclick="_gaq.push(['_trackEvent', 'Header - GG HOMEPAGE' , 'Mega Menu - GG Logo','']);" title="Alışveriş Sitesi"></a>

# To extract all links (a) we use find_all() function
all_links = soup.find_all("a")
for link in all_links:
    print(link.get("href"))
# Output:



# Extract the information to DataFrame

Bu örneğimizde http://www.gittigidiyor.com/ sitesindeki Günün Fırsatlarını Web Scraping yöntemiyle Data Frame listesi halinde göstereceğiz. Bunun için ilk önce çekmek istediğimiz bilgilerin hangi html tag'ı olduğu ve id, class gibi özelliklerini bilmemiz gerekiyor. Site üzerinde Günün Fırsatı bölümüne gelip herhangi bir fırsat bilgisi üzerinde sağ tıklarız ve "Inspect Element"i seçeriz:




Ürün bilgilerinin bulunduğu div'lerin class bilgisi alınarak bütün div tag'leri, bu tag'ler içerisindeki ürün bilgilerinin tutulduğu tag'ler çekilir. Python'ın pandas kütüphanesi kullanılarak liste halinde gösterilir:

all_divs = soup.find_all('div',{'class':'gg-d-24 gg-t-24 gg-m-24 daily-deal-container-desktop'})

# Generate lists
A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]

for row in all_divs:
    A.append(row.find("span",{"class":"product-title"}).text)
    B.append(row.find("span",{"class":"product-description"}).text)
    C.append(row.find("span",{"class":"product-new-price"}).text)
    D.append(row.find("span",{"class":"product-old-price"}).text)
   
# import pandas to convert list to data frame
import pandas as pd

tablo = pd.DataFrame({
         'Product Title':A,
         'Product Desc':B,
         'Product New':C,
         'Product Old':D
      })

print(tablo.head(5))



İyi okumalar

Yorumlar

Bu blogdaki popüler yayınlar

Natural Key ve Surrogate Key Nedir?

PL/SQL'de DEĞİŞKEN TANIMLAMA, EKRANA YAZI YAZDIRMA ve GÜNCELLEME

SQL Server Analysis Services 2012’de Multidimensional Model ve Tabular Model