BeautifulSoup kullanarak Python Web Scraping Başlangıç

BeautifulSoup, lxml, Selenium, istekleri, Terapi, vb kullanarak web kazıma ile ilgili sorular ve Django, Flask, WSGI, vb gibi konular için bu forumu kullanabilirsiniz.
Cevapla
Kullanıcı avatarı
pythonpandas
Üye
Üye
Mesajlar: 2
Kayıt: Çrş May 20, 2020 1:52 pm
Şehir: Kayseri
Favori Kütüphane: pandas

BeautifulSoup kullanarak Python Web Scraping Başlangıç

Mesaj gönderen pythonpandas »

Web'den veri çıkarmanın gerekliliği ve önemi giderek daha yüksek ve net bir hale gelmektedir. Birkaç haftada bir, kendimi bir makine öğrenme modeli oluşturmak için web'den veri çıkarmamız gereken bir durumda buluyorum .
Web'den bilgi almanın yolları
Web'den bilgi almanın birkaç yolu vardır. API'lerin kullanımı muhtemelen bir web sitesinden veri almanın en iyi yoludur. Twitter, Facebook, Google, Twitter, StackOverflow gibi neredeyse tüm büyük web siteleri, verilerine daha yapılandırılmış bir şekilde erişmek için API'ler sağlar. İhtiyacınız olanı bir API ile alabiliyorsanız, web kazıma konusunda neredeyse her zaman tercih edilen bir yaklaşımdır. Bunun nedeni, sağlayıcıdan yapılandırılmış verilere erişiyorsanız, neden aynı bilgileri çıkarmak için bir motor oluşturmak istersiniz?

Ne yazık ki, tüm web siteleri bir API sağlamaz. Bazıları bunu yapar, çünkü okuyucuların büyük bilgileri yapılandırılmış bir şekilde çıkarmasını istemezler, diğerleri ise teknik bilgi eksikliği nedeniyle API'ler sağlamaz. Bu durumlarda ne yaparsınız? Bilgi almak için web sitesini kazımamız gerekiyor.

RSS yayınları gibi birkaç başka yol olabilir, ancak kullanımları sınırlıdır ve bu yüzden onları burada tartışmaya dahil etmiyorum.

Web Scraping nedir?
Web kazıma, web sitelerinden bilgi ayıklayan bir bilgisayar yazılımı tekniğidir. Bu teknik çoğunlukla web üzerindeki yapılandırılmamış verilerin (HTML biçimi) yapılandırılmış verilere (veritabanı veya elektronik tablo) dönüştürülmesine odaklanır.

Hemen hemen her programlama dilinde Google Dokümanlar'ın kullanımı da dahil olmak üzere web kazıma işlemini çeşitli şekillerde yapabilirsiniz. Kolaylığı ve zengin ekosistemi nedeniyle Python'a başvurdum. Bu görevi destekleyen 'BeautifulSoup' olarak bilinen bir kütüphaneye sahiptir. Bu yazıda, python programlama kullanarak web kazıma öğrenmenin en kolay yolunu göstereceğim.

Web Scraping için gerekli kütüphaneler

Bildiğimiz gibi, Python açık kaynaklı bir programlama dilidir. Bir işlevi gerçekleştirmek için birçok kitaplık bulabilirsiniz. Bu nedenle, kitaplığı kullanmak için en iyisini bulmak gerekir. Üzerinde çalışmak kolay ve sezgisel olduğundan BeautifulSoup'u (Python kütüphanesi) tercih ederim . Verileri kazıma için iki Python modülü kullanabiliriz:

Urllib2: URL'leri almak için kullanılabilecek bir Python modülüdür. URL işlemlerine (temel ve özet kimlik doğrulaması, yeniden yönlendirmeler, çerezler, vb.) Yardımcı olacak işlevleri ve sınıfları tanımlar. Daha fazla ayrıntı için dokümantasyon sayfasına bakın . Not: urllib2 , Python 2'de bulunan kütüphanenin adıdır. Bunun yerine Python 3'te bulunan urllib.request kütüphanesini kullanabilirsiniz. Urllib.request kütüphanesi, Python 2'de urllib.request ile aynı şekilde çalışır. Zaten içerildiğinden , yüklemenize gerek yoktur.
BeautifulSoup: Bir web sayfasından bilgi almak için inanılmaz bir araçtır. Tabloları, listeleri, paragrafları ayıklamak için kullanabilir ve web sayfalarından bilgi ayıklamak için filtreler de koyabilirsiniz. Bu yazıda, BeautifulSoup 4'ün en son sürümünü kullanacağız. Kurulum talimatına dokümantasyon sayfasından bakabilirsiniz .
BeautifulSoup web sayfasını bizim için getirmiyor. Bu yüzden urllib2'yi BeautifulSoup kütüphanesi ile birlikte kullanıyorum.

Python , BeatifulSoup'a ek olarak HTML kazıma için başka seçeneklere de sahiptir. İşte bazıları:
  • mechanize
  • scrapemark
  • scrapy
BeautifulSoup kullanarak bir web sayfasını kazıma

Burada, Wikipedia sayfasındaki verileri kazımaya çalışalım. Bu proje adım adım adımını yaparak öğrenelim:

  1. Önce gerekli kütüphaneleri içeri aktaralım

Kod: Tümünü seç

#import the library used to query a website
import urllib2 #if you are using python3+ version, import urllib.request

Kod: Tümünü seç

#specify the url
wiki = "https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"

Kod: Tümünü seç

#Query the website and return the html to the variable 'page'
page = urllib2.urlopen(wiki) #For python 3 use urllib.request.urlopen(wiki)

Kod: Tümünü seç

#import the Beautiful soup functions to parse the data returned from the website
from bs4 import BeautifulSoup

Kod: Tümünü seç

#Parse the html in the 'page' variable, and store it in Beautiful Soup format
soup = BeautifulSoup(page)
  • HTML sayfasının iç içe yapısına bakmak için “prettify” işlevini kullanın
Resim

  • HTML etiketleriyle çalışma
  1. soup.<tag>: Etiketi içeren açılış ve kapanış etiketi arasında içerik döndürür
In[30]:soup.title
Out[30]:<title>List of state and union territory capitals in India - Wikipedia, the free encyclopedia</title>
  • soup.<tag>.string: soup. <tag> .string:
In [38]:soup.title.string
Out[38]:u'List of state and union territory capitals in India - Wikipedia, the free encyclopedia'
  1. Sayfada yer alan <a> taglarını bulalım: Biliyoruz ki, bir bağlantıyı “<a>” etiketini kullanarak etiketleyebiliriz. Bu yüzden, "soup.a" seçeneği ile ilerlemeliyiz. Haydi Yapalım şunu.
In [40]:soup.a
Out[40]:<a id="top"></a>

Yukarıda, sadece bir çıktımız olduğunu görebilirsiniz. Şimdi <a> içindeki tüm bağlantıları çıkarmak için “ find_all () kullanacağız .
Resim

Yukarıda, başlıklar, bağlantılar ve diğer bilgiler dahil olmak üzere tüm bağlantıları gösteriyor. Şimdi yalnızca bağlantıları göstermek için, her bir etiketi yinelemeli ve ardından get ile “href” özelliğini kullanarak bağlantıyı döndürmeliyiz .

Resim
  • Doğru tabloyu bulun: Eyalet başkentleri hakkında bilgi almak için bir tablo ararken, önce doğru tabloyu belirlemeliyiz. Tüm tablo etiketlerine bilgi çıkarma komutunu yazalım.

Kod: Tümünü seç

all_tables = soup.find_all (table)
Şimdi doğru tabloyu tanımlamak için tablonun “class” niteliğini ve doğru tabloyu filtrelemek için kullanacağız. Chrome'da, web sayfasının gerekli tablosuna sağ tıklayarak sınıf adını kontrol edebilirsiniz -> Elemanı incele -> Sınıf adını kopyalayın VEYA yukarıdaki komutun çıktısına gidin veya sağ tablonun sınıf adını bulun.

Resim
  • Bilgileri DataFrame'e çıkarın: Burada, her satır (tr) boyunca yinelenmeli ve sonra tr (td) öğelerinin her bir değişkenini bir değişkene atamalı ve bir listeye eklemeliyiz . İlk önce tablonun HTML yapısına bakalım (<th> tablo başlığı için bilgi elde etmeyeceğim)
Resim

Yukarıda, <tr> öğesinin ikinci öğesinin <td> değil <th> etiketi içinde olduğunu fark edebilirsiniz. buna dikkat etmek. Şimdi her öğenin değerine erişmek için, her öğeyle birlikte “find (text = True)” seçeneğini kullanacağız. Koda bakalım:

Kod: Tümünü seç


#Generate lists
A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
for row in right_table.findAll("tr"):
    cells = row.findAll('td')
    states=row.findAll('th') #To store second column data
    if len(cells)==6: #Only extract table body not heading
        A.append(cells[0].find(text=True))
        B.append(states[0].find(text=True))
        C.append(cells[1].find(text=True))
        D.append(cells[2].find(text=True))
        E.append(cells[3].find(text=True))
        F.append(cells[4].find(text=True))
        G.append(cells[5].find(text=True))

Kod: Tümünü seç

#import pandas to convert list to data frame
import pandas as pd
df=pd.DataFrame(A,columns=['Number'])
df['State/UT']=B
df['Admin_Capital']=C
df['Legislative_Capital']=D
df['Judiciary_Capital']=E
df['Year_Capital']=F
df['Former_Capital']=G
df
  • Sonuç
Resim


Son olarak, veri çerçevesinde verilerimiz var: Benzer şekilde, “ BeautifulSoup ” kullanarak başka çeşitli web kazıma işlemleri de yapabilirsiniz . Bu, web sayfalarından veri toplama çabalarınızı azaltacaktır. Ayrıca, etiket adını kullanarak gezinmek için .parent, .contents, .descendants ve .next_sibling, .prev_sibling ve çeşitli özelliklere de bakabilirsiniz. Bunlar, web sayfalarını etkili bir şekilde çıkarmanıza yardımcı olacaktır. -


Kaynak

Cevapla