Ana sayfa Genel Python ile Web Crawling’e Giriş

Python ile Web Crawling’e Giriş

34528
3330
PAYLAŞ

Herkese merhaba,

Bu yazıda web crawling’e basit bir giriş yapacağız ve Python’un bize verdiği yetkiye dayanarak Ekşi Sözlük’te gündemdeki başlıkları url’leriyle birlikte çekip bir dosyaya kaydedeceğiz.

Yavaştan başlayalım. Her şeyden önce sadece proje için bize lazım olan paketleri yükleyeceğimiz yeni bir virtual environment oluşturacağız. Bunun için linux’ta virtualenv komutunu kullanarak eksi_crawler adında bir virtual environment oluşturuyoruz:

Eğer virtualenv paketi hazırda kurulu değilse pip kullanarak kurabilirsiniz:

Sonrasında ileriki kısımlarda ihtiyaç duyacağımız paketleri kuruyoruz:

Bu paketlerin ne işimize yarayacağını yazının ilerleyen kısmında göstereceğim.

Şimdi de başlıkları ve başlık linklerini nasıl çekebileceğimize bakalım. Bunun için söz konusu sitenin (bu durumda ekşi sözlük oluyor) html kodlarına göz atmamız gerekiyor. Tarayıcıda “https://eksisozluk.com/basliklar/gundem” url’ine gidiyoruz. Buradaki başlıklardan birine sağ tıklayıp “Ögeyi İncele” ya da “Inspect Element” e tıklıyoruz. Yan tarafta açılan kısımda sitenin kaynak kodlarında başlıkların bulunduğu kısmı görebiliriz.

DOM’u biraz inceleyince şu sonuca varıyoruz: Tüm başlıklar bir liste içerisinde şu düzene göre sıralanmış:

Yani bunu Xpath olarak yazmak gerekirse şöyle yazabiliriz:

Xpath ile ilgili daha fazla bilgiyi burada bulabilirsiniz

Buraya kadar DOM’dan başlıkları ve başlık linklerini içeren DOM elementlerini nasıl çıkaracağımızı bulduğumuza göre asıl işi yapacak Python scriptini yazmaya başlayabiliriz.

Önce modüllerimizi import edelim

Daha sonra web sayfasının html içeriğini requests modülünü kullanarak çekelim:

Burada requests modülünü kullanmamızın nedeni bir web sayfasının içeriğini kendi makinemize çekebilmektir. Bunun için de requests modülünün get fonksiyonunu kullandık. Bu fonksiyon çok basit bir anlatımla muhatap olduğumuz server’a (burada eksisozluk.com) istediğimiz sayfa/url için (burada /basliklar/gundem) GET request gönderir


Not: Burada response’un içeriğini pg.content’e bakarak görebiliriz. Fakat pg.content’in değeri encode edilmiş site içeriği (bytes) olduğundan ve bizim ileride kullanacağımız fonksiyonlar bytes değil string kabul ettiğinden, biz decode edilmiş halini kullanacağız. Decode edilmiş içeriğe de pg.text’ten ulaşabiliriz.


Requests modülü hakkında daha fazla bilgi için dokümantasyonlarına bakabilirsiniz.

Artık sitenin kaynak kodlarını çektiğimize göre bir DOM tree oluşturup istediğimiz bilgileri çekmenin vakti geldi. DOM tree oluşturmak için lxml.html modülünden faydalanacağız.


Not: DOM tree nedir ne değildir bilmiyorsanız şuraya bir göz atmanızda fayda var


Burada pg.text değişkeni çektiğimiz HTML kodlarını içermekte. html.fromstring fonksiyonu da bu HTML kodlarını alıp bize bir DOM tree oluşturuyor.

Artık xpath kullanarak istediğimiz elementleri çekebiliriz:

Eğer links değişkeninin içeriğine bakarsak, şuna benzer bir şey görürüz:

Burada listeyi oluşturan elemanlar bizim gündem başlıklarımıza ait DOM elementleridir. Mesela ilk başlık ve linkine bakalım:

Fark ettiyseniz başlık linki relative, yani şu halde bakan birisi bu linkin eksisozluk.com sitesine ait olduğunu anlayamaz. Bu yüzden kaydederken her linkin başına “https://eksisozluk.com ” ekleyeceğiz.

Şimdi işin son kısmına, yani elde ettiğimiz datayı bir dosyaya kaydetmeye geldi. Ben bu datayı bir json dosyasına kaydetmeyi uygun gördüm, bunun için önce datamızı json formatına uygun olarak yeniden şekillendirmemiz gerekiyor.

Artık datamızı kaydedebiliriz:

Bu kodları da çalıştırdıktan sonra, çektiğimiz başlıklar ve linklerini bulunduğumuz dizinde oluşturduğumuz eksi_data.json dosyasına kaydetmiş oluyoruz.

 

 

BİR CEVAP BIRAK

Please enter your comment!
Please enter your name here