Python İle Web Scraping: Twitter Botu Oluşturma

Python İle Web Scraping: Twitter Botu Oluşturma

Merhaba,

Yazı serimizin önceki bölümlerinde farklı senaryolarda Web Scraping yaparken nasıl bir yaklaşım sergilememiz gerektiğine yönelik örnekler incelemiştik. Gözden kaçırdıysanız önceki yazılara göz atabilirsiniz.

Bu sefer ise Web Scraping ile beslenen bir twitter botu oluşturacağız. İzleyeceğimiz senaryoda SistersLab blog yazılarının yayınlandığı sayfayı inceleyeceğiz. Bu sayfaya yeni bir blog yazısı eklendiğinde bu yazının bilgilerinin yer aldığı bir tweetin otomatik olarak atılmasını sağlayacağız.  Bunun için web sayfada blog duyuru sayfasından listelenen blogların html taglarını inceleyecek ve gerekli kontroller sonrasında yeni bir blog yazısını tweet olarak paylaşılması için gerekli Python fonksiyonlarını oluşturacağız.

Bu uygulamada bir ek gereksinim var:

  • Twitter developer hesabı
    • Tweepy kütüphanesi ile tweetlerin Python tarafından yollanması için gerekli

Öncelikle web sayfada “öğeyi denetle” deyip sayfa içeriğindeki blog yazılarının html olarak karşılık geldiği tagları buluyoruz. Siteye baktığımızda her bir blog yazısı için bir çerçeve içerisinde bilgiler paylaşıldığını görüyoruz; blog yazısının kapak fotoğrafı , yazı başlığı ve blog yazısının giriş cümlesi. Bu bilgileri web sayfa içerisinde görebiliyorsak bu bilgiler html içerisinde de bulunuyor demektir. Onun için html kısmında bu çerçevenin öğelerini de bulmamız gerekiyor.

Html içerisinde belirli bir içeriği bulmanın en kolay yolu “Ctrl + F” tuş kombinasyonu ile anahtar kelimeleri aramaktır. Mesela üstteki “Herkese merhabalar. Kotlin” kısmını sayfanın html içeriği içerisinde aradığımda direkt olarak ilgili kısmın taglarına ulaşmış oldum. Burada tagları incelediğimizde ön yüzde gördüğümüz gibi çerçevedeki kapak fotoğrafının yer aldığı “img”, blog url’inin yer aldığı “a” tagının ve blog giriş cümlelerini barındıran kısmın yer aldığını görebiliyoruz.

Kodlama kısmına geçmeden önce hedeflerimizi belirlememiz gerekiyor. Bu sayfadan 3 bilgi çekmek istiyoruz.

  1. Blog kapak fotoğrafı,
  2. Blog yazısının url’i,
  3. Blog yazısının özet / giriş cümlesi.

Bu kısımlara ulaşmak için taglarda derinleşmemiz ve bu tagların barındırdığı class bilgilerini de kodumuza eklememiz gerekiyor. Mesela;

  • Giriş cümlesi bir “div” tagı içerisinde ve “entry-description” classına sahip.
  • Yazar görseli “img” class’ının src özelliğinde url olarak tutuluyor.
    • Ve aslında bu img class’ı aynı zamanda bir “a” tag’ının içerisinde yer alıyor.
      • Aynı zamanda img tag’ı da “post-tumbnail” adlı class’a sahip bir div içerisinde yer alıyor. Burada farklı bir yaklaşım sergilemek, iç içe bir yapı kurmak gerekecek.
  • Blog url’lerine baktığımızda ise yine zincirleme bir şekilde “content-inner” classlı bir div içerisinde bir a tag’ı içerisinde olduğunu görüyoruz blog url’lerinin.

Adımları uygulamak için uygulamamıza başlıyoruz. Her zamanki gibi ilk önce get_soup() olarak adlandırdığımız fonksiyon ile sayfanın html içeriğini Python’a çekiyoruz. Sonrasında blog yazısının url’i, blog giriş cümlesi ve yazı başlık fotoğrafını aşağıdaki gibi çekiyoruz.

Evet Bu verileri elde etmek geçen örneklerden biraz farklı olsa da bu şekilde. Peki twitter botuna bunu nasıl çevireceğiz?

Öncelikle Python ile tweet atabilmek için bir twitter developer account’a sahip olmak gerekiyor. Bu şekilde tweepy kütüphanesi yardımı ile developer account token’ımızı kullanarak Python’la tweetler atabiliyoruz. Tweepy ile tweet atmanın örnek kullanımı ise bu kadar kolay:

Şimdi, son part olan Twitter ve scrape ettiğimiz dataların birleştirilmesi aşamasındayız. Fakat bizim amacımız burada blog yazılarını tweet attırmak değil, “yeni yayınlanan blog yazılarını tweet attırmak”. SistersLab ekibinde içeriden aldığım bilgilere göre haftada bir kaç blog yazısı paylaşılabiliyor ve günde bir kez siteyi “yeni bir blog yazısı paylaşıldı mı?” diye kontrol etmemiz yeterli. Bunun için bir while döngüsü içerisinde blog duyuru sayfasında paylaşılmış blog yazılarını kaydedeceğiz ve 24 saat sonra tekrar paylaşılmış blog yazılarını kontrol edip eğer yeni bir yazı ağımıza düşmüş ise bu yazının bilgilerini paylaşacağız.

Botumuzun pseudo kodu ise şu şekilde olacak:

Aslında şimdiye kadar gerekli bütün aşamaları konuştuk. Geriye kalan bu bahsettiklerimizi doğru sıralama ve mantık ile Python dilinde kodlamakta. Burada kod parçasını mantığı ön plana çıkartır şekilde paylaşacağım fakat çalışır kodu ve yardımcı adımlara/paketlere GitHub reposundan ulaşabileceksiniz.

Evet botumuzun son halini oluşturduk. Burada ortaya çıkan yapı aslında önceki adımların bir araya getirilmesi sadece. Akıllara takılabilecek birkaç kısmı da açıklamakta fayda var. Mesela 36. satırda (280 23) ifadesi şu sebeple; “Tweetlerde paylaşılan url’ler 23 karakter yer kaplıyor ve tweetimizde url’e yer açmak için bunu hesaba katarak giriş cümlelerini daraltmamız gerekebiliyor.”. Diğer bir konu da 24 * 60 * 60 = 1 günlük bekleme doğru bir yaklaşım mı? Bu aslında senaryonuza göre değişir, bu şekilde botu çalıştırmak mümkün fakat bir workflow aracı ile oozie vea airflow ile python scriptinizi schedule edebilir ve bu şekilde bir ifade kullanmaya gerek duymayabilirsiniz. Burada amaç basit bir şekilde konsepti aktarmaktı. Son olarak tweetlerimiz!

Program çalıştığında ilk olarak blog duyuru sayfasındaki 6 blog yazısının tweeti otomatik olarak atılacak. Çünkü ilk başta önceki günde kaydedilmiş eski url listesi boş olduğu için tüm blog yazıları botumuz tarafından yeni yazılar olarak algılanacak. Fakat ilk çalışmadan 24 saat sonra artık botumuz sağlıklı bir şekilde sadece yeni eklenen blogların bilgilerini paylaşıyor olacak.

Tweetin altında yazan “bilative” twitter developer account tarafında oluşturulmuş uygulama adıdır. Burada manuel telefon ile attığınız tweetlerin dışında developer accountunuzun ismini görüyor olacaksınız.

3 parçada işlediğimiz Python ile Web Scraping konulu blog serimizin sonuna geldik. Sizlere bu yazı dizisinde basit örnekler ile akıllarda bir fikir oluşmasını ve kurcalanabilir kod parçacıkları sunmayı hedefledik. Farklı senaryolar ve gereksinimler için ayrıntılı çalışmalar ve ara ara hatalar da yapmanız gerekecektir. Hata yapa yapa öğrenmek keyifli, umarım sizler için de öyledir. Yazı serimizin içeriği veya Web Scraping konusu ile ilgili aklınıza takılan, sorun yaşadığınız veya desteğe ihtiyacınız olursa da iletişime geçebilirsiniz.

Sonraki yazı serisinde görüşmek üzere.

Bilal Özdemir
yazı

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir