İçeriğe geç

Web Scraping

Daha önceki bir yazımızda; Web Crawling kavramından detaylıca bahsetmiştik. Bu yazımızda da detaylı olarak; Web Scraping kavramına değineceğiz.

Web Crawler ve Web Scraping birbirleriyle partner olan kavramlar. Yani birbirlerini tamamlayıcı kavramlar desek herhalde yanlışlık olmaz.

Web Scraping Nedir?

Web Crawler, betirlenen hedef adresteki link’leri tarar ve bu linleri bir liste şeklinde tutar. Yani bir link kuyruğu oluşturur. Bu oluşturulan kuyruktaki link’lere sırasıyla uğrar ve yeni link’ler varsa onları da listesine ekler – tabiki listede olmayan linkleri-. Web crawler bir link’e uğradığı zaman devreye Web Scraping kavramı girer. Web Scraping, link’teki belirtilen alanların toplanması işlemidir. Yani bir nevi; veri toplama veya yığından veri çıkarma olayıdır.

Şimdi örnek bir senaryo oluşturalım.

Elimizde örnek bir x web sitesi olduğunu varsayalım. Bu x web sitesinde bulunan ve reel kişilere ait olan; [Ad, Soyad, Telefon, Şehir] alanlarını almak istiyoruz. Yapacağımız işlem şöyle olacaktır; belirlenen adresteki linkler gezilecek (crawling) daha sonrasında da gezilen sayfalardaki veriler toplanacaktır (scraping). Yani; istediğimiz alanları sayfadan koparıp almamız gerekir. Burdan sonrası da verilen düzenli bir şekilde saklanması işlemidir.

Nasıl Yapılır?

Web Scraping için belirlenen alanlardaki bilgilerin toplanması işlemidir dedik. Aynı zamanda bu işleme Data Extracting de denilmektedir.

Peki bir sayfadaki alanlar nasıl belirlenir?

Alanlardaki verileri belirleme yerine işaretleme diyelim. Çünkü bir web sayfasını haritaya benzetirsek; bu sayfadan istediğimiz alanlarda bu haritanın bir parçası olacaktır. Dolayısıyla; bu alanları işaretlememiz gerekir. İşaretleme işlemi bir çok farklı şekilde yapılabilir.

Alanları işaretlemek için; Selector (Seçici), Element veya XPath ile yapabilirsiniz. Örneğin; bir <table> elementinde olan verileri (genellikle hep oradadırlar) almak isteyebiliriz. Bu elementin selector adını veya doğrudan elementin adını kullanabiliriz.

Basit bir örnek olması açısından aşağıdaki yapımıza bakalım.

<!DOCTYPE html>
<html>
<head>
    <title>Web Scraping</title>
    <meta charset="utf-8">

    <style type="text/css">
        .table-bordered {
            border: 1px dotted;
            text-align: center;
        }
    </style>
</head>
<body>

    <table class="table-bordered">
        <thead>
            <tr>
                <th>Name</th>
                <th>Surname</th>
                <th>Phone Number</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Emre Can</td>
                <td>ÖZTAŞ</td>
                <td>0.543 927 94 53</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <th>Name</th>
                <th>Surname</th>
                <th>Phone Number</th>
            </tr>
        </tfoot>
    </table>

</body>
</html>

Yukarıdaki <table> elementimizin içerisindeki değerleri almak istediğimizi varsayalım. Daha önce de dediğimiz gibi; selector yapısına göre almak isteyelim. Bunun için sayfa yapısına göre selector’umuzu yazalım.

body > table

Şimdi de XPath değerine bakalım.

/html/body/table

Görüldüğü gibi her iki şekilde de veri alınacak alanlarımızı yazdık.

Bu değerleri yazmak kolay değildir. Neyse ki bize yardım eden browser (tarayıcı)’lar var. Chrome ortamında; istenilen sayfadaki bu değerleri rahatça seçebiliriz. Bunun için yapmamız gereken; belirlenen sayfa açıkken F12 tuşuna basmak ve belirlenen elementi seçmek. Tıpkı aşağıda olduğu gibi.

Yukarıdaki şekillerde veri işaretlemesi işlemini gerçekleştirebilirsiniz.

Daha önce de belirttiğim gibi; bana göre en iyi yol: XPath işaretlemesi. Çünkü; selector ve element bazında bir işaretleme yaptığınız da belli başlı durumlarla karşılaşırsınız. Örneğin; sayfada belirlediğiniz selector veya element’ten birden fazla bulunuyor olabilir. Bu durumda yapmanız gereken; kod içerisinde seçim yapmak yani kodlarınıza kod eklemek durumunda kalacaksınız. Fakat XPath ile nokta atışı işaretleme yapabilirsiniz.

Nelere Dikkat edilmelidir?

Web Scraping yaparken dikkat edilmesi gereken en önemli hususlar; doğru bilgiyi almak ve bilgi bozulmasının önüne geçmek.

Doğru bilgiyi almaktan kastım; işaretlenen alandaki veri alındıktan sonra bu verinin temizlenmesi işlemidir. Bilgi genelde temiz gelir lakin bazen bazı durumlarla karşılaşabilirsiniz. Örneğin; bilgi içerisinde bir takım özel işaretlemeler veya diğer başka element’ler, JavaScript kodları vs olabilir. Bu da demektir ki doğru bilgiye henüz ulaşamamışsınız. Böyle bir durumda alınan veriler, temiz olsalar bile temizleme yani sanitize işlemine tabi tutulmaları gerekir. Bu işlemi; web adresleri, mail adresleri veya telefon numaraları için de kullanabilirsiniz, hatta kullanmalısınız da. Çünkü; web adresi yerine örneğin; www yazıp bırakmış olabilirler. Dolayısıyla doğru bilgiye ulaşmak için; veriler temizlenmeli ve kalan değer varsa alınmalıdır. Aksi halde kalan değer yoksa; zaten kimsenin işine yaramaz..!

Bilgi bozulmasının önüne geçmekten kastım ise; her sayfanın karakter kodlaması UTF-8 değildir. Farklı karakter kodlaması kullanılmış olabilir. Dolayısıyla siz bu değerlere ulaştığınız da muhtemelen bilgi bozulmasıyla karşı karşıya kalabilirsiniz. Bunun da önüne geçmek için; web sayfası scraping edilirken sayfanın karakter kodlamasını UTF-8 olarak veya ISO-8859-1 olarak değiştirmenizdir. Aksi halde; aldığınız değerler bozulmuş yapıda olacaktır. Bu bozulmuş değerleri daha sonra da düzenleyebilirsiniz fakat bu oldukça zor ve meşakkatli bir durum teşkil edecektir. O yüzden hiç bu işe girmeden; scraping sırasında bilgi bozulmasının önüne geçmeliyiz.

Verilerin Saklanması

Crawling işleminden sonra; Scraping işlemini de yaptığımızı varsayalım. Veriler elimize öbek öbek geliyor. Bu verilerin saklanması sorunsalı karşımıza çıkacaktır. Bu verilerin saklanması için; .json veya .txt dosyalarından medet ummayalım. Böyle bir düşünceniz varsa hemen aklınızdan çıkarın..! Çünkü sistemin yavaşlamasına ve bir süre sonra yanıt verememesine neden olacaktır. Bunun yerine; MySQL tercih edilebilir bir seçenek lakin SQLite tercih edilemez. SQLite hem veri saklama kapasitesi bakımından hem de MySQL seviyesinde bir pratikliğe sahip olamaması bakımından tercih dışıdır. Bana sorarsanız; MySQL’den de ziyade eşzamanlı bir veri tabanı kullanmanızı size tavsiye ederim. Örneğin; Firebase gibi. Firebase yerine; NoSQL tabanlı bir veri tabanı da tercih edebilirsiniz. MySQL kullanmayın demiyorum, elbette MySQL tercih edilebilir bir seçenektir diyorum.

Verilerin düzgün tasnif edilmesi, ilerleyen zamanlarda kullanım açısından oldukça önemlidir. O yüzden alınan veriler; temiz ve ham veri olmalıdır. Yani istenildiği zaman üzerinde işlem yapılmadan kullanılabilinmelidir.

Saygı ve muhabbetle!..

Bu içeriği paylaşmak ister misiniz?

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Buradaki içeriklerin tümü kamu malıdır. Kullanılması ve paylaşılması özgürdür.