Python Kullanarak Web Scraping: Adım Adım Kılavuz

Yayınlanan: 2022-11-28

Web kazıma, bir web sitesinden bilgi çıkarma ve onu belirli bir kullanım durumu için kullanma fikridir.

Diyelim ki bir web sayfasından bir tablo çıkarmaya, onu bir JSON dosyasına dönüştürmeye ve JSON dosyasını bazı dahili araçlar oluşturmak için kullanmaya çalışıyorsunuz. Web kazıma yardımıyla, bir web sayfasındaki belirli öğeleri hedefleyerek istediğiniz verileri çıkarabilirsiniz. Python kullanarak Web kazıma çok popüler bir seçimdir çünkü Python, verileri etkili bir şekilde çıkarmak için BeautifulSoup veya Scrapy gibi birden fazla kitaplık sağlar.

ağ kazıma

Verileri verimli bir şekilde çıkarma becerisine sahip olmak, bir geliştirici veya veri bilimcisi olarak da çok önemlidir. Bu makale, bir web sitesini etkili bir şekilde nasıl kazıyacağınızı anlamanıza ve ihtiyacınıza göre onu manipüle etmek için gerekli içeriği almanıza yardımcı olacaktır. Bu eğitim için, BeautifulSoup paketini kullanacağız. Python'da veri kazımak için modaya uygun bir pakettir.

Neden Web Scraping için Python kullanıyorsunuz?

Python, web kazıyıcılar oluştururken birçok geliştirici için ilk tercihtir. Python'un ilk tercih olmasının birçok nedeni var, ancak bu makale için Python'un veri kazıma için kullanılmasının en önemli üç nedenini tartışalım.

Kütüphane ve Topluluk Desteği: Web sayfalarını etkili bir şekilde kazımak için harika işlevler sağlayan BeautifulSoup, Scrapy, Selenium vb. gibi birkaç harika kitaplık vardır. Web kazıma için mükemmel bir ekosistem oluşturdu ve ayrıca dünya çapındaki birçok geliştirici zaten Python kullandığından, takılıp kaldığınızda hızlı bir şekilde yardım alabilirsiniz.

Otomasyon: Python, otomasyon yetenekleriyle ünlüdür. Kazıma işlemine dayanan karmaşık bir araç yapmaya çalışıyorsanız, web kazımadan daha fazlası gerekir. Örneğin, bir çevrimiçi mağazadaki öğelerin fiyatını takip eden bir araç oluşturmak istiyorsanız, oranları günlük olarak takip edebilmesi ve veritabanınıza ekleyebilmesi için bazı otomasyon yetenekleri eklemeniz gerekir. Python size bu tür işlemleri kolaylıkla otomatikleştirme yeteneği verir.

Veri Görselleştirme: Web kazıma, veri bilimcileri tarafından yoğun bir şekilde kullanılmaktadır. Veri bilimcilerin genellikle web sayfalarından veri çıkarması gerekir. Python, Pandas gibi kitaplıklarla ham verilerden veri görselleştirmeyi kolaylaştırır.

Python'da Web Scraping için Kitaplıklar

Web kazımayı basitleştirmek için Python'da kullanılabilen birkaç kitaplık vardır. Burada en popüler üç kütüphaneyi tartışalım.

1 numara. güzel çorba

Web kazıma için en popüler kitaplıklardan biri. BeautifulSoup, 2004'ten beri geliştiricilerin web sayfalarını kazımasına yardımcı oluyor. Ayrıştırma ağacında gezinmek, aramak ve değiştirmek için basit yöntemler sağlar. Beautifulsoup, gelen ve giden veriler için kodlamayı da kendisi yapar. Bakımlı ve harika bir topluluğa sahip.

2 numara. hurda

Veri çıkarma için başka bir popüler çerçeve. Scrapy'nin GitHub'da 43000'den fazla yıldızı var. API'lerden veri sıyırmak için de kullanılabilir. Ayrıca, e-posta göndermek gibi birkaç ilginç yerleşik desteğe sahiptir.

#3. Selenyum

Selenyum esas olarak bir web kazıma kitaplığı değildir. Bunun yerine, bir tarayıcı otomasyon paketidir. Ancak, web sayfalarını kazımak için işlevlerini kolayca genişletebiliriz. Farklı tarayıcıları kontrol etmek için WebDriver protokolünü kullanır. Selenyum, yaklaşık 20 yıldır piyasada. Ancak Selenium'u kullanarak web sayfalarındaki verileri kolayca otomatikleştirebilir ve sıyırabilirsiniz.

Python Web Scraping ile ilgili Zorluklar

Web sitelerinden veri sıyırmaya çalışırken birçok zorlukla karşılaşılabilir. Yavaş ağlar, kazıma önleyici araçlar, IP tabanlı engelleme, captcha engelleme vb. sorunlar vardır. Bu sorunlar, bir web sitesini kazımaya çalışırken büyük sorunlara neden olabilir.

Ancak bazı yolları izleyerek zorlukları etkili bir şekilde atlayabilirsiniz. Örneğin, çoğu durumda, belirli bir zaman aralığında belirli bir miktardan daha fazla istek gönderildiğinde, bir IP adresi bir web sitesi tarafından engellenir. IP engellemesini önlemek için kazıyıcınızı istekleri gönderdikten sonra soğuması için kodlamanız gerekir.

web kazımada zorluklar

Geliştiriciler ayrıca kazıyıcılar için bal küpü tuzakları koyma eğilimindedir. Bu tuzaklar genellikle çıplak insan gözüyle görülemez, ancak bir kazıyıcı tarafından taranabilir. Böyle bir bal küpü tuzağı kuran bir web sitesini kazıyorsanız, kazıyıcınızı buna göre kodlamanız gerekir.

Captcha, kazıyıcılarla ilgili bir başka ciddi sorundur. Günümüzde çoğu web sitesi, sayfalarına bot erişimini korumak için bir captcha kullanıyor. Böyle bir durumda, bir captcha çözücü kullanmanız gerekebilir.

Python ile Bir Web Sitesini Scraping

Konuştuğumuz gibi, bir web sitesini çöpe atmak için BeautifulSoup kullanacağız. Bu eğitimde, Ethereum'un tarihsel verilerini Coingecko'dan kazıyacağız ve tablo verilerini bir JSON dosyası olarak kaydedeceğiz. Sıyırıcıyı oluşturmaya geçelim.

İlk adım, BeautifulSoup ve İstekleri yüklemektir. Bu eğitim için Pipenv kullanacağım. Pipenv, Python için bir sanal ortam yöneticisidir. İsterseniz Venv de kullanabilirsiniz ama ben Pipenv'i tercih ederim. Pipenv'i tartışmak bu eğitimin kapsamı dışındadır. Ancak Pipenv'in nasıl kullanılabileceğini öğrenmek istiyorsanız bu kılavuzu izleyin. Veya Python sanal ortamlarını anlamak istiyorsanız bu kılavuzu izleyin.

pipenv shell komutunu çalıştırarak proje dizininizde Pipenv pipenv shell başlatın. Sanal ortamınızda bir alt kabuk başlatacak. Şimdi, BeautifulSoup'u yüklemek için aşağıdaki komutu çalıştırın:

 pipenv install beautifulsoup4

İstekleri yüklemek için yukarıdakine benzer bir komut çalıştırın:

 pipenv install requests

Kurulum tamamlandıktan sonra, gerekli paketleri ana dosyaya aktarın. main.py adlı bir dosya oluşturun ve aşağıdaki gibi paketleri içe aktarın:

 from bs4 import BeautifulSoup import requests import json

Bir sonraki adım, geçmiş veri sayfasının içeriğini almak ve bunları BeautifulSoup'ta bulunan HTML ayrıştırıcıyı kullanarak ayrıştırmaktır.

 r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel') soup = BeautifulSoup(r.content, 'html.parser')

Yukarıdaki kodda, istek kitaplığında bulunan get yöntemi kullanılarak sayfaya erişilir. Ayrıştırılan içerik daha sonra soup adı verilen bir değişkende depolanır.

Orijinal kazıma kısmı şimdi başlıyor. İlk olarak, DOM'da tabloyu doğru bir şekilde tanımlamanız gerekir. Bu sayfayı tarayıcıda bulunan geliştirici araçlarını kullanarak incelerseniz, tablonun bu sınıflara sahip olduğunu göreceksiniz table table-striped text-sm text-lg-normal .

bozuk para
Coingecko Ethereum Tarihsel Veri Tablosu

Bu tabloyu doğru şekilde hedeflemek için find yöntemini kullanabilirsiniz.

 table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'}) table_data = table.find_all('tr') table_headings = [] for th in table_data[0].find_all('th'): table_headings.append(th.text)

Yukarıdaki kodda öncelikle soup.find metodu kullanılarak tablo bulunur, daha sonra find_all metodu kullanılarak tablonun içindeki tüm tr elemanları aranır. Bu tr öğeleri, table_data adlı bir değişkende saklanır. Tablo, başlık için birkaç th öğeye sahiptir. Başlıkları bir listede tutmak için table_headings adlı yeni bir değişken başlatılır.

Daha sonra tablonun ilk satırı için bir for döngüsü çalıştırılır. Bu satırda th tüm elemanlar aranır ve metin değerleri table_headings listesine eklenir. Metin, text yöntemi kullanılarak çıkarılır. table_headings değişkenini şimdi yazdırırsanız, aşağıdaki çıktıyı görebileceksiniz:

 ['Date', 'Market Cap', 'Volume', 'Open', 'Close']

Bir sonraki adım, öğelerin geri kalanını kazımak, her satır için bir sözlük oluşturmak ve ardından satırları bir listeye eklemektir.

 for tr in table_data: th = tr.find_all('th') td = tr.find_all('td') data = {} for i in range(len(td)): data.update({table_headings[0]: th[0].text}) data.update({table_headings[i+1]: td[i].text.replace('\n', '')}) if data.__len__() > 0: table_details.append(data)

Bu, kodun temel kısmıdır. table_data değişkenindeki her tr için önce th elemanları aranır. th elemanlar tabloda gösterilen tarihlerdir. Bu th öğeleri, th değişkeninde depolanır. Benzer şekilde, tüm td öğeleri td değişkeninde saklanır.

Boş bir sözlük data başlatılır. Başlatmadan sonra, td öğeleri aralığında döngü yaparız. Her satır için önce sözlüğün ilk alanını th öğesinin ilk öğesiyle güncelleriz. table_headings[0]: th[0].text kodu, bir anahtar/değer çifti tarih ve ilk th öğeyi atar.

İlk öğe başlatıldıktan sonra, diğer öğeler data.update({table_headings[i+1]: td[i].text.replace('\\n', '')}) kullanılarak atanır. Burada, td elemanları metni önce text yöntemi kullanılarak çıkarılır ve sonra tüm \\n , replace yöntemi kullanılarak değiştirilir. Değer daha sonra table_headings listesinin i i+1 1'inci öğesine atanır çünkü i'inci öğe zaten atanmıştır.

Ardından, data sözlüğü uzunluğu sıfırı geçerse sözlüğü table_details listesine ekleriz. Kontrol etmek için table_details listesini yazdırabilirsiniz. Ancak değerleri bir JSON dosyasına yazacağız. Bunun için koda bir göz atalım,

 with open('table.json', 'w') as f: json.dump(table_details, f, indent=2) print('Data saved to json file...')

Değerleri table.json adlı bir JSON dosyasına yazmak için burada json.dump yöntemini kullanıyoruz. Yazma işlemi tamamlandıktan sonra, Data saved to json file... konsola yazdırırız.

Şimdi, aşağıdaki komutu kullanarak dosyayı çalıştırın,

 python run main.py

Bir süre sonra, konsolda Veriler JSON dosyasına kaydedildi… metnini görebileceksiniz. Ayrıca çalışan dosya dizininde table.json adında yeni bir dosya göreceksiniz. Dosya, aşağıdaki JSON dosyasına benzer görünecektir:

 [ { "Date": "2022-11-27", "Market Cap": "$145,222,050,633", "Volume": "$5,271,100,860", "Open": "$1,205.66", "Close": "N/A" }, { "Date": "2022-11-26", "Market Cap": "$144,810,246,845", "Volume": "$5,823,202,533", "Open": "$1,198.98", "Close": "$1,205.66" }, { "Date": "2022-11-25", "Market Cap": "$145,091,739,838", "Volume": "$6,955,523,718", "Open": "$1,204.21", "Close": "$1,198.98" }, // ... // ... ]

Python kullanarak bir web kazıyıcıyı başarıyla uyguladınız. Kodun tamamını görüntülemek için bu GitHub deposunu ziyaret edebilirsiniz.

Çözüm

Bu makale, basit bir Python kazımasını nasıl uygulayabileceğinizi tartıştı. BeautifulSoup'un verileri web sitesinden hızlı bir şekilde sıyırmak için nasıl kullanılabileceğini tartıştık. Ayrıca diğer kullanılabilir kitaplıkları ve Python'un neden birçok geliştiricinin web sitelerini kazımak için ilk tercihi olduğunu tartıştık.

Bu web kazıma çerçevelerine de bakabilirsiniz.