karanlık proxyscrape logo

Web Kazıma, Düzenli İfadeler ve Veri Görselleştirme, Hepsini Python'da Yapmak

Python, Kazıma, Kasım-02-20225 dakika okuma

Web scraping can be defined as the method of collecting and restructuring data from websites. It can also be defined as the programmatic approach of obtaining website data in an automated manner. For instance, you want to extract the email IDs of all people who commented on a Facebook post. You can do this by

İçindekiler

Web kazıma, web sitelerinden veri toplama ve yeniden yapılandırma yöntemi olarak tanımlanabilir. Web sitesi verilerinin otomatik bir şekilde elde edilmesine yönelik programatik yaklaşım olarak da tanımlanabilir. Örneğin, bir Facebook gönderisine yorum yapan tüm kişilerin e-posta kimliklerini çıkarmak istiyorsunuz. Bunu iki yöntemle yapabilirsiniz. İlk olarak, imleci herhangi bir kişinin e-posta adresi dizesine getirebilirsiniz. Daha sonra bunu kopyalayıp bir dosyaya yapıştırabilirsiniz. Bu yöntem manuel kazıma olarak bilinir. Peki ya 2000 e-posta kimliği toplamak istiyorsanız? Bir web kazıma aracının yardımıyla, tüm e-posta kimliklerini manuel kazıma kullanırsanız 3 saat yerine 30 saniye içinde çıkarabilirsiniz.

Web sitelerinden bilgi almak için web kazıma araçlarını kullanabilirsiniz. Yalnızca nasıl tıklayacağınızı bilmeniz yeterlidir ve programlama bilgisi gerekmez. Bu araçlar kaynak verimlidir ve zaman ve maliyet tasarrufu sağlar. Ağ bant genişlikleri hakkında endişelenmeden ihtiyaçlarınıza göre milyonlarca sayfayı kazıyabilirsiniz. Bazı web siteleri, kazıyıcıların veri toplamasını engelleyen anti-botlar uygular. Ancak iyi web kazıma araçları, bu araçları atlamak ve sorunsuz bir kazıma deneyimi sunmak için yerleşik özelliklere sahiptir.

Python'da Web Kazıma

Python, web'den veri kazımak için mükemmel araçlara sahiptir. Örneğin, bir web sayfasından içerik almak için requests kütüphanesini ve ilgili bilgileri çıkarmak için bs4(BeautifulSoup) içe aktarabilirsiniz. Python'da web kazıma yapmak için aşağıdaki adımları takip edebilirsiniz. Bu web sitesinden bilgi çıkaracağız. 

İthalat talepleri:

Web sitesinin HTML'sini almak için istek kütüphanesini içe aktarmanız gerekir. 

i̇thalat talepleri̇

GET isteği:

Web sitesine bir GET isteği yapmanız gerekir. Bunu URL'yi requests.get() fonksiyonuna yapıştırarak yapabilirsiniz.

r = requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

İçeriği Çıkarın:

Web sitesinin içeriğini r.content kullanarak çıkarın. Web sitesinin içeriğini bayt cinsinden verir. 

c = r.content

BeautifulSoup'u içe aktarın:

Web sayfalarından bilgi kazımayı kolaylaştırdığı için BeautifulSoup kütüphanesini içe aktarmanız gerekir.

from bs4 import BeautifulSoup

Bir çorba nesnesi oluşturun:

İçerikten bir BeautifulSoup nesnesi oluşturmanız ve birkaç yöntem kullanarak bunu ayrıştırmanız gerekir.

soup = BeautifulSoup(c)
print(soup.get_text())

Bunun gibi bir çıktı (bu sadece bir parça) elde edeceksiniz.

Yararlı Verileri Çıkarın:

İstediğimiz verileri çıkarmak için doğru CSS seçicilerini bulmamız gerekiyor. Web sayfasındaki ana içeriği soup nesnesinin .find() metodunu kullanarak bulabiliriz.

main_content = soup.find('div', attrs = {'class': 'entry-content'})

.text niteliğini kullanın:

Çorbanın.text özelliğini kullanarak bilgileri tablodan metin olarak alabiliriz.

content = main_content.find('ul').text
print(içerik)

Tablonun metnini bir dize olarak aldık. Ancak metin dizesinin belirli kısımlarını çıkarırsak bilgi çok işe yarayacaktır. Bu görevi başarmak için Düzenli İfadelere geçmemiz gerekir.

Python'da Düzenli İfadeler

Düzenli ifadeler(RegEx), bir arama kalıbı tanımlayan kalıplar dizisidir. Temel fikir şudur:

  • Bir metin dizesinde eşleştirmek istediğiniz bir desen tanımlayın. 
  • Dönen eşleşmeler için dize içinde arama yapın.

Metin tablosundan aşağıdaki bilgileri çıkarmak istediğimizi varsayalım.

  • Maaşlar
  • Kolejlerin isimleri
  • Başkanların isimleri

Aşağıda belirtilen adımları izleyerek üç bilgi parçasını çıkarabilirsiniz.

Adım 01:

re öğesini içe aktarın ve maaşları ayıklamak için bir maaş kalıbı oluşturmanız gerekir. Bir dize olarak sağlanan düzenli ifade kalıbını bir RegEx kalıp nesnesine derlemek için re.compile() yöntemini kullanın. Ayrıca, tüm eşleşmeleri bulmak ve bunları bir dize listesi olarak döndürmek için pattern.findall() yöntemini kullanabilirsiniz. Her dize bir eşleşmeyi temsil edecektir.

yeniden içe aktar 
salary_pattern = re.compile(r'\$.+')
salaries = salary_pattern.findall(content)

Adım 02:

Kolejlerin isimlerini çıkarmak için aynı prosedürü tekrarlayın. Bir kalıp oluşturun ve isimleri çıkarın. 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

Adım 03:

Başkanların isimlerini çıkarmak için aynı prosedürü tekrarlayın. Bir kalıp oluşturun ve gerekli isimleri çıkarın. 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

Adım 04:

Maaşlar dağınık görünüyor ve anlaşılabilir değil. Bu nedenle, dize maaşlarını sayılara dönüştürmek için Python liste kavramasını kullanıyoruz. İstediğimiz sonuçları elde etmek için string dilimleme, bölme ve birleştirme ve liste kavrama yöntemlerini kullanacağız.

salaries = ['$876,001', '$543, 903', '$2453, 896']
[int(''.join(s[1:].split(',')) for s in salaries]

Çıktı şu şekildedir:

Python'da Veri Görselleştirme

Veri görselleştirme verileri görsel olarak anlamanıza yardımcı olur, böylece eğilimler, modeller ve korelasyonlar ortaya çıkarılabilir. Aykırı değerleri belirlemek ve değerli içgörüler elde etmek için büyük miktarda veriyi grafiklere, çizelgelere ve diğer görsellere dönüştürebilirsiniz.

Verileri görselleştirmek için aşağıda gösterildiği gibi matplotlib kullanabiliriz.

Gerekli kütüphaneleri aşağıda gösterildiği gibi içe aktarın.

import pandas as pd
import matplotlib.pyplot as plt

Okullar, isimler ve maaşlardan oluşan bir pandas veri çerçevesi oluşturun. Örneğin, okulları şu şekilde bir veri çerçevesine dönüştürebilirsiniz:

df_okul = pd.DataFrame(okullar)
Baskı(df_school)

Çıktı şudur:

Aynı şekilde, maaşlar ve isimler için de aynısını yapabilirsiniz.

Veri görselleştirme için aşağıda gösterildiği gibi bir çubuk grafik çizebiliriz.

df.plot(kind='barh', x = 'President', y = 'salary')

Çıktı şu şekildedir:

Web Kazıma İçin Neden Proxy'lere İhtiyaç Duyulur?

Web kazıma, işletmelerin veri destekli hizmetler sunmak ve veriye dayalı kararlar almak için pazar bilgileri ve sektörler hakkında yararlı bilgiler edinmesine yardımcı olur. Proxy'ler, aşağıdaki nedenlerden dolayı çeşitli web sitelerinden etkili bir şekilde veri kazımak için gereklidir.

  • IP Yasaklarından Kaçınma - Kazıyıcıların çok fazla talepte bulunmasını engellemek için, ticari web siteleri Tarama Oranı olarak adlandırılan taranabilir veri miktarını sınırlar. Tarama oranı web sitesinin hızını yavaşlatır ve kullanıcının istediği içeriğe etkili bir şekilde erişmesi zorlaşır. Bununla birlikte, verileri kazımak için yeterli bir proxy havuzu kullanırsanız, hedef web sitesindeki hız sınırlarını aşarsınız. Bunun nedeni, proxy'lerin farklı IP adreslerinden istek göndermesi ve böylece web sitelerinden ihtiyacınıza göre veri çıkarmanıza izin vermesidir.
  • Bölgeye Özel İçeriğe Erişim Sağlama - İşletmeler, belirli bir coğrafi bölgedeki müşterilere uygun ürün özellikleri ve fiyatları sağlamak için rakiplerini (web sitelerini) izlemek zorundadır. IP adresli konut proxy'lerini kullanarak o bölgede mevcut olan tüm içeriğe erişebilirler.
  • Gelişmiş Güvenlik - Bir proxy sunucusu, kullanıcının cihazının IP adresini gizleyerek ek bir güvenlik katmanı ekler.

Yukarıdaki avantajları elde etmek için kaç vekil gerektiğini biliyor musunuz? Bu formülü kullanarak gerekli vekil sayısını hesaplayabilirsiniz:

Proxy sayısı = Erişim isteği sayısı / Tarama Hızı

Erişim taleplerinin sayısı aşağıdaki parametrelere bağlıdır.

  • Kazıyıcının bir web sitesinden bilgi çıkarma sıklığı
  • Kullanıcının kazımak istediği sayfa sayısı

Öte yandan, tarama oranı kullanıcının belirli bir süre içinde yaptığı istek sayısı ile sınırlıdır. Bazı web siteleri, otomatik ve insan kullanıcı isteklerini ayırt etmek için kullanıcı başına sınırlı sayıda isteğe izin verir. 

Python'da Proxy Kullanımı

Aşağıdaki adımları takip ederek Python'da proxy kullanabilirsiniz.

  • Python'un requests modülünü içe aktarmanız gerekir.
i̇thalat talepleri̇
  • Bunları döndürmek için bir proxy havuzu oluşturabilirsiniz.
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
  • URL'ye parametre olarak bir proxy geçirerek bir GET isteği göndermek için requests.get() işlevini kullanabilirsiniz.
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • Bağlantı hatası yoksa istenen URL'nin içeriğini alabilirsiniz.
Baskı(sayfa.metin)

Çıktı şu şekildedir:

Sonuç

Manuel kazıma yerine web sitelerinden veri çıkarmak için web kazıma yöntemini kullanabileceğimizi tartıştık. Web kazıma, uygun maliyetli ve zaman kazandıran bir süreçtir. İşletmeler, veriye dayalı kararlar almak ve değerli içgörüler elde etmek için web bilgilerini toplamak ve yeniden yapılandırmak için kullanırlar. Proxy kullanımı, kullanıcının orijinal IP adresini hedef web sitesinden gizlediği için güvenli web kazıma için gereklidir. Web kazıma için veri merkezi veya konut proxy'leri kullanabilirsiniz. Ancak hızlı oldukları ve kolayca tespit edilemedikleri için konut proxy'lerini kullanmayı tercih edin. Ayrıca, dizgi kümelerini eşleştirmek veya bulmak için Python'da düzenli ifadeler kullanabiliriz. Bu, düzenli ifadeler yardımıyla metinden herhangi bir dize kalıbını çıkarabileceğimiz anlamına gelir. Ayrıca, veri görselleştirmenin hacimli miktarda veriyi, anormallikleri tespit etmemize ve verilerdeki yararlı eğilimleri belirlememize yardımcı olan çizelgelere, grafiklere ve diğer görsellere dönüştürdüğünü gördük.