Python İle Web Scraping: E-Ticaret Sitesinden Web Scraping
Merhaba,
Python ile Web Scraping yazı serimizin 2. bölümündeyiz. İlk bölümde basit örnekler ile tek web sayfası içerisindeki tablo verilerinin nasıl kayıt altına alınabileceğine değinmiştik. İlk yazıyı gözden kaçırdıysanız bir göz atabilirsiniz:
Bu bölümde ise her e-ticaret sitesinde gördüğümüz üzere sayfalar boyunca listelenmiş ürünler ve bu ürünlerin detay bilgilerine ulaşmaya çalışacağız ve bu bilgileri toplu bir şekilde veri seti olarak toplayacağız. Örneğimizi görsel ile işlemek daha sağlıklı olacaktır.
Her e-ticaret sitesinde karşılaştığımız üzere mesela telefonlar kategorisine girdiğimizde sayfalar boyunca telefonların listelendiğini görüyoruz. Her bir ürünün (telefon, bilgisayar vb) bilgilerini detaylı görmek için tıkladığımızda ise ürün bilgileri karşımıza sıralanıyor.
Burada her bir telefonun bilgilerini kayıt altına almak istediğimizi varsayarsak; üstteki şemada her sayfada 9 ürün olduğu ve telefon kategorisinin 7 sayfa devam ettiği bu durumda 7 * 9 = 63 telefonun bilgilerinden oluşan veri seti oluşturabiliriz. Bu veri setini ödevlerimizde, projelerimizde veya analizlerimizde kullanmamız mümkün olacaktır.
Böyle bir uygulama detaylı bir ön çalışma gerektiriyor. 63 telefonun da ürün sayfasına gidip tek tek içeriklere ulaşmak bir çözüm gibi durabilir fakat 63 ürünün linklerine ulaşmaya zaman ayırmak efektif değil. Kaldı ki 3000 telefon listeleniyorsa web sayfa boyunca 3000 linke tek tek ulaşmak mümkün olmayacaktır. Bunun için madde madde izlememiz gereken yol şu şekilde:
- Öncelikle ürün listesi sayfalarının linklerine ulaşmalıyız.
- İlk sayfanın linkini biz vereceğiz fakat sonraki sayfaların da linklerine sayfa içerisinden ulaşabilmeliyiz.
- Altta yer alan 1-2-3-4… şeklinde sıradaki sayfaya geçiş butonları sonraki sayfaların url’lerini saklıyor.
- Sayfada listelenen her ürünün “ürün detayı sayfası” linkine ulaşmamız gerekiyor.
- Her sayfanın url’i listeli sayfada gizlidir.
- Ardından ürün detaylarının toplanması gerekmektedir.
- Her bir ürünü bir tablonun tek 1 satırı olarak özellikleri ile birlikte kaydetmeliyiz.
Bir örnek üzerinde senaryo ve adımların gereklilikleri çok daha iyi anlaşılacaktır. Uygulama aşamasında önceden hazırlamış olduğumuz https://bilative.github.io/sisterslab/page_1.html web sayfası üzerinden çalışmamızı yürüteceğiz. Uygulamaya başlamadan önce sayfayı bir incelemelisiniz. Linkte listelenen ürünler bulunuyor ve ürünlere tıkladığımızda detay sayfalarına ulaşabiliyoruz, aynı zamanda sonraki sayfalara geçiş yapabiliyor ve o sayfalarda listelenen ürünleri de inceleyebiliyor, detay bilgilerine ulaşabiliyoruz.
Çalışmada kullanılacak tüm kodlara ise GitHub linkinden ulaşabilirsiniz.
İlk sayfa linkinde tarayıcıda “sayfa kaynağını görüntüle” seçeneği ile html içeriğini görüntülediğimizde sonraki sayfaların linklerinin listelendiği kısmı bulabiliriz. Bu html taglarını ve classlarını incelediğimizde beautiful soup ile alınacak web içeriğinin “a” tagında ve “class = pagination__content” şeklinde filtrelenmesi gerektiğini fark ediyoruz. Yani burada listelenen sayfa linklerine ulaşmak için gerekli olan python kodumuz şöyle olacak.
Başarılı bir şekilde sayfa linklerine ulaşabildik. Şimdi de her bir sayfadaki listelenen ürünlerin linklerine ihtiyacımız var. Ürün sayfaları linklerinin ise “class = urun-adi” özelliğine sahip a tagları içerisinde olduğunu görebiliyoruz. Aslında önceki işlemlerin tekrarı sayılabilir bu aşama, sadece bu sefer 1 “get_soup” işlemi yapmayacağız, her 5 web sayfasına da ayrı ayrı get_soup ile içeriklerine ulaşma adımını yapacağız. Bu işlemler sırasında yine ürün linklerini bir liste içerisinde biriktireceğiz.
Buraya kadar 2 parça halinde:
- İlk olarak tüm sayfaların url’lerine ulaştık.
- Ve sayfalar içerisinde listelenen ürünlerin linklerini kayıt altına aldık.
Sadece başlangıç sayfası url’ini dışarıdan programımıza bildirip 5 farklı sayfa ve 20 ürünün linkine ulaştık. Böyle bakınca dışarıdan müdehalemiz sadece başlangıç noktasını belirlerken oldu. 300 web sayfası olsaydı teorik olarak 300 * 4 = 1200 ürün linkine dışardan müdehalesiz ulaşmış olacaktık. Şimdi sırada elimizde linkleri bulunan bu 20 ürün özelliklerini alıp bir dataframede toplamak var.
Bir ön inceleme sonrası tüm ürünlerin aynı özelliklerinin listelendiği (Ürün Adı, Rengi, Dayanıklılığı…) fakat aldıkları değerlerin değişkenlik gösterdiği fark ediliyor. Bu da aslında tablolarda tuttuğumuz yapılandırılmış veri örneği. Ürün sayfalarının html taglarını incelediğimizde değişken isimlerinin “th” etiketlerinde tutulduğunu ve alınan değerlerin ise “td” etkiketlerinde yer aldığını görebiliyoruz. (Bütün html tag incelemelerine “öğeyi denetle seçeneği” ile ulaşabiliriz.)
Bu şekilde doğru kolon isimlerini barındıran boş bir dataframe oluşturmuş oluyoruz (shape = 0 x 10). Sırasıyla bütün ürün sayfalarını gezip/kazıyıp td etiketlerinde yer alan değişken değerleri ile dataframe satırlarını doldurmak kalıyor geriye.
Hemen her web sayfada üzerine biraz çalışma ile benzer uygulamalar yapılabilir. Buradaki bölümde basit bir örnek ile çoklu sayfalar ve geçişlerde nasıl web kazıma yöntemini efektif kullanabileceğimize değindik. Bu örnekler için kullanılan web sayfaları herhangi bir site değil de kendi oluşturduğum tasarımlar üzerinden anlatma sebebim ise olabildiğince basit ve standard bir örnek ortaya koyabilmekti. Web scraping’de derinleştikçe dikkat etmeniz gereken bazı konulara değinmek gerekirse:
- Web scraping’e direkt girişmeden önce hedef web sitelerinde ön çalışmalar yapmak gerekmektedir.
- Her farklı web site farklı bileşenlerden oluşmakta ve farklı isimlendirmeler ile özellik atamalarını yapmaktadır.
- Her bir tekil sayfaya istek atmadan önce veya sonra 0.5 sn civarı bir bekleme (time.sleep(0.5)) bırakmak site kaynaklarını yormanızı önleyecektir.
- Aksi halde çok seri bir şekilde attığınız istekler site tarafından bir saldırı olarak algılanabilir ve siteye erişiminiz engellenebilir.
- Çoğu web sayfadaki datalar standarttan çok uzak ve kirlidir.
- Mesela bir ürün bilgisi 1000GB, biri 1T, bir diğeri ise 1TB olarak girilmiş olabiliyor bilgiler,
- Web sayfalarda sonraki sayfa linkleri her zaman sıralı bir şekilde verilmez, farklı yaklaşımlar sergilenmesi gerekir.
Farklı senaryolar farklı zorluklarla yüzleşmenizi sağlayacaktır. Takıldığınız bir yer olduğunda veya zorlu bir görevle karşılaştığınızda iletişime geçmekten çekinmeyin. Sonraki yazımızda web scraping görevini bir twitter botu ile birleştireceğiz, görüşmek üzere.
Ben Bilal Latif Ozdemir, DEU İstatistik bölümü mezunuyum ve su an Ege Üniversitesi Bilgi Teknolojileri programında yüksek lisans yapıyorum.
Aynı zamanda su an İzmir'de veri bilimci olarak çalışıyorum. Veri bilimi, Python ve istatistiksel analizler üzerine kendimi geliştirmeyi seviyorum ve bu alanda çalışan kişilere destek olmaya çalışıyorum.