Güzel Çorba Kullanan Python ile Web Kazıma Kılavuzu

Yayınlanan: 2020-06-23
İçindekiler gösterisi
Python ile Web Scraping'e Giriş:
BeautifulSoup nasıl çalışır?
BeautifulSoup Kullanarak Web Sayfalarından Nasıl Veri Kazılır?
Web Kazıma İşlemi:
Çözüm:

Python ile Web Scraping'e Giriş:

Web kazıma söz konusu olduğunda, bazı programlama dilleri diğerlerine göre tercih edilir. Bunlar arasında en popüler olanlardan biri Python'dur. Daha yumuşak öğrenme eğrisi nedeniyle öğrenmesi en kolay dillerden biri olmasının yanı sıra, çok sayıda üçüncü taraf paketine yol açan büyük geliştirici desteğine sahip bir dil olma avantajına da sahiptir. Bu paketler, çekirdek Python ile gerçekleştirilmesi zor olabilecek çoklu işlevler için kullanılabilir. Bazı yaygın örnekler - görüntü işleme veya bilgisayarla görme için OpenCV kullanıyoruz, makine öğrenimi için TensorFlow kullanıyoruz ve grafikleri çizmek için MatplotLib kullanıyoruz. Web kazıma söz konusu olduğunda, en yaygın kullanılan kitaplıklardan biri BeautifulSoup'tur. Bu kitaplık özellikle internetten veri sıyırmaz, ancak bir web sayfasının HTML dosyasını alabilmeniz durumunda, ondan belirli veri noktalarının çıkarılmasına yardımcı olabilir. Genel olarak kitaplık, XML ve HTML belgelerinden veri noktaları çıkarmak için kullanılır.

BeautifulSoup nasıl çalışır?

Python'da kod yazmaya başlamadan önce BeautifulSoup'un nasıl çalıştığını anlamalısınız. Bir web sayfasının HTML içeriğini çıkardıktan ve onu html_obj gibi bir değişkende sakladıktan sonra, onu yalnızca bir satır kodla BeautifulSoup nesnesine dönüştürebilirsiniz.

çorba_obj = GüzelSoup(html_obj, 'html.parser')

html_obj HTML verisi olduğunda, çorba_obj, elde edilen bs nesnesidir ve “html.parser”, dönüştürmeyi yapmak için kullanılan ayrıştırıcıdır. Çorba_obj adlı bs nesnesine sahip olduğunuzda, geçiş yapmak çok kolaydır ve geçiş yapmak yeterince basit olduğundan, veri çıkarma da basitleşir. Bir örnek ele alalım. Bir e-Ticaret web sitesinin her sayfasında bulunan ürün başlığı adlı bir veri noktası almanız gerektiğini varsayalım. Şimdi bu web sitesinden tek bir HTML ürün sayfası indirdiniz ve her sayfanın ürün başlığı olarak kimliği olan bir tür yayılma öğesinde belirtilen ürün adına sahip olduğunu fark ettiniz. Peki 1000 ürün sayfasından bu verileri nasıl getireceksiniz? Pekala, her sayfa için HTML verilerini alacaksınız ve veri noktasını bu şekilde getireceksiniz-

çorba.findAll('span', attrs={'id': 'productTitle'}) içindeki yayılma alanları için:
name_of_product = spans.text.strip()

Bu, belirli bir etiket öğesi arasında bulunan metinsel verileri elde etmenin bir yolu olsa da, bir etiketin niteliklerinden de veri alabilirsiniz.

Web Kazıma

BeautifulSoup Kullanarak Web Sayfalarından Nasıl Veri Kazılır?

Artık bir bs nesnesinin nasıl geçildiğine dair bazı temel bilgilere sahip olduğumuza göre, gidip bir kod yazalım ve nasıl çalıştığını görelim. Aşağıdaki kod parçasını kullanarak, ABD merkezli lider bir emlak piyasası olan Zillow'dan verileri çok kolay bir şekilde sıyırabilirsiniz. Çıktı verilerini JSON biçiminde almak için bu kodu çalıştırabilir ve bir listenin URL'sini girebilirsiniz. Kodu satır satır anlayalım. Öncelikle, makinenizde Python 3.7 veya üzerinin kurulu olduğundan emin olun. BeautifulSoup'u kurmak için pip kullanın. Diğer tüm paketler Python ile önceden paketlenmiş olarak gelir, bu nedenle hiçbirini yüklemeniz gerekmez. Bittiğinde, Atom veya VS Code gibi bir kod düzenleyici kurun ve gitmeye hazırsınız. Kodu anlamak önemlidir ve bu nedenle ilk satırdan başlayacağız. Belirli işlevler için dört içe aktarma ifadesine ihtiyacınız vardır. Ardından, “ctx” ile başlayan üç satırınız var. Bunlar, özellikle kodunuz üzerinden web sitelerine erişirken karşılaşabileceğiniz SSL Sertifikası hatalarını göz ardı etmek içindir. Ardından, web sitesi URL'sini kullanıcıdan girdi olarak alıyoruz. Burada URL'yi de sabit kodlayabilir veya hatta birden çok URL dizisine sahip olabilirsiniz.

Web Kazıma İşlemi:

Ardından, urllib'in Request işlevini kullanarak web sayfasına erişiyoruz. Web sitesinin bir tarayıcı kullandığınıza inanmasını sağlamak için başlığa User-Agent'ı eklediğinizden emin olun. Bunu yapmanın nedeni, web sitelerine kod değil tarayıcılar tarafından erişilmesi gerektiğidir ve bu nedenle sizi yakalarlarsa IP'nizi engelleyebilirler. Bu yapıldıktan sonra, tüm temel adımları tamamladık ve ardından, HTML nesnesini bir bs nesnesine dönüştüreceğiz ve ardından web sayfasındaki özel karakterleri ve sembolleri işlemek için onu utf-8 formatına güzelleştireceğiz. Bu yapıldıktan sonra, bs nesnesini ayrıştırarak başlığı, kısa ayrıntıları ve diğer özellikleri çıkarırız. Gördüğünüz gibi, type = application/ld+json öznitelikli komut dosyası etiketinde, tümü bir JSON biçiminde depolanan birden çok veri noktası vardır. Ayrıca, bir i==0 ve i==1 kontrolü kullandığımızı görebilirsiniz. Bunun nedeni, bir sayfada bunun gibi iki komut dosyası etiketinin (aynı özniteliğe sahip) olmasıdır. İlk etiket bize bazı veri noktaları verirken, ikincisi geri kalanını verir. Tüm veri noktalarını çıkardıktan sonra, onu bir JSON dosyasında saklayabilir ve sahip olduğumuz gibi kaydedebilirsiniz. Ayrıca kaydedebilir, bir siteye yükleyebilir veya isterseniz verilerle bir API'ye bile basabilirsiniz.

json'u içe aktar
ssl'yi içe aktar
urllib.request'ten içe aktarma İsteği, urlopen
bs4'ten BeautifulSoup'u içe aktarın

# SSL Sertifikası hatalarını yoksay
ctx = ssl.create_default_context()
ctx.check_hostname = Yanlış
ctx.verify_mode = ssl.CERT_NONE

# Zillow listeleme URL'sini girdi olarak alın
url = input('Zillow House Listeleme URL'sini Girin-')

# Web sitesini bir tarayıcı kullandığınıza inandırın
req = İstek(url, başlıklar={'User-Agent': 'Mozilla/5.0'})
web sayfası = urlopen(req).read()

# HTML sayfası -> BeautifulSoup Nesne çorbası = BeautifulSoup(web sayfası, 'html.parser')
html = çorba.prettify('utf-8')
property_details = {'details_long': {}, 'adres': {}}

# Mülk listesinin farklı veri noktalarını çıkarın
çorba.findAll('title') içindeki başlık için:
property_details['Title'] = title.text.strip()
kırmak

çorba.findAll('meta', attrs={'name': 'description'}) içindeki meta için:
property_details['details_short'] = meta['içerik'].strip()

div için çorba.findAll('div', attrs={'class': 'character-count-truncated'}):
property_details['details_long']['Açıklama'] = div.text.strip()

(i, komut dosyası) için enumerate(soup.findAll('script',
attrs={'type': 'application/ld+json'})):
eğer ben == 0:
json_data = json.loads(script.text)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['değer']
property_details['address']['street'] = json_data['address']['streetAddress']
property_details['address']['locality'] = json_data['address']['addressLocality']
property_details['address']['region'] = json_data['address']['addressRegion']
property_details['address']['postal_code'] = json_data['address']['postalCode']
eğer ben == 1:
json_data = json.loads(script.text)
property_details['price_in_dollars'] = json_data['teklifler']['fiyat']
property_details['inage'] = json_data['image']
kırmak

open('house_listing_data.json', 'w') ile outfile olarak:
json.dump(property_details, outfile, girinti=4)

dosya olarak open('house_listing_data.html', 'wb') ile:
dosya.write(html)

print('———-Veri çıkarma tamamlandı. json dosyasını kontrol edin.———-')

JSON çıktısı biraz şöyle görünmelidir-

{
"detaylar_uzun": {
"no_of_rooms": 3,
"floor_size_in_sqrft": "1.392"
},
"adres": {
“sokak”: “22516 Joan Dr”,
“yer”: “Kaliforniya”,
“bölge”: “MD”,
"posta_kodu": "20619"
},
“Başlık”: “22516 Joan Dr, California, MD 20619 | MLS #MDSM167670”,
"details_short": "22516 Joan Dr , California, MD 20619-3175, 150.000$'dan satılık olarak listelenen tek ailelik bir evdir. 1.392 metrekarelik ev, 3 yataklı, 2.0 banyolu bir mülktür. Zillow'da 22516 Joan Dr evinin 40 fotoğrafını bulun. Zillow'da daha fazla mülk ayrıntısını, satış geçmişini ve Zestimate verilerini görüntüleyin. MLS#MDSM167670”,
"fiyat_in_dolar": 150000,
"inage": "https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg"
}

Çözüm:

Web kazıma ihtiyaçlarınız için BeautifulSoup'u kullanmak, HTML sayfalarını ilk başta manuel olarak analiz edebildiğiniz ve hedeflenmesi gereken etiketlere karar verebildiğiniz sürece kolay olabilir. Herhangi bir dinamik içeriği olmayan ve bir login sayfasının arkasına oturmayan sayfalarda çalışabilir. Daha karmaşık web sayfaları için daha karmaşık araçlara ihtiyacınız olacak. PromptCloud'daki ekibimiz, verilerden yararlanmak ve verilere dayalı kararlar almak isteyen şirketlere yardımcı olur. Bulutta sık aralıklarla çalışan tam otomatik web kazıma motorlarının kurulmasına yardımcı olmakla kalmıyor, aynı zamanda şirketlerin trendleri ve diğer faydalı bilgileri çıkarmak için verileri analiz etmesine yardımcı oluyoruz.