Zephyrnet Logosu

Çürük Domatesleri Ağda Kazımak İçin Bir Kılavuz

Tarih:

Bu makale, Veri Bilimi Blogathon.

Intro

Veriler sürekli olarak anlık büyümeyi körüklüyor, bize farklı kaynaklardan verimli bir şekilde veri getirebilecek eksiksiz bir araç cephanemiz var. Kaliteli olduğu sürece verilerin nasıl ve nereden geldiği önemli değildir. İnternet şu anki çağa hakim olduğundan, veri toplamak için internetin kendisinden daha iyi bir kaynak yoktur.

Bu yazıda, film adları, yönetmenler, gişe koleksiyonları vb. gibi film verilerini en popüler web sitelerinden Rotten Tomatoes'tan kazımanın yollarını keşfedeceğiz. Söz konusu web sitesinden ilgilenilen verileri sıyırmak için sıyırıcı olarak Selenium bir web otomasyon aracı kullanacağız. Bu makale, Selenyum kazıma hakkında temel bir bilgi sağlamayı amaçlamaktadır.

Web Kazıma nedir?

Dünya düşündüğümüzden daha hızlı hareket ediyor ve teknoloji daha da hızlı. En son teknoloji tarafından yönlendirilen bir dünyayla alakalı staRotten Tomatoesy için, veriler her zamankinden daha önemli hale geliyor. Karar verme tamamen verilere dayanır, veriler ne kadar ince olursa sonuçlar da o kadar iyi olur. Her gün internet, her gün bir trilyon megabayt veri üretir. Ancak tüm bu verilerden iş kararlarımıza yardımcı olabilecek çok kesin verilere ihtiyacımız var. Bu kadar büyük miktardaki veriyi gözden geçirmek ve ilgililerini bulmak insanca imkansızdır. Kocaman bir samanlıkta iğne bulmaktan daha zor olduğunu söylemek daha güvenli. Web kazıyıcıların devreye girdiği yer burasıdır. Basitçe söylemek gerekirse kazıyıcılar, web sayfaları üzerinde gezinen ve ilgili verileri bulan otomatik botlar veya komut dosyalarıdır. Karşılaştığınız birçok veri seti bazı sitelerden silinir.

Web Kazıma Araçları

İnternet sitelerinden verileri sıyırmak için kullanılan birçok açık kaynaklı web kazıma aracı var. Diğer dillerdeki araçlar hakkında fazla bilgim olmadığı için sadece Python kütüphanelerinden bahsedeceğiz. Orada gerçekten iyi bir grup web kazıyıcı var, yani Hurda, GüzelÇorba, Pyppeteer ve Selenyum. Bu makale için, popüler film sitesi Rotten Tomatoes'dan verileri sıyırmak için Selenium'u kullanacağız.

Selenyum nedir

Yetkilinin başı Selenyum sayfa böyle gidiyor

"Selenium tarayıcıları otomatikleştirir. Bu kadar!

Bu güçle ne yapacağınız tamamen size kalmış.".

Yeni başlayanlar için Selenium, çeşitli web işlevlerini otomatikleştirmek için kullanılan bir web otomasyon aracıdır. Bu aynı zamanda dünya çapındaki web geliştiricileri tarafından web sitesi testi amacıyla yaygın olarak kullanılmaktadır. Ancak bu sadece web otomasyonu ile sınırlı değil, bilmediğim bir sürü şey bile var, ama burada selenyumu bir web kazıyıcı olarak kullanacağız.

Selenyum Kazıma Kısa Tanıtım

Selenium, hayatımızı biraz daha az sefil hale getirmeye yardımcı olmak için kollarında farklı yöntemlere sahiptir. Bu, kazıma ile ilgili bir makale olduğundan, istenen verileri bulmak için bazı önemli eleman bulma yöntemlerini tartışacağız.

  • Kimliğe göre: Bu yöntem, verilen kimliğe karşılık gelen bir web sitesinin belirli öğelerini bulmamıza yardımcı olur.
  • SINIF'a göre: Bu öncekiyle aynıdır, ancak kimlik yerine kazıyıcı belirtilen sınıfa özgü verileri arayacaktır.
  • CSS_SELECTOR ile: CSS Seçici, bir web sayfasındaki web öğesini tanımlayan bir öğe ile bir seçici değerinin birleşimidir.
  • XPATH ile: Xpath, XML.documents sorgulamasında kullanılan dildir. XML ve HTML yapısal benzerlikler taşıdığından, öğeleri bulmak için XPath'leri kullanabiliriz. Bir web sitesindeki hemen hemen her öğeyi bulabileceği bir yol ifadesinden oluşur.

Bu makale için çoğunlukla Xpath bulucuyu kullanacağız. Diğer konumlandırıcıları da deneyebilirsiniz. Xpath hakkında kısa bir bilgi için buna göz atın göre.

Adım-0: Kurulum

Önce ilk şeyler. Selenium'u sisteminize henüz yüklemediyseniz, Jupyter Notebook'unuza gidin ve şunu yazın.

!pip kurulum sselenium

Veya yazın

pip kurulum selenyum

Selenyumu yerel sisteminize indirmek için.

Sıradaki indirme krom sürücü b'den

Aksi takdirde, chrome sürücüsünü anında indirmek ve kullanmak için komut dosyanıza aşağıdaki kodu yazabilirsiniz.

sürücü = webdriver.Chrome(ChromeDriverManager().install())

Not: Gereksiz her türlü sıkıntıdan kaçınmak için Chrome tarayıcıyı sisteminizde kurulu tutmanızı tavsiye ederim. Brave gibi diğer krom tabanlı tarayıcılar düzgün çalışabilir veya çalışmayabilir.

Adım-1: Kitaplıkları İçe Aktarın

Şimdi gerekli kütüphaneleri Jupyter Ortamımıza aktaracağız. Veri işleme ve temizleme için Pandalar ve kazıma için selenyum kullanacağız.

pandaları selenyum'dan pd olarak içe aktar webdriver'ı webdriver_manager.chrome'dan içe aktar ChromeDriverManager'ı Selenium.webdriver.common.by'den içe aktar

2. Adım: Chrome Sürücülerini Kurun veya Yükleyin

Zaten krom sürücüleri yüklediyseniz, mevcut oturumda yükleyin

sürücü = webdriver.Chrome('yol/chromedriver')

Daha sonra, geçerli oturum için krom sürücüsünü indirmek için bahsettiğimiz önceki kodu kullanmadıysanız

sürücü = webdriver.Chrome(ChromeDriverManager().install())

3. Adım: Web Adresini Alın

Sırada, verileri sıyırmak istediğimiz web adresini alacağız. Daha önce de belirtildiği gibi bu makale için Rotten Tomatoes'un en iyi 100 filmini kullanacağız. Kanal. Aşağıdaki kod, web sayfasına erişmenize yardımcı olacaktır.

driver.get('https://www.rottentomatoes.com/top/bestofrt/')

Bu, web sayfasını mevcut krom oturumunda otomatik olarak yükleyecektir.

Bonus

Ekran görüntüsü alıp buraya yapıştırmak yerine selenyum sayfasının ekran görüntüsünü alalım

PIL'den içe aktarma görüntüsü

driver.save_screenshot('C:UserssunilOneDrivePictures/Ekran Görüntüleri/foo.png')

ekran görüntüsü = Image.open('ss.png')

ekran görüntüsü.göster()


Adım-4: Sayfayı İnceleyin

Şimdi sayfayı inceleyeceğiz ve ihtiyacımız olan öğeleri bulacağız. Filmlerle ilgili çok fazla bilgiye sahip olmadığı için bu sayfada gözlemleyebiliyoruz. Sadece Film adı, Domates puanı ve inceleme sayısı var. Ancak tüm bireysel film bağlantılarına sahiptir. İlk önce kazıyacağımız şey budur, böylece daha sonra her sayfaya bir döngü ile erişebiliriz.

Sayfaya sağ tıklayın ve inceleme öğelerini girin veya geliştirici araçları bölümüne girmek için ctrl+shift+j'ye tıklayın.

Dikkatlice sitenin amaçlanan kısmına, yani film tablosuna gidin (imlecinizi etiketin üzerine getirdiğinizde sayfada da vurgulayacaktır).

Sayfayı inceleyin| web kazıma

İmlecin hemen altında, altında film bağlantısı var.  etiket. Aşağıya iner ve başka filmler ararsanız aynı yapıyı bulacaksınız. Her biri arasında ortak olan bir şey

etiket class = "stilsiz makale bağlantısı"almak için bundan yararlanabiliriz. href Öznitellikler.

movie_we = driver.find_elements(By.XPATH, '//td//a[@class = "stillenmemiş makaleLink"]')

Belirli hedefi bulmak için Xpath kullanıyoruz. Yukarıdaki kod parçacığı bize hedefin selenyum web öğelerini getirecektir. href bağlantılar. Tam bağlantıları almak için aşağıdaki kodu çalıştıracağız

bağlantılar = []

aralıktaki i için(len(movie_we)):

linkler.append(movie_we[i].get_attribute('href'))

bağlantılar[:5]


çıktı: ['https://www.rottentomatoes.com/m/it_happened_one_night','https://www.rottentomatoes.com/m/citizen_kane','https://www.rottentomatoes.com/m/the_wizard_of_oz_1939','https://www.rottentomatoes.com/m/modern_times','https://www.rottentomatoes.com/m/black_panther_2018']

Adım-5: Bir Veri Çerçevesi Oluşturun

Kazıyacağımız her veriyi saklamak için bir veri çerçevesine ihtiyacımız var. Böylece, yalnızca sütunlarla boş bir veri çerçevesi başlatacağız. Buradaki sütunlar, kazıyacağımız film bilgileridir.

Film bağlantılarına tıklayın ve hangi verileri kazıyabileceğimize bakın. Sayfayı gözden geçirerek neyi kazıyacağınız konusunda bir fikir edineceksiniz.

Veri Çerçevesi Oluşturun

Bunlardan film adını, Tomatometer ve Audience skorunu sıyıracağız. Ve aşağıdaki tablodaki verilerin geri kalanı

Bir Veri Çerçevesi görüntüsü oluşturun 2| web kazıma

Bu kadar çok sütun içeren bir veri çerçevesine ihtiyacımız olacak. Karışıklığı önlemek için aynı isimleri kullanacağız ve ayrıca veri çerçevesine yeni veriler eklememizi kolaylaştırıyor.

dta = pd.DataFrame(sütunlar=['Film Adı', 'İzleyici Puanı', 'Tomatometer Puanı', 'Derecelendirme', 'Tür', 'Orijinal Dil', 'Yönetmen', 'Yapımcı', 'Yazar', ' Çıkış Tarihi (Sinema Filmleri)', 'Yayın Tarihi (Yayınlama)', 'Gişe (Gross ABD)', 'Çalışma Zamanı', 'Distribütör', 'Ses Karışımı', 'En Boy Oranı', 'Koleksiyona Bakın'])

Adım-6: Web Kazıma Verileri

Sonunda, ana etkinlikte buradayız. Bu bölümde, ilgili verileri nasıl kazıyacağımızı öğreneceğiz. Her şeyden önce, filmlerden herhangi birini inceleyin. Daha önce yaptığınız yolu takip edin. Sayfanın sıyırmak istediğiniz bölümüne ulaşın.

İlk önce film adını ve Tomatometer puanlarını alacağız.

bu verileri içinde depolamak için geçici bir sözlük nesnesi oluşturun.

info_we = driver.find_elements(By.XPATH,'//score-board')

movie_info = {'Film Adı':”,'İzleyici Puanı':”,'Tomatometer Puanı':”}

movie_info['Film Adı'] = info_we[0].text.split('n')[0]

movie_info['İzleyici Puanı'] = info_we[0].get_attribute('audiencescore')

movie_info['Tomatometer Score'] = info_we[0].get_attribute('tomatometerscore')


Olayları daha iyi kavramak için tek tek kod çalıştırın.

Şimdi, verilerin geri kalanını alacağız. Bu adım için hem öğe etiketlerini (Tür, Yönetmen, Yazar vb.) hem de veri öğesi değerini (Suç, Yönetmen adları, Yazar adları vb.) sıyıracağız. Aynı inceleme işlemini tekrarlayın ve her birinde benzersiz bir öğe aramayı deneyin. aradığımız veriler.

Kazıma Verileri

Yukarıdaki resimde, her bir etiketin ve değerin farklı bir değere sahip olduğunu görüyoruz. veri-qa değer, yani etiketler için “film-bilgi-öğe-etiket” ve değerler için “film-bilgi-öğe-değeri”. Bunları hem etiketleri hem de değerleri ayrı ayrı bulmak için kullanabiliriz.

webelement_list_val = [] webelement_list_key = [] webelement_list_key = driver.find_elements(By.XPATH,'//div[@data-qa="movie-info-item-label"]') webelement_list_val = driver.find_elements(By.XPATH, '//div[@data-qa="film-bilgi-öğe-değeri"]')

Şimdi verileri sözlüklere dönüştürün. Böylece, daha sonra, daha önce oluşturduğumuz veri çerçevesine besleyebiliriz.

key_list, val_list = [],[] zip'te k,v için(webelement_list_key, webelement_list_val): key_list.append(k.text.strip(':')) val_list.append(v.text) info = dict(zip( key_list,val_list)) #listeleri sözlüğe dönüştürme

Bu sözlüğü daha önce oluşturduğumuzla birleştireceğiz.

total_info = {**film_info,**bilgi}

Son sözlük nesnesini veri çerçevesine ekleyin.

dta = dta.append(total_info, yoksay_index=Doğru)

Temel kodlarımızla işimiz bitti. Şimdi, her filmden öğeleri sıyırmak için bu kodları bir döngü içinde bir araya getireceğiz.

tqdm'den tqdm'deki bağlantı için tqdm'yi içe aktarın(links, desc='loading...'): driver.get(link) info_we = driver.find_elements(By.XPATH,'//score-board') movie_info = {' Film Adı':'','İzleyici Puanı':'','Tomatometer Puanı':''} movie_info['Film Adı'] = info_we[0].text.split('n')[0] movie_info[' İzleyici Puanı'] = info_we[0].get_attribute('audiencescore') movie_info['Tomatometer Puanı'] = info_we[0].get_attribute('tomatometerscore') webelement_list_val = [] webelement_list_key = [] webelement_list_key = driver.find_elements(Tarafından .XPATH,'//div[@data-qa="movie-info-item-label"]') webelement_list_val = driver.find_elements(By.XPATH,'//div[@data-qa="movie-info- item-value"]') key_list, val_list = [],[] for k,v in zip(webelement_list_key, webelement_list_val): key_list.append(k.text.strip(':')) val_list.append(v.text ) bilgi = dict(zip(key_list,val_list)) total_info = {**movie_info,**info} dta = dta.append(total_info, ignore_index=True)

Kullandığınız makineye bağlı olarak biraz zaman alacaktır. Sonunda burada ne elde ettiğimizi görselleştirelim.

veri.head()
sözlük | web kazıma

Oldukça iyi görünüyor. Sonunda ihtiyacımız olan verileri kazıdık ve bunlardan bir veri seti oluşturduk. Şimdi biraz daha keşfedelim.

dta.bilgi()
dta.bilgi()

Buradaki her şeyin nesne türünde olduğunu görüyorsunuz, hatta Tomatometer ve izleyici puanı bile iyi bir şey olmayabilir. Ama biz

Kitle puanını ve Domates ölçer puanını dizeden tam sayıya dönüştürün.

dta[['Tomatometer Score','Kitle Skoru']]=dta[['Tomatometer Score','Kitle Skoru']].astype(int) print(dta[['Tomatometer Score','Kitle Skoru']] .dtypes)
çıktı:Tomatometer Puanı int32 Kitle Puanı int32 dtype: object

Yayın tarihini tarih-saat türüne dönüştürün

df['Yayın Tarihi (Yayınlama)'] = pd.to_datetime(df['Yayın Tarihi (Yayınlama)']) print(df['Yayın Tarihi (Yayınlama)'].head())
çıktı: 0. 1999-12-28 1 2010-02-23 2 2003-08-12 3 2010-11-16 4 2018-05-02 Ad: Yayın Tarihi (Akış), dtype: datetime64[ns]

Tiyatro çıkış tarihi sütununu dönüştürmek için her tarihin sonundaki dizelerden kurtulmamız gerekir.

def func(x): if type(x) != float: li = x.split(' ') li.remove(li[-1]) zaman = ' '.join(li).replace(',', '') dönüş zamanı df['Yayın Tarihi (Tiyatrolar)'] = df['Yayın Tarihi (Tiyatrolar)'].apply(func) df['Yayın Tarihi (Tiyatrolar)'] = pd.to_datetime(df['Yayınlanma Tarihi) Tarih (Tiyatrolar)'])

Derecelendirme sütununda, ek açıklama değil, yalnızca derecelendirmeyi tutmak istiyoruz, ancak sürecimizde çakışma yaratacak bazı NaN değerleri var. Böylece, bir dize değeriyle NaN değerleri atayacağız.

df['Derecelendirme'].loc[df['Derecelendirme'].isnull()] = 'Yok'

Şimdi, ekstra açıklamanın derecelendirme sütununu temizleyeceğiz

df['Derecelendirme'] = df['Derecelendirme'].agg(lambda a : a.split(' ')[0])
df.Rating.value_counts() çıktı: R 37 Yok 24 PG-13 18 PG 15 G 6 Ad: Derecelendirme, dtype: int64

Son veri setimizi görelim

df.head ()

Veriler şimdi çok daha iyi. Aşağıdaki kodu kullanarak CSV olarak kaydedin

df.to_csv(r'D:Data Setsfile.csv', index=Yanlış)

Sonuç

Yani, bu kadar. Bu web kazıma makalesi boyunca, selenyumun temellerinden bir veri seti hazırlamaya kadar pek çok şey öğrendik. Yani, burada

  • Bir sayfanın öğelerini bulmak ve almak için farklı Selenium konumlandırıcıları (By. ID, By. CLASS, By. XPATH vb.) hakkında kısaca öğrendik.
  • Chrome sürücüsünü kullanarak web sitelerine nasıl erişilir.
  • İhtiyacımız olan öğeleri bulmak için web sayfasının HTML öğelerini nasıl inceleriz?
  • Ayrıca selenyum bulucu kullanarak gerekli öğeleri alma sürecini de öğrendik. Tarafından. Xpath
  • Bir veri çerçevesi oluşturduk ve alınan verileri okunabilir bir biçimde sakladık
  • Kullanılabilirliğini artırmak için yeni oluşturduğumuz veri kümesini temizledik ve son olarak verileri gelecekteki kullanım durumları için CSV biçiminde depoladık.

Şimdiye kadar bu sıyırıcıların ne kadar kullanışlı olabileceğini fark etmiş olmalısınız. Bununla ilgili en iyi şey, herhangi bir web sayfasını kazıyabilir, veri kümenizi oluşturabilir ve üzerinde analiz gerçekleştirebilirsiniz.

Umarım makaleyi beğenmişsinizdir.

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.

spot_img

En Son İstihbarat

spot_img

Bizimle sohbet

Merhaba! Size nasıl yardım edebilirim?