BeautifulSoup Python Web Scraping'e Giriş
BeautifulSoup ile Web Scraping nedir?
BeautifulSoup (bs4 Python) ile web kazıma, modern dijital ortamda vazgeçilmez bir araç haline geldi. Web sitelerinden veri çıkarmak ve çeşitli amaçlarla değerli bilgiler toplamak için kullanılan bir tekniktir. İster bir veri bilimci, ister iş analisti, ister sadece meraklı bir birey olun, Beautiful Soup Python inanılmaz derecede faydalı olabilir. Peki BeautifulSoup Python tam olarak nedir ve web kazıma için neden tercih edilir?
BeautifulSoup Python, web sitelerinden otomatik olarak veri çıkarma işlemidir. Bir web sitesine HTTP isteklerinin gönderilmesini, HTML içeriğinin ayrıştırılmasını ve ardından ilgilenilen belirli bilgilerin çıkarılmasını içerir. Bu bilgiler metin ve görsellerden ürün fiyatları veya borsa verileri gibi yapılandırılmış verilere kadar değişebilir. Temel olarak web kazıma, yapılandırılmamış web verilerini analiz edebileceğiniz, görselleştirebileceğiniz veya başka herhangi bir amaç için kullanabileceğiniz yapılandırılmış bir formata dönüştürmenize olanak tanır.
Web kazıma, çok çeşitli alanlarda uygulama bulur. İşletmeler bunu pazar araştırması, rekabet analizi ve potansiyel müşteri yaratma için kullanır. Araştırmacılar bunu akademik çalışmalar için veri toplamak amacıyla kullanırken, gazeteciler bunu haber makaleleri için bilgi toplamak amacıyla kullanıyor. Amacınız ne olursa olsun, BeautifulSoup Python ile web kazıma, aksi takdirde manuel olarak toplanması zaman alıcı olacak zengin miktarda veri sağlayabilir.
Neden Web Kazıma için BeautifulSoup?
Artık web kazıma kavramını anladığımıza göre, konu web kazıma olduğunda BeautifulSoup Python'un Python geliştiricileri için neden ilk tercih olduğunu inceleyelim.
BeautifulSoup'a Başlarken
Kurulum ve Kurulum
BeautifulSoup ile web'i kazımaya başlamadan önce ortamınızı ayarlamanız gerekir. İyi haber şu ki BeautifulSoup Python'un kurulumu ve Python projelerinize entegrasyonu kolaydır.
BeautifulSoup'u (Beautiful Soup Python) Python'un paket yöneticisi olan pip'i kullanarak kurabilirsiniz. Terminalinizi veya komut isteminizi açıp aşağıdaki komutu çalıştırmanız yeterlidir: pip install Beautifulsoup4
BeautifulSoup Python'u yükledikten sonra başlamaya hazırsınız. Peki BeautifulSoup Python tam olarak ne işe yarar ve neden diğer web kazıma araçları yerine onu seçmelisiniz?
Temel HTML Yapısı
Neden Beautiful Soup'un (BeautifulSoup Python) tercih edildiğini anlamak için web'e güç veren dil olan HTML'nin yapısına daha yakından bakalım. HyperText Markup Language'ın kısaltması olan HTML, web sayfaları oluşturmak için standart işaretleme dilidir. Bir web sayfasının içeriğini ve düzenini tanımlamak için hiyerarşik bir öğe yapısı kullanır.
HTML belgeleri başlıklar, paragraflar, resimler, bağlantılar ve daha fazlası gibi çeşitli öğelerden oluşur. Bu öğeler, Belge Nesne Modeli (DOM) adı verilen ağaç benzeri bir yapıda düzenlenir. Web kazıma gerçekleştirdiğinizde, ihtiyacınız olan verileri çıkarmak için esas olarak BeautifulSoup Python'u kullanarak bu DOM'da gezinir ve yönetirsiniz.
BeautifulSoup ile HTML'yi ayrıştırma
BeautifulSoup'un (bs4 Python) devreye girdiği yer burasıdır. HTML ve XML belgelerinin ayrıştırılmasını kolay ve verimli hale getiren bir Python kütüphanesidir. BeautifulSoup Python, DOM'da gezinmek ve arama yapmak için basit ve sezgisel bir yol sağlayarak onu web kazıma görevleri için mükemmel bir seçim haline getirir.
BeautifulSoup Python ile bir HTML belgesinin yapılandırılmış bir temsilini oluşturabilir, böylece belirli öğelere erişmeyi ve verilerden veri çıkarmayı kolaylaştırabilirsiniz. Dağınık ve kötü biçimlendirilmiş HTML'yi zarif bir şekilde yönetir ve ayrıştırma sorunlarıyla uğraşmak yerine veri çıkarmaya odaklanmanıza olanak tanır.
BeautifulSoup (Beautiful Soup Python), ayrıştırmaya ek olarak bir HTML belgesi içindeki belirli öğeleri aramak ve filtrelemek için çeşitli yöntemler sağlar. Bu, ister metin, ister bağlantılar, resimler veya diğer HTML nitelikleri olsun, ilgilendiğiniz verileri kolayca hedefleyip çıkarabileceğiniz anlamına gelir.
GüzelÇorba Nesneleri
BeautifulSoup ile web kazıma, bir HTML sayfasının Belge Nesne Modelinde (DOM) etkili bir şekilde gezinme ve arama becerisini içerir. Web kazıma için tasarlanmış bir Python kütüphanesi olan BeautifulSoup, bunu verimli bir şekilde yapmanız için sizi gerekli araçlar ve yöntemlerle donatır.
BeautifulSoup'un özünde, Python'da genellikle bs4 nesnesi olarak adlandırılan BeautifulSoup nesnesi kavramı yatmaktadır. Bu nesne, ayrıştırılmış HTML belgesini temsil eder ve içeriğinde gezinmek ve değiştirmek için giriş noktanız olarak hizmet eder.
BeautifulSoup nesnesi oluşturmak için genellikle bir HTML belgesini ayrıştırarak başlarsınız. İşte nasıl yapıldığı:
bs4'ten BeautifulSoup'u içe aktar # Bir HTML belgesini ayrıştırma çorba = BeautifulSoup(html_content, 'html.parser')
Elinizde bir BeautifulSoup nesnesi varken HTML sayfasının DOM'unu keşfedebilir ve onunla etkileşim kurabilirsiniz.
Etiketleri Arama
Bir belgede belirli HTML etiketlerini aramak, web kazımanın temel bir yönüdür ve BeautifulSoup, bu işlemi kolaylaştırmak amacıyla etiket tabanlı aramalar için çeşitli yöntemler sağlar. En sık kullanılan yöntem, belirli bir etiketin ilk geçtiği yeri bulmanıza yardımcı olan find() yöntemidir. Örneğin ilkini bulmak için <p> HTML belgesindeki etiketi kullanmak için şu kodu kullanabilirsiniz:
# İlkini bul <p> tag ilk_paragraf = çorba.find('p')
Belirli özelliklere sahip etiketleri de arayabilirsiniz. Hepsini bulmak istiyorsanız <a> 'href' özelliğine sahip etiketler kullanıyorsanız, aşağıdaki kod işinizi görecektir:
# Tümünü bul <a> 'href' özelliğine sahip etiketler bağlantılar = çorba.find_all('a', href=True)
Bu yöntemler, bir web sayfasındaki belirli öğelerin yerini belirleme görevini basitleştirir.
Etiketleri Filtreleme ve Seçme
Aramanızı daha da hassaslaştırmak için filtreler ve seçiciler kullanabilirsiniz. Filtreler belirli kriterlere göre etiketleri bulmanızı sağlarken, seçiciler CSS benzeri seçicileri kullanarak etiketleri aramanıza olanak tanır.
Örneğin, tüm başlık etiketlerini bulmak için (<h1>, <h2>, vb.) bir sayfada aşağıdaki gibi bir filtre kullanabilirsiniz:
# Tüm başlık etiketlerini bulun başlıklar = çorba.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
Seçiciler, belirli sınıflara, kimliklere veya diğer niteliklere sahip öğeleri hedeflemenizi sağlayarak daha fazla esneklik sağlar:
# 'article-content' sınıfına sahip tüm öğeleri bulun makale_content = çorba.select('.article-content')
Bu teknikler, tam olarak ihtiyacınız olan verileri çıkarmak için gereken hassasiyeti sağlar.
HTML belgeleri, öğelerin diğer öğelerin içine yerleştirildiği ağaçlar olarak yapılandırılmıştır. Web kazıma konusunda uzman olmak için bu ayrıştırma ağacında etkili bir şekilde gezinmeniz gerekir. BeautifulSoup, ağaçta yukarı, aşağı veya yana doğru hareket etmenize yardımcı olacak çeşitli yöntemler sunar.
Ağaçta aşağı inmek ve bir öğenin alt öğelerine erişmek için, özyinelemeli parametre False olarak ayarlanmış şekilde find_all() yöntemini kullanabilirsiniz:
# Bir çocuğun çocuklarına erişin <div> eleman çocukları = div_element.find_all(recursive=False)
Ağaçta yukarı çıkmak ve bir öğenin ebeveynine erişmek için parent özelliğini kullanabilirsiniz:
# Bir öğenin ebeveynine erişme <p> ebeveyn öğe = p_element.parent
Son olarak, ağaçta yanlara doğru ilerlemek için next_sibling ve önceki_sibling niteliklerini kullanabilirsiniz:
# Bir sonraki kardeşine erişim <p> element next_sibling = p_element.next_sibling
Bu gezinme teknikleri, verileri bulmak ve çıkarmak için DOM'u geçmeniz gerektiğinde çok değerlidir.
HTML'den Veri Çıkarma
Başarılı bir şekilde gezinip istenen HTML öğelerini belirledikten sonra, web kazımadaki bir sonraki önemli adım, bu öğeler içindeki verileri çıkarmaktır. BeautifulSoup, verileri verimli bir şekilde çıkarmak için çeşitli yöntemler sunar.
Metin Çıkarma
Veri çıkarmanın en basit biçimi, HTML öğeleri içindeki metin içeriğini almayı içerir. Bunu text niteliğini veya get_text() yöntemini kullanarak başarabilirsiniz:
# Bir metinden metin çıkar <p> element paragraf_text = p_element.text # Tümünden metin çıkar <p> listedeki öğeler all_paragraphs_text = [paragraf_listesindeki p için p.get_text()]
Bu özellik, makale içeriği, ürün açıklamaları veya diğer metin tabanlı verilerle ilgileniyor olsanız da, web sayfalarından metinsel bilgi toplama görevini basitleştirir.
Niteliklerin Çıkarılması
HTML etiketleri sıklıkla ek bilgiler içeren özelliklerle birlikte gelir. BeautifulSoup bu nitelikleri kolaylıkla çıkarmanızı sağlar. Örneğin, href niteliğini bir bağlantıdan çıkarmak istiyorsanız (<a>) öğesinde aşağıdaki kodu kullanabilirsiniz:
# 'href' özelliğini bir dosyadan çıkarın <a> tag link_href = a_tag['href']
Benzer şekilde, üzerinde çalıştığınız belirli öğelere bağlı olarak src, class, id ve daha fazlası gibi nitelikleri çıkarabilirsiniz.
Tablolardan Veri Çıkarma
Tablolar, web sayfalarındaki verileri düzenlemek için kullanılan yaygın bir yapıdır. BeautifulSoup, HTML tablolarından veri çıkarmak için özel yöntemler sunar. Tabloları etiket tabanlı aramalarla bulabilir ve ardından tablo halindeki verileri çıkarmak için satırları ve sütunları arasında gezinebilirsiniz.
# Tümünü bul <table> sayfadaki öğeler tabloları = çorba.find_all('tablo') # İlk tabloya erişin First_table = tablolar[0] # First_table.find_all('tr') içindeki satır için tablonun satır ve sütunlarından verileri çıkarın: hücreler = hücrelerdeki hücre için row.find_all('td'): cell_data = cell.text
Bu yaklaşım özellikle veri toplama ve analiz için çok önemli olan yapılandırılmış verileri tablolardan çıkarmak için kullanışlıdır.
Formlardan Veri Çıkarma
Web formları, web sitelerindeki kullanıcı etkileşimlerinde çok önemli bir rol oynar. BeautifulSoup, giriş alanları, açılır menüler ve düğmeler gibi form öğelerinden veri çıkarmanız gerektiğinde yardımınıza gelir. Bu yetenek, veri girişini veya form gönderimlerini otomatikleştirmek istediğinizde paha biçilmezdir.
# Tümünü bul bir form içindeki öğeler input_fields = form_element.find_all('input') # input_fields içindeki input_field için giriş alanlarından verileri çıkarın: input_name = input_field['name'] input_value = input_field['value']
Formlardan veri çıkararak kullanıcı etkileşimlerini simüle edebilir ve tekrarlanan görevleri kolaylıkla otomatikleştirebilirsiniz.
Farklı Etiket Türlerini Kullanma
BeautifulSoup ile web kazıma söz konusu olduğunda, çeşitli HTML etiket türlerini kullanma konusunda usta olmak çok önemlidir. Her etiket bir web sayfasındaki farklı bir öğeyi temsil eder ve BeautifulSoup bunlarla etkili bir şekilde çalışmak için gerekli araçları sağlar. Bu bölümde bağlantılar, resimler, listeler ve iç içe geçmiş etiketlerle nasıl başa çıkacağımızı keşfedeceğiz.
Bağlantılarla Çalışmak
Bağlantılar web içeriğinin temel bir parçasıdır ve bunların çıkarılması çeşitli web kazıma görevleri için gerekli olabilir. BeautifulSoup, bağlantılarla çalışmayı ve bağlantıların URL'lerini çıkarmayı kolaylaştırır.
Bir sayfadaki tüm bağlantıları bulmak için 'a' etiketiyle find_all() yöntemini kullanabilirsiniz:
# Tümünü bul <a> sayfadaki etiketler (bağlantılar) links = çorba.find_all('a') Daha sonra URL'lerini çıkarmak için bağlantılar arasında yineleme yapabilirsiniz: # Bağlantılardaki bağlantı için tüm bağlantıların URL'lerini çıkarın ve yazdırın: link_url = link['href '] print(link_url)
Bu, harici URL'ler, dahili bağlantılar veya indirilebilir içeriğe referanslar gibi değerli bilgileri toplamanıza olanak tanır.
Görsellerle Başa Çıkmak
Resimler, web sayfalarındaki diğer bir yaygın öğedir ve bunların kaynak URL'lerini veya diğer özelliklerini çıkarmanız gerekebilir. BeautifulSoup, resim etiketleriyle çalışma sürecini basitleştirir (<img>).
Bir sayfadaki tüm resim etiketlerini bulmak için 'img' etiketiyle birlikte find_all() yöntemini kullanın:
# Tümünü bul <img> sayfadaki etiketler (görüntüler) görüntüler = çorba.find_all('img') Daha sonra her görüntü için kaynak (src) veya alternatif metin (alt) gibi nitelikleri çıkarabilirsiniz: # Tüm görüntülerin src ve alt niteliklerini ayıklayın ve yazdırın resimlerdeki resim için resimler: img_src = resim['src'] img_alt = resim['alt'] print(f"Resim kaynağı: {img_src}, Alternatif metin: {img_alt}")
Bu, bir web sayfasında kullanılan görseller hakkında bilgi toplamanıza olanak tanır.
Listelerden Veri Çıkarma
Sıralı veya sırasız listeler, bir web sayfasında bilgi sunmanın yapılandırılmış bir yoludur. BeautifulSoup, liste öğelerinden veri çıkarmanıza yardımcı olabilir (
- ,
- ) verimli bir şekilde.
Bir sayfadaki tüm liste öğelerini bulmak için 'ul', 'ol' veya 'li' etiketleriyle find_all() yöntemini kullanabilirsiniz:
# Tümünü bul
- ,
- sayfadaki etiketler (liste öğeleri) list_elements = çorba.find_all(['ul', 'ol', 'li'])
- , veya
Daha sonra her liste öğesinden metni veya diğer içeriği çıkarabilirsiniz:
# List_elements içindeki liste_element için tüm liste öğelerinin içeriğini çıkarın ve yazdırın: list_item_text = list_element.get_text() print(list_item_text)
Bu, menü öğeleri, ürün özellikleri veya madde işaretli bilgiler gibi listelerden yapılandırılmış veriler toplamanıza olanak tanır.
İç İçe Etiketlerin Kullanımı
Web sayfaları genellikle bir etiketin diğerinin içinde yer aldığı iç içe geçmiş HTML etiketleri içerir. BeautifulSoup, iç içe geçmiş etiketleri kullanma konusunda uzmandır ve zahmetsizce gezinmenize ve onlardan veri çıkarmanıza olanak tanır.
Bir metin içindeki metni çıkarmak istediğiniz bir senaryo düşünün. <div> iç içe geçmiş öğe içeren öğe <p> Ve <span> Etiketler:
<code><div> <p>Bu bir paragraf.</p> <span>Bazı ek metinler.</span> </div>
bulmak için BeautifulSoup'u kullanabilirsiniz. <div> öğesini seçin ve ardından metni, iç içe geçmiş olanlar da dahil olmak üzere tüm alt etiketlerinden çıkarın:
# Bul <div> element div_element = çorba.find('div') # İçindeki metni çıkartın ve yazdırın <div> ve iç içe geçmiş etiketleri div_text = div_element.get_text() print(div_text)
Bu yaklaşım, HTML yapısında kaybolmadan iç içe geçmiş etiketlerin içeriğiyle çalışmanıza olanak tanır.
Gelişmiş GüzelÇorba Teknikleri
BeautifulSoup, temel etiket işleme tekniklerine ek olarak web kazıma çalışmalarınızı geliştirebilecek gelişmiş yetenekler sunar. Bu bölümde, düzenli ifadelerin kullanımı, HTML'nin değiştirilmesi, XML ile çalışma ve hataların ve istisnaların ele alınması da dahil olmak üzere bu tekniklerden bazılarını inceleyeceğiz.
Normal İfadeleri Kullanma
Düzenli ifadeler, metin içinde kalıp eşleştirmeye yönelik güçlü araçlardır. BeautifulSoup, HTML belgelerinde etiket veya metin ararken normal ifadeleri birleştirmenize olanak tanır.
Örneğin hepsini bulmak istiyorsanız <a> "örnek" kelimesini içeren URL'lere sahip etiketler için find_all() ile birlikte normal bir ifade kullanabilirsiniz:
import re # Düzenli ifade kalıbı tanımlayın model = re.compile(r'example') # Tümünü bul <a> "örnek" bağlantıları içeren href URL'lerine sahip etiketler = çorba.find_all('a', href=pattern)
Bu teknik, aramalarınız üzerinde ayrıntılı kontrol sağlar ve belirli veri modellerini çıkarmanıza olanak tanır.
HTML'yi değiştirmek
Bazen web kazıma yalnızca veri çıkarmayı değil aynı zamanda HTML içeriğinde değişiklikler yapmayı da içerir. BeautifulSoup, ayrıştırılmış HTML belgesini değiştirmenize ve gerekirse değişiklikleri kaydetmenize olanak tanır.
Örneğin belirli bir öğenin metin içeriğini değiştirebilirsiniz:
# Bul <p> öğesini seçin ve metnini değiştirin p_element = çorba.find('p') p_element.string = "Paragraf için yeni metin"
Değişiklik yaptıktan sonra değiştirilen HTML içeriğini bir dosyaya kaydedebilir veya daha sonraki işlemler için kullanabilirsiniz.
XML'le çalışma
BeautifulSoup öncelikle HTML ayrıştırma için tasarlanmış olsa da XML belgelerini de işleyebilir. Bu çok yönlülük, XML tabanlı web hizmetlerinden veya API'lerden veri almanız gerektiğinde değerlidir.
Bir XML belgesini BeautifulSoup ile ayrıştırmak için 'lxml' ayrıştırıcısını belirtebilir ve XML içeriğiyle sanki HTMLmiş gibi çalışabilirsiniz:
bs4'ten import BeautifulSoup # Bir XML belgesini ayrıştırın
Bu esneklik, web kazıma yeteneklerinizi XML tabanlı kaynaklara sorunsuz bir şekilde genişletmenize olanak tanır.
Hataları ve İstisnaları Ele Alma
Web kazıma her zaman sorunsuz bir şekilde ilerlemez ve ağ sorunları veya web sitesi yapısındaki değişiklikler gibi hatalar meydana gelebilir. BeautifulSoup, kazıma komut dosyalarınızı daha sağlam hale getirmek için hata işleme mekanizmaları sağlar.
İstisnaları düzgün bir şekilde ele almak için try ve hariç bloklarını kullanabilirsiniz. Örneğin, belirli bir etiket bulunamazsa AttributeError sorununu halledebilirsiniz:
denemek:
# AttributeError dışında belirli bir etiket etiketi = çorba.find('tag_name') bulma girişimi şu şekilde: e: print(f"Error: {e}")
Hata işlemeyi komut dosyalarınıza dahil ederek, web kazıma çabalarınızın ideal olmayan koşullarda bile güvenilir bir şekilde çalışmaya devam etmesini sağlayabilirsiniz.
Gerçek Dünyadan Web Kazıma Örnekleri
Veri alma ve analiz dünyasında web kazıma, web sitelerinden değerli bilgilerin çıkarılmasında çok önemli bir rol oynar. İster bir veri bilimcisi, ister iş analisti, ister sadece meraklı bir birey olun, web kazıma size projeleriniz için ihtiyaç duyduğunuz verileri sağlayabilir. Bu makalede, bir web sitesini kazımak, birden fazla sayfayla uğraşmak ve sorunsuz kazıma deneyimleri sağlamak için en iyi uygulamaları içeren gerçek dünyadaki web kazıma örneklerini inceleyeceğiz.
Bir Web Sitesini Kazımak
Bir web sitesinin nasıl kazınacağına ilişkin temel bir örneğe bakarak başlayalım. Bir haber sitesinden en son haber makaleleri hakkında veri toplamak istediğinizi varsayalım. Bunu yapmak için Python'a ve BeautifulSoup gibi bir kazıma kütüphanesine ihtiyacınız olacak. İşte adım adım bir kılavuz:
Web Sitesini İnceleyin: Web sitesini web tarayıcınızda açın ve HTML yapısını inceleyin. Kazımak istediğiniz verileri içeren etiketleri ve öğeleri tanımlayın. Bu durumda makale başlıkları, özetleri ve yayın tarihleriyle ilgileniyoruz.
Komut Dosyanızı Yazın: Web sitesinin HTML'sini ayrıştırmak ve istenen verileri çıkarmak için BeautifulSoup'u kullanan bir Python komut dosyası oluşturun. İşte basitleştirilmiş bir örnek:
bs4'ten istekleri içe aktar import BeautifulSoup # Web sitesine bir GET isteği gönder url = 'https://example-news-website.com' yanıt = request.get(url) # HTML içeriğini ayrıştırın çorba = BeautifulSoup(response.text, 'html.parser') # Makale bilgilerini bulun ve çıkarın makaleler = [], çorbadaki makale için.find_all('div', class_='article'): başlık = makale.find('h2').metin özeti = makale. find('p').text date = makale.find('span', class_='yayın-tarihi').text makaleler.append({'başlık': başlık, 'özet': özet, 'tarih': tarih }) # Makalelerdeki makale için toplanan verileri yazdırın: print(makale)
Komut Dosyanızı Çalıştırın: Komut dosyasını yürütün; en son haber makaleleri için web sitesini kazıyacak ve sonuçları gösterecektir. Verileri bir dosyaya veya veritabanına kaydetmek için komut dosyasını daha da geliştirebilirsiniz.
Birden Çok Sayfayı Kazıma
Çoğu zaman, web kazıma tek bir sayfadan fazlasını içerir. Sayfalara ayrılmış arama sonuçları veya birden çok sayfaya yayılmış makaleler gibi bir web sitesinin birden çok sayfasından verileri kazımanız gerekebilir. Bir e-ticaret web sitesinden ürün listelemelerini çıkarmak istediğiniz bir örneği ele alalım:
Sayfalandırmayı Tanımlayın: Web sitesinin sayfalandırmayı nasıl gerçekleştireceğini belirleyin. URL'ler, sayfa numarasını belirten sorgu parametrelerini içerebilir veya gezinme için "İleri" düğmelerini kullanabilir.
Komut Dosyanızı Değiştirin: Birden fazla sayfa arasında geçiş yapmak ve her sayfadan veri toplamak için kazıma komut dosyanızı değiştirin. İşte genel bir taslak:
BS4'ten içe aktarma istekleri import BeautifulSoup içe aktarma süresi def fetch_products(page): url = f'https://example-ecommerce-site.com/products?page={page}' başlıkları = {'User-Agent': 'Kullanıcınız -Agent Burada'} yanıt = request.get(url, başlıklar=başlıklar) if yanıt.status_code == 200: return yanıt.metin else: print(f"Sayfa alınamadı {sayfa}") return Yok def parse_page(html ): çorba = BeautifulSoup(html, 'html.parser') ürünler = çorba.find_all('div', class_='product') ürünlerdeki ürün için: name =product.find('h2').text fiyat = ürün .find('span', class_='price').text print(f'Product: {name}, Price: {price}') def main(): page = 1 while True: html = fetch_products(page) if html: parse_page(html) page += 1 time.sleep(1) # İstekler arasında bekleyerek saygılı olun else: #'yi kırın Daha fazla sayfa yoksa veya bir hata oluştuysa döngüden çıkın, eğer __name__ == '__main__': main()
Bu komut dosyası, kazınacak sayfa kalmayıncaya kadar ürün listelemelerini birden çok sayfadan sıyırır.
Web Scraping En İyi Uygulamaları
Web kazıma güçlü bir araçtır ancak etik ve sorumlu kazıma sağlamak için en iyi uygulamaları takip etmek önemlidir:
Robots.txt'ye saygı gösterin: Web tarayıcılarına izin verip vermediğini veya izin vermediğini görmek için web sitesinin robots.txt dosyasını kontrol edin. Bir web sitesinin hizmet şartlarına her zaman saygı gösterin.
Gecikme ve Azaltma Kullan: Sunucunun aşırı yüklenmesini önlemek için istekler arasına gecikmeler ekleyin. Bu, sorumlu kazıma davranışını gösterir.
Hata İşleme: Ağ sorunlarını, eksik öğeleri veya web sitesi yapısındaki değişiklikleri zarif bir şekilde ele almak için komut dosyalarınızda hata işlemeyi uygulayın.
Yasal ve Etik Hususlar: Kazıma faaliyetlerinizin yasal ve etik standartlara uygun olduğundan emin olun. Uygun izin olmadan hassas veya kişisel bilgileri kazımaktan kaçının.
Veri Depolama ve Dışa Aktarma
Web sitelerinden verileri başarılı bir şekilde çıkardıktan sonra, daha fazla analiz veya kullanım için bu verileri depolamak ve dışa aktarmak isteyeceksiniz. Bu bölümde, kazınmış verilerinizi dışa aktarmak için farklı veri depolama formatlarını ve yöntemlerini inceleyeceğiz.
Verileri Farklı Formatlarda Depolama
Kazınmış veriler, projenizin gereksinimlerine bağlı olarak çeşitli formatlarda saklanabilir:
- Listeler ve Sözlükler: Kazınmış verileri listeler ve sözlükler gibi Python veri yapılarında saklayabilirsiniz. Bu, bellekteki verileri düzenlemenin basit ve esnek bir yoludur.
- CSV (Virgülle Ayrılmış Değerler): CSV dosyaları genellikle tablo verileri için kullanılır. Kazınmış verileri CSV dosyalarına yazmak için csv gibi Python kitaplıklarını kullanabilirsiniz. Bu format, elektronik tablo yazılımı ve veritabanı araçlarıyla uyumludur.
- JSON (JavaScript Nesne Gösterimi): JSON, okunması ve yazılması kolay, hafif bir veri değişim formatıdır. Python'un yerleşik JSON desteği vardır, bu da onu yapılandırılmış verileri depolamak için uygun bir seçim haline getirir.
- Veritabanları: Daha kapsamlı veya yapılandırılmış veri kümeleri için verileri MySQL, PostgreSQL veya SQLite gibi ilişkisel bir veritabanında saklamayı düşünün. Python, veritabanı etkileşimi için SQLAlchemy gibi kütüphaneler sağlar.
- Excel: Verilerinizin teknik bilgisi olmayan kullanıcılarla paylaşılması gerekiyorsa Excel dosyaları (XLSX formatı) uygun bir seçim olabilir. openpyxl gibi Python kütüphaneleri Excel dosyalarıyla çalışmanıza olanak tanır.
Verileri CSV, JSON ve Veritabanlarına Aktarma
Alıntılanan verilerin CSV, JSON ve veritabanları gibi yaygın formatlara nasıl aktarılacağını keşfedelim:
CSV'ye aktarma
import csv # Örnek kazınmış veri verileri = [{'name': 'Product 1', 'price': '$10'}, {'name': 'Product 2', 'price': '$20'}] # CSV dosya yolu csv_file = 'products.csv' # Dosya olarak open(csv_file, 'w', newline='') ile CSV dosyasına veri yazın: fieldnames = data[0].keys()writer = csv.DictWriter( file, fieldnames=fieldnames) # Başlık satırı yazar.writeheader() # Verideki satır için veri satırlarını yazın:writer.writerow(row) print(f'Veri {csv_file} dosyasına aktarıldı')
JSON'a aktarma
import json # Örnek kazınmış veri verileri = [{'name': 'Product 1', 'price': '$10'}, {'name': 'Product 2', 'price': '$20'}] # JSON dosya yolu json_file = 'products.json' # Dosya olarak open(json_file, 'w') ile JSON dosyasına veri yazın: json.dump(data, file, indent=4) print(f'Veri {json_file dosyasına aktarıldı) }')
Veritabanlarına Aktarma
Veri depolama için veritabanı kullanmak ölçeklenebilirlik ve esneklik sağlar. Kazınmış verileri bir SQLite veritabanına aktarmanın basitleştirilmiş bir örneğini burada bulabilirsiniz:
import sqlite3 # Örnek kazınmış veri verileri = [{'name': 'Product 1', 'price': '$10'}, {'name': 'Product 2', 'price': '$20'}] # Oluşturun veya SQLite veritabanına bağlanın db_file = 'products.db' bağlantı = sqlite3.connect(db_file) imleç = Connection.cursor() # Verileri depolamak için bir tablo oluşturun Cursor.execute('''CREATE TABLE IF NOT EXISTS ürünleri ( id) TAM SAYI BİRİNCİL ANAHTAR, ad METİN, fiyat METİN )''') # Veri içindeki öğe için tabloya veri ekleyin: Cursor.execute("INSERT INTO ürünler (isim, fiyat) VALUES (?, ?)", (item[' name'], item['price'])) # Değişiklikleri kabul edin ve veritabanı bağlantısını kapatın Connection.commit() Connection.close() print(f'Veri {db_file} dosyasına aktarıldı')
Bu uygulamaları takip ederek, kazınmış verilerinizi verimli bir şekilde depolayabilir ve veri analiziniz veya diğer uygulamalarınız için erişilebilir ve uygun formatlarda dışa aktarabilirsiniz.
Etik ve Yasal Hususlar
Web kazıma, internetten veri toplama yöntemimizde devrim yaratarak değerli bilgilere çeşitli amaçlarla erişmemizi sağladı. Ancak büyük güç, büyük sorumluluğu da beraberinde getirir. Bu bölümde, her web kazıyıcının dikkat etmesi gereken etik ve yasal hususlara değineceğiz.
Web Sitesi Politikalarına Saygı Gösterme
Herhangi bir web kazıma girişimine başlamadan önce, web sitesinin politikalarını ve hizmet şartlarını kontrol etmek ve bunlara uymak çok önemlidir. Birçok web sitesi, robots.txt dosyasında veya kullanım şartlarında web kazımaya izin verilip verilmediğini veya yasaklandığını açıkça belirtir.
- Robots.txt Dosyası: Bazı web siteleri, web sitesinin alan adının kökünde bulunabilen robots.txt dosyasında web tarayıcılarına yönelik yönergeler sağlar (örneğin, https://example.com/robots.txt). Sitenin hangi bölümlerinin tarayıcıların erişimine kapalı olduğunu belirlemek için bu dosyayı inceleyin.
- Hizmet Şartları: Web sitelerinde genellikle içeriklerine erişme ve bunları kullanma kurallarını belirleyen hizmet şartları bulunur. Bu şartlar web kazımayı açıkça yasaklayabilir. Etik davranışı sürdürmek için her zaman bu şartlara uyun.
Sunucuların Aşırı Yüklenmesini Önlemek
Sorumlu web kazıma, bir web sitesinin sunucularının aşırı isteklerle aşırı yüklenmesinden kaçınmayı içerir. Aşırı istekler web sitesinin normal işleyişini bozabilir ve kullanıcı deneyimini olumsuz etkileyebilir. Sunucunun aşırı yüklenmesini önlemek için bazı uygulamalar şunlardır:
- Hız Sınırlama: İsteklerin zaman içinde aralıklı olmasını sağlamak için kazıma komut dosyanıza hız sınırlaması uygulayın. Bu, kısa sürede çok fazla istek gönderilmesini engeller.
- HEAD İsteklerinin Kullanımı: Tam bir GET isteği yapmadan önce bir sayfanın değiştirilip değiştirilmediğini kontrol etmek için HEAD isteklerini kullanmayı düşünün. Bu, bant genişliğinden tasarruf edebilir ve sunucu yükünü azaltabilir.
- Nezaket: Kazıma yaparken kibar ve saygılı olun. Kazıma botunuzu tanımlamak için isteklerinizde Kullanıcı Aracısı başlığını kullanın. Web sitelerinin robots.txt dosyasında web kazıyıcılara yönelik özel yönergeleri bulunabilir.
Gizlilik ve Veri Koruma
Avrupa Birliği'ndeki Genel Veri Koruma Yönetmeliği (GDPR) gibi kullanıcı gizliliği ve veri koruma yasalarına saygı gösterin. Kişisel bilgiler içerebilecek web sitelerini ayıklarken verileri anonimleştirmek ve sorumlu bir şekilde işlemek için gerekli adımları atın:
- Veri Minimizasyonu: Yalnızca özel amacınız için ihtiyaç duyduğunuz verileri toplayın ve gereksiz veri toplanmasından kaçının.
- Anonimleştirme: Kişisel olarak tanımlanabilir bilgileri (PII) kazınan verilerden kaldırın veya anonimleştirin.
- Rıza: Özellikle hassas bilgiler içeriyorsa, verileri kazımak ve kullanmak için gerekli izne sahip olduğunuzdan emin olun.
Ipuçları ve Püf noktaları
Web kazıma, uyarlanabilirlik ve ustalık gerektiren dinamik bir alandır. Bu bölümde web kazıma yeteneklerinizi geliştirmek için bazı ipuçlarını ve püf noktalarını inceleyeceğiz.
Verim iyileştirmesi
Verimli web kazıma, kazıma komut dosyanızı hız ve kaynak kullanımı için optimize etmeyi içerir. İşte bazı performans optimizasyon teknikleri:
- Paralelleştirme: Birden fazla sayfayı veya web sitesini aynı anda işlemek için kazıma görevlerinizi paralelleştirmeyi düşünün, böylece gereken toplam süreyi azaltın.
- Önbelleğe Alma: Daha önce alınan verileri yerel olarak depolamak için önbelleğe alma mekanizmalarını uygulayarak gereksiz isteklere olan ihtiyacı azaltın.
- API'lerin Kullanımı: Mümkün olduğunda web siteleri tarafından sağlanan resmi API'leri kullanın, çünkü bunlar genellikle web kazımaktan daha verimli ve güvenilirdir.
Dinamik Web Sitelerini Yönetme
Birçok modern web sitesi, JavaScript aracılığıyla yüklenen dinamik içeriğe güvenir. Bu tür web sitelerini taramak için, web sayfasıyla gerçek bir kullanıcının yapacağı gibi etkileşime girebilen Selenium veya Puppeteer gibi başsız tarayıcılar kullanmanız gerekebilir.
- Selenyum: Selenyum, web tarayıcılarını otomatikleştirmek için popüler bir araçtır ve özellikle dinamik web sitelerini kazımak için kullanışlıdır. Web öğeleriyle etkileşime girmenize, formları doldurmanıza ve sayfalar arasında gezinmenize olanak tanır.
Kimlik doğrulama ile kazıma
Bazı web siteleri belirli verilere erişmek için kullanıcı kimlik doğrulamasını gerektirir. Kimlik bilgilerini sağlayarak ve oturum çerezlerini saklayarak, kazıma komut dosyanızdaki oturum açma işlemini otomatikleştirebilirsiniz.
- Oturum Yönetimi: İstekler arasında oturum açma oturumlarını sürdürmek için oturum yönetimi kitaplıklarını kullanın.
- Çerezler: Kazıyıcınızın kimliğini doğrulamak için çerezleri yakalayın ve yönetin.
Sürekli İzleme ve Otomasyon
Web kazıma genellikle periyodik veri toplamayı içerir. Kazıma görevlerinizi belirli aralıklarla çalışacak şekilde planlayarak otomatikleştirmeyi düşünün. Cron işleri veya görev zamanlayıcılar gibi araçlar, kazıma komut dosyalarınızı otomatikleştirmenize yardımcı olabilir.
- Hata İşleme ve Uyarılar: Kazıma sırasında herhangi bir sorunu size bildirmek için hata işleme mekanizmalarını uygulayın. Uyarılar veya e-posta bildirimleri, kazıma görevlerinizin durumu hakkında bilgi sahibi olmanıza yardımcı olabilir.
Çözüm
Bu kapsamlı kılavuzda, BeautifulSoup'u kullanarak temel kavramları, en iyi uygulamaları ve ileri teknikleri kapsayan web kazıma dünyasını keşfettik. Web kazıma becerilerinizi geliştirmeye devam ederken, teknik becerinizi etik hususlar ve yasal uyumlulukla dengelemeyi unutmayın. Web kazıma, sorumlu ve etik bir şekilde kullanıldığında değerli veriler ve içgörülerle dolu bir dünyanın kilidini açabilecek güçlü bir araçtır.
BeautifulSoup Web Scraping'in Özeti
- BeautifulSoup Nesneleri: BeautifulSoup nesneleri, ayrıştırılmış HTML belgesini temsil eder ve web kazıma için temel görevi görür.
- Etiket Arama ve Gezinme: BeautifulSoup, DOM'da arama ve gezinme için yöntemler sağlayarak belirli öğeleri bulmanıza ve çıkarmanıza olanak tanır.
- Veri Çıkarma: BeautifulSoup'un özelliklerini kullanarak HTML öğelerinden metin ve nitelikler de dahil olmak üzere verileri çıkarabilirsiniz.
- Dinamik Web Sitelerini Yönetme: Dinamik web siteleriyle uğraşırken Selenium gibi başsız tarayıcıları kullanmayı düşünün.
- Kimlik Doğrulama: Oturum açma gereksinimleri olan web sitelerini kazırken kimlik doğrulama süreçlerini otomatikleştirin.
BeautifulSoup ile Web Scraping'in Geleceği
Web kazıma alanı sürekli olarak gelişmektedir. BeautifulSoup, çok yönlülüğü ve kullanım kolaylığıyla veri çıkarma için değerli bir araç olmaya devam ediyor. Web siteleri daha karmaşık hale geldikçe ve veri gizliliği düzenlemeleri geliştikçe, web kazıyıcıların verileri sorumlu bir şekilde toplamak için yeni teknikler uyarlaması ve geliştirmesi gerekecektir. BeautifulSoup ile web kazımanın geleceği, teknoloji ve etik standartlar gelişmeye devam ettikçe heyecan verici olanaklara sahiptir.
- ,