Kurs
İnternetin bu kadar çok veriyle dolup taştığı ve verinin adeta yeni petrol olduğu günümüzde, web kazıma çeşitli uygulamalarda daha da önemli ve pratik hale geldi. Web kazıma, bir web sitesinden bilgi çıkarmayı ya da kazımayı konu alır. Bazen web hasadı veya web veri çıkarımı olarak da adlandırılır. Bir web sitesinden metni kopyalayıp yerel sisteminize yapıştırmak da web kazımadır; ancak bu manuel bir iştir. Genellikle web kazıma, web tarayıcılarının yardımıyla veriyi otomatik olarak çıkarmayı kapsar. Web tarayıcıları, HTTP protokolünü kullanarak dünya çapındaki ağa bağlanan ve veriyi otomatik şekilde getirmenizi sağlayan betiklerdir.
İster bir veri bilimci, ister mühendis ya da büyük veri kümelerini analiz eden herhangi biri olun, webden veri kazıyabilme yeteneği faydalı bir beceridir. Diyelim ki webde bir veri buldunuz ve bunu indirmenin doğrudan bir yolu yok; Python ile web kazıma, veriyi daha sonra içe aktarılabilecek ve çeşitli şekillerde kullanılabilecek işe yarar bir forma çıkarmak için kullanabileceğiniz bir beceridir.
Web kazımanın bazı pratik kullanım alanları şunlar olabilir:
- Belirli bir beceriye sahip adayların özgeçmişlerini toplama,
- Belirli hashtag’lerle Twitter’dan tweet çekme,
- Pazarlamada potansiyel müşteri (lead) oluşturma,
- Bu eğitimin odak noktası olan Amazon gibi e-ticaret sitelerinden ürün ayrıntıları ve yorumlarını kazıma
Yukarıdaki kullanım örneklerinin yanı sıra, doğal dil işleme alanında da derin öğrenme modelini eğitmek üzere web sitelerinden metin çıkarmak için web kazıma yaygın biçimde kullanılır.
Devam etmeden önce, Amazon gibi web sitelerinin içeriklerine nasıl erişilebileceğini veya yeniden kullanılabileceğini etkileyen belirli hizmet şartlarını güncelleyebileceğini ya da yeni teknik kısıtlamalar getirebileceğini unutmayın. Kendi kullanım senaryonuzun uyumlu olduğundan emin olmak için sitenin Hizmet Şartlarını ve robots.txt dosyasını incelemek sizin sorumluluğunuzdadır. Politikalar değişebilir ve izinler farklılık gösterebilir.
Web Kazımanın Olası Zorlukları
-
Web sitelerinden bilgi kazırken karşılaşacağınız zorluklardan biri, web sitelerinin farklı yapılarıdır. Yani sitelerin şablonları değişir ve benzersizdir; dolayısıyla siteler genelinde genelleme yapmak zor olabilir.
-
Bir diğer zorluk ise süreklilik olabilir. Web geliştiricileri sitelerini sürekli güncellediğinden, tek bir kazıyıcıya uzun süre güvenemezsiniz. Değişiklikler küçük olsa bile veri çekerken yine de engel oluşturabilir.
Dolayısıyla bu zorlukları ele almak için çeşitli olası çözümler vardır. Biri, web sitesindeki değişiklikler dinamik olacağından sürekli tümleştirme ve teslim (CI/CD) yaklaşımını ve sürekli bakımı takip etmektir.
Daha gerçekçi bir yaklaşım ise çeşitli web siteleri ve platformlar tarafından sunulan Uygulama Programlama Arayüzlerini (API’ler) kullanmaktır. Örneğin Facebook ve Twitter, verileriyle denemeler yapmak ya da örneğin tüm arkadaşlar ve ortak arkadaşlarla ilgili bilgileri çıkarıp bunun bir bağlantı grafiğini çizmek isteyen geliştiriciler için özel olarak tasarlanmış API’ler sağlar. API’ler kullanılırken verinin formatı, standart web kazımadan farklıdır; JSON veya XML olur; standart web kazımada ise çoğunlukla HTML biçimindeki verilerle uğraşırsınız.
Beautiful Soup Nedir?
Beautiful Soup, bir web sitesinden yapılandırılmış veri çıkarmaya yönelik saf bir Python kütüphanesidir. HTML ve XML dosyalarından veri ayrıştırmanızı sağlar. Bir yardımcı modül olarak görev yapar ve HTML ile, diğer geliştirici araçlarını kullanarak bir web sayfasıyla nasıl etkileşime giriyorsanız ona benzer ama daha iyi bir şekilde etkileşime girer.
-
Genellikle,
lxmlvehtml5libgibi favori ayrıştırıcılarınızla çalışıp ayrıştırma ağacında gezinme, arama ve değiştirme için doğal Python yolları sağladığından, programcılara saatlerce hatta günlerce zaman kazandırır. -
Beautiful Soup’un bir diğer güçlü ve kullanışlı özelliği, getirilen belgeleri Unicode’a ve dışarı giden belgeleri UTF-8’e dönüştürme zekâsıdır. Bir geliştirici olarak, belge kendi içinde bir kodlama belirtmediği ya da Beautiful Soup bunu tespit edemediği sürece bununla ayrıca uğraşmanız gerekmez.
-
Diğer genel ayrıştırma ya da kazıma teknikleriyle karşılaştırıldığında daha hızlı olduğu da kabul edilir.
Ayrıştırıcı Türleri
Daha fazlasını buradan okuyabilirsiniz.
Yeterince teori, değil mi? Öyleyse beautiful soup’u kuralım ve Python kullanarak özelliklerini ve yeteneklerini öğrenmeye başlayalım.
İlk adım olarak, terminaliniz veya jupyter lab aracılığıyla Beautiful Soup kütüphanesini kurmanız gerekir. Beautiful Soup’u kurmanın en iyi yolu pip üzerinden olduğu için, pip modülünün zaten kurulu olduğundan emin olun.
!pip3 install beautifulsoup4
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.7/site-packages (4.7.1)
Requirement already satisfied: soupsieve>=1.2 in /usr/local/lib/python3.7/site-packages (from beautifulsoup4) (1.9.5)
Gerekli kütüphanelerin içe aktarılması
Web sitesinden veriyi kazımak ve seaborn, matplotlib ve bokeh yardımıyla görselleştirmek için kullanacağınız gerekli paketleri içe aktaralım.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import re
import time
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
Amazon En Çok Satan Kitapları Kazıma
Kazıyacağınız URL şu: https://www.amazon.in/gp/bestsellers/books/. Sayfa parametresi her sayfanın verisine erişmek için değiştirilebilir. Bu nedenle, tüm sayfalara erişmek için gerekli veri kümesini almak amacıyla tüm sayfalar arasında döngü kurmanız gerekir; ancak önce siteden sayfa sayısını bulmalısınız.
URL’ye bağlanıp HTML içeriğini almak için aşağıdakiler gereklidir:
- Sayfa numaralarını argüman olarak alan bir
get_datafonksiyonu tanımlayın, - Bir kazıyıcı olarak tespiti atlatmaya yardımcı olacak bir
user-agenttanımlayın, - URL’yi
requests.get’e belirtin ve user-agent başlığını argüman olarak iletin, - requests.get’ten içeriği çıkarın,
- Belirtilen sayfayı kazıyın ve soup değişkenine atayın,
Sonraki ve önemli adım, ihtiyacınız olan tüm verilerin yer alacağı ana etiketi belirlemektir. Çıkaracağınız veriler şunlardır:
- Kitap Adı
- Yazar
- Puan
- Müşteri Sayısı (oylayan)
- Fiyat
Aşağıdaki görsel ana etiketin konumunu gösterir; üzerine geldiğinizde gerekli tüm öğeler vurgulanır.

Ana etikete benzer şekilde, kitap adı, yazar, puan, oylayan müşteri sayısı ve fiyat için öznitelikleri bulmanız gerekir. Kazımak istediğiniz web sayfasına gidip ilgili özniteliği seçin, sağ tıklayın ve öğeyi incele’yi seçin. Bu, aşağıdaki şekilde gösterildiği gibi, salt HTML web sayfasından çıkarmanız gereken belirli bilgi alanlarını bulmanıza yardımcı olacaktır:

Bazı yazar adlarının Amazon’da kayıtlı olmadığını unutmayın; bu nedenle bu yazarlar için ekstra find uygulamanız gerekir. Aşağıdaki hücre kodunda, yazar/yayınevi adlarını çıkarmak için iç içe if-else koşulları göreceksiniz.
no_pages = 2
def get_data(pageNo):
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"}
r = requests.get('https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_'+str(pageNo)+'?ie=UTF8&pg='+str(pageNo), headers=headers)#, proxies=proxies)
content = r.content
soup = BeautifulSoup(content)
#print(soup)
alls = []
for d in soup.findAll('div', attrs={'class':'a-section a-spacing-none aok-relative'}):
#print(d)
name = d.find('span', attrs={'class':'zg-text-center-align'})
n = name.find_all('img', alt=True)
#print(n[0]['alt'])
author = d.find('a', attrs={'class':'a-size-small a-link-child'})
rating = d.find('span', attrs={'class':'a-icon-alt'})
users_rated = d.find('a', attrs={'class':'a-size-small a-link-normal'})
price = d.find('span', attrs={'class':'p13n-sc-price'})
all1=[]
if name is not None:
#print(n[0]['alt'])
all1.append(n[0]['alt'])
else:
all1.append("unknown-product")
if author is not None:
#print(author.text)
all1.append(author.text)
elif author is None:
author = d.find('span', attrs={'class':'a-size-small a-color-base'})
if author is not None:
all1.append(author.text)
else:
all1.append('0')
if rating is not None:
#print(rating.text)
all1.append(rating.text)
else:
all1.append('-1')
if users_rated is not None:
#print(price.text)
all1.append(users_rated.text)
else:
all1.append('0')
if price is not None:
#print(price.text)
all1.append(price.text)
else:
all1.append('0')
alls.append(all1)
return alls
Aşağıdaki kod hücresi şu işlemleri gerçekleştirecektir:
get_datafonksiyonunu bir for döngüsü içinde çağırır,fordöngüsü bu fonksiyonu 1’den sayfa sayısı+1’e kadar yineleyerek çalıştırır.- Çıktı iç içe bir liste olacağından, önce listeyi düzleştirir ve ardından DataFrame’e geçirirsiniz.
- Son olarak, veri çerçevesini bir CSV dosyası olarak kaydedersiniz.
results = []
for i in range(1, no_pages+1):
results.append(get_data(i))
flatten = lambda l: [item for sublist in l for item in sublist]
df = pd.DataFrame(flatten(results),columns=['Book Name','Author','Rating','Customers_Rated', 'Price'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')
CSV Dosyasını Okuma
Şimdi yukarıdaki hücrede oluşturup kaydettiğiniz CSV dosyasını yükleyelim. Bu adım isteğe bağlıdır; doğrudan df veri çerçevesini de kullanabilir ve aşağıdaki adımı atlayabilirsiniz.
df = pd.read_csv("amazon_products.csv")
df.shape
(100, 5)
Veri çerçevesinin şekli, CSV dosyanızda 100 satır ve 5 sütun olduğunu gösterir.
Veri setinin ilk 5 satırını yazdıralım.
df.head(61)
| Book Name | Author | Rating | Customers_Rated | Price | |
|---|---|---|---|---|---|
| 0 | The Power of your Subconscious Mind | Joseph Murphy | 4.5 out of 5 stars | 13,948 | ₹ 99.00 |
| 1 | Think and Grow Rich | Napoleon Hill | 4.5 out of 5 stars | 16,670 | ₹ 99.00 |
| 2 | Word Power Made Easy | Norman Lewis | 4.4 out of 5 stars | 10,708 | ₹ 130.00 |
| 3 | Mathematics for Class 12 (Set of 2 Vol.) Exami... | R.D. Sharma | 4.5 out of 5 stars | 18 | ₹ 930.00 |
| 4 | The Girl in Room 105 | Chetan Bhagat | 4.3 out of 5 stars | 5,162 | ₹ 149.00 |
| ... | ... | ... | ... | ... | ... |
| 56 | COMBO PACK OF Guide To JAIIB Legal Aspects Pri... | MEC MILLAN | 4.5 out of 5 stars | 114 | ₹ 1,400.00 |
| 57 | Wren & Martin High School English Grammar and ... | Rao N | 4.4 out of 5 stars | 1,613 | ₹ 400.00 |
| 58 | Objective General Knowledge | Sanjiv Kumar | 4.2 out of 5 stars | 742 | ₹ 254.00 |
| 59 | The Rudest Book Ever | Shwetabh Gangwar | 4.6 out of 5 stars | 1,177 | ₹ 194.00 |
| 60 | Sita: Warrior of Mithila (Ram Chandra Series -... | Amish Tripathi | 4.4 out of 5 stars | 3,110 | ₹ 248.00 |
61 rows × 5 columns
Şimdi Rating, Customers_Rated ve Price sütunları üzerinde biraz ön işleme yapalım.
- Puanların 5 üzerinden olduğunu bildiğiniz için yalnızca puanı tutup fazlalıkları kaldırabilirsiniz.
- customers_rated sütunundan virgülü kaldırın.
- price sütunundan rupi simgesini ve virgülü kaldırın ve noktaya göre bölün.
- Son olarak, bu üç sütunun tamamını tamsayı veya kayan noktalıya dönüştürün.
df['Rating'] = df['Rating'].apply(lambda x: x.split()[0])
df['Rating'] = pd.to_numeric(df['Rating'])
df["Price"] = df["Price"].str.replace('₹', '')
df["Price"] = df["Price"].str.replace(',', '')
df['Price'] = df['Price'].apply(lambda x: x.split('.')[0])
df['Price'] = df['Price'].astype(int)
df["Customers_Rated"] = df["Customers_Rated"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()
| Book Name | Author | Rating | Customers_Rated | Price | |
|---|---|---|---|---|---|
| 0 | The Power of your Subconscious Mind | Joseph Murphy | 4.5 | 13948 | 99 |
| 1 | Think and Grow Rich | Napoleon Hill | 4.5 | 16670 | 99 |
| 2 | Word Power Made Easy | Norman Lewis | 4.4 | 10708 | 130 |
| 3 | Mathematics for Class 12 (Set of 2 Vol.) Exami... | R.D. Sharma | 4.5 | 18 | 930 |
| 4 | The Girl in Room 105 | Chetan Bhagat | 4.3 | 5162 | 149 |
Veri çerçevesinin veri türlerini doğrulayalım.
df.dtypes
Book Name object
Author object
Rating float64
Customers_Rated int64
Price int64
dtype: object
Veri çerçevesindeki sıfır değerlerini NaN ile değiştirin.
df.replace(str(0), np.nan, inplace=True)
df.replace(0, np.nan, inplace=True)
Veri Çerçevesindeki NaN Sayısını Sayma
count_nan = len(df) - df.count()
count_nan
Book Name 0
Author 6
Rating 0
Customers_Rated 0
Price 1
dtype: int64
Yukarıdaki çıktıya göre, yazar adı olmayan toplam altı kitap ve fiyatı olmayan bir kitap var. Bu bilgiler, kitaplarını satmak isteyen bir yazar için kritik öneme sahiptir ve böyle bilgilerin eksik bırakılmaması gerekir.
Bu NaN’leri düşürelim.
df = df.dropna()
Yazarların Amazon’daki En Yüksek Fiyatlı Kitabı
Hangi yazarların en yüksek fiyatlı kitaba sahip olduğunu bulalım. Sonuçları en iyi 20 yazar için görselleştireceksiniz.
data = df.sort_values(["Price"], axis=0, ascending=False)[:15]
data
| Book Name | Author | Rating | Customers_Rated | Price | |
|---|---|---|---|---|---|
| 56 | COMBO PACK OF Guide To JAIIB Legal Aspects Pri... | MEC MILLAN | 4.5 | 114 | 1400.0 |
| 98 | Diseases of Ear, Nose and Throat | P L Dhingra | 4.7 | 118 | 1285.0 |
| 3 | Mathematics for Class 12 (Set of 2 Vol.) Exami... | R.D. Sharma | 4.5 | 18 | 930.0 |
| 96 | Madhymik Bhautik Vigyan -12 (Part 1-2) (NCERT ... | Kumar-Mittal | 5.0 | 1 | 765.0 |
| 6 | My First Library: Boxset of 10 Board Books for... | Wonder House Books | 4.5 | 3116 | 750.0 |
| 38 | Indian Polity - For Civil Services and Other S... | M. Laxmikanth | 4.6 | 1210 | 700.0 |
| 42 | A Modern Approach to Verbal & Non-Verbal Reaso... | R.S. Aggarwal | 4.4 | 1822 | 675.0 |
| 27 | The Intelligent Investor (English) Paperback –... | Benjamin Graham | 4.4 | 6201 | 650.0 |
| 99 | Law of CONTRACT & Specific Relief | Dr. Avtar Singh | 4.4 | 23 | 643.0 |
| 49 | All In One ENGLISH CORE CBSE Class 12 2019-20 | Arihant Experts | 4.4 | 493 | 599.0 |
| 72 | The Secret | Rhonda Byrne | 4.5 | 11220 | 556.0 |
| 86 | How to Prepare for Quantitative Aptitude for t... | Arun Sharma | 4.4 | 847 | 537.0 |
| 8 | Quantitative Aptitude for Competitive Examinat... | R S Aggarwal | 4.4 | 4553 | 435.0 |
| 16 | Sapiens: A Brief History of Humankind | Yuval Noah Harari | 4.6 | 14985 | 434.0 |
| 84 | Concept of Physics Part-2 (2019-2020 Session) ... | H.C. Verma | 4.6 | 1807 | 433.0 |
from bokeh.models import ColumnDataSource
from bokeh.transform import dodge
import math
from bokeh.io import curdoc
curdoc().clear()
from bokeh.io import push_notebook, show, output_notebook
from bokeh.layouts import row
from bokeh.plotting import figure
from bokeh.transform import factor_cmap
from bokeh.models import Legend
output_notebook()
p = figure(x_range=data.iloc[:,1], plot_width=800, plot_height=550, title="Authors Highest Priced Book", toolbar_location=None, tools="")
p.vbar(x=data.iloc[:,1], top=data.iloc[:,4], width=0.9)
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Yukarıdaki grafikten, en yüksek fiyatlı iki kitabın Mecmillan ve P L Dhingra adlı yazarlara ait olduğunu gözlemleyebilirsiniz.
Yazarlara Göre En Yüksek Puanlı Kitaplar
Hangi yazarların en yüksek puanlı kitaplara sahip olduğunu ve bu yazarların hangi kitaplarının en yüksek puan aldığını bulalım. Ancak bunu yaparken, 1000’den az müşteri tarafından oy verilen yazarları filtreleyeceksiniz.
data = df[df['Customers_Rated'] > 1000]
data = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
data
| Book Name | Author | Rating | Customers_Rated | Price | |
|---|---|---|---|---|---|
| 26 | Inner Engineering: A Yogi’s Guide to Joy | Sadhguru | 4.7 | 4091 | 254.0 |
| 70 | Bhagavad-Gita (Hindi) | A. C. Bhaktivedanta | 4.7 | 1023 | 150.0 |
| 11 | The Alchemist | Paulo Coelho | 4.7 | 22182 | 264.0 |
| 47 | Harry Potter and the Philosopher's Stone | J.K. Rowling | 4.7 | 7737 | 234.0 |
| 84 | Concept of Physics Part-2 (2019-2020 Session) ... | H.C. Verma | 4.6 | 1807 | 433.0 |
| 16 | Sapiens: A Brief History of Humankind | Yuval Noah Harari | 4.6 | 14985 | 434.0 |
| 38 | Indian Polity - For Civil Services and Other S... | M. Laxmikanth | 4.6 | 1210 | 700.0 |
| 29 | Wings of Fire: An Autobiography of Abdul Kalam | Arun Tiwari | 4.6 | 3513 | 301.0 |
| 39 | The Theory of Everything | Stephen Hawking | 4.6 | 2004 | 199.0 |
| 25 | The Immortals of Meluha (Shiva Trilogy) | Amish | 4.6 | 4538 | 248.0 |
| 23 | Life's Amazing Secrets: How to Find Balance an... | Gaur Gopal Das | 4.6 | 3422 | 213.0 |
| 34 | Dear Stranger, I Know How You Feel | Ashish Bagrecha | 4.6 | 1130 | 167.0 |
| 17 | The Monk Who Sold His Ferrari | Robin Sharma | 4.6 | 5877 | 137.0 |
| 13 | How to Win Friends and Influence People | Dale Carnegie | 4.6 | 15377 | 99.0 |
| 59 | The Rudest Book Ever | Shwetabh Gangwar | 4.6 | 1177 | 194.0 |
p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Top Rated Books with more than 1000 Customers Rating", toolbar_location=None, tools="")
p.vbar(x=data.iloc[:,0], top=data.iloc[:,2], width=0.9)
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Yukarıdaki çıktıya göre, 1000’den fazla müşteri oyu alan en yüksek puanlı ilk üç kitap Inner Engineering: A Yogi’s Guide to Joy, Bhagavad-Gita (Hindi) ve The Alchemist’tir.
p = figure(x_range=data.iloc[:,1], plot_width=800, plot_height=600, title="Top Rated Books with more than 1000 Customers Rating", toolbar_location=None, tools="")
p.vbar(x=data.iloc[:,1], top=data.iloc[:,2], width=0.9)
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

Yukarıdaki grafik, 1000’den fazla müşteri oyu ile en yüksek puanlı kitaplara sahip ilk 10 yazarı azalan sırada gösteriyor; bunlar arasında Sadhguru, A. C. Bhaktivedanta ve Paulo Coelho yer alıyor.
En Çok Müşteri Oyu Alan Yazarlar ve Kitaplar
En yüksek puanlı kitapları ve yazarları zaten gördünüz; yine de en iyi yazar ve kitabı, o kitaba oy veren müşteri sayısına göre sonuca bağlamak daha ikna edici ve güvenilir olacaktır.
Hızlıca bunu bulalım.
data = df.sort_values(["Customers_Rated"], axis=0, ascending=False)[:20]
data
| Book Name | Author | Rating | Customers_Rated | Price | |
|---|---|---|---|---|---|
| 11 | The Alchemist | Paulo Coelho | 4.7 | 22182 | 264.0 |
| 1 | Think and Grow Rich | Napoleon Hill | 4.5 | 16670 | 99.0 |
| 13 | How to Win Friends and Influence People | Dale Carnegie | 4.6 | 15377 | 99.0 |
| 16 | Sapiens: A Brief History of Humankind | Yuval Noah Harari | 4.6 | 14985 | 434.0 |
| 18 | Rich Dad Poor Dad : What The Rich Teach Their ... | Robert T. Kiyosaki | 4.5 | 14591 | 296.0 |
| 10 | The Subtle Art of Not Giving a F*ck | Mark Manson | 4.4 | 14418 | 365.0 |
| 0 | The Power of your Subconscious Mind | Joseph Murphy | 4.5 | 13948 | 99.0 |
| 48 | The Power of Your Subconscious Mind | Joseph Murphy | 4.5 | 13948 | 99.0 |
| 72 | The Secret | Rhonda Byrne | 4.5 | 11220 | 556.0 |
| 41 | 1984 | George Orwell | 4.5 | 10829 | 95.0 |
| 2 | Word Power Made Easy | Norman Lewis | 4.4 | 10708 | 130.0 |
| 46 | Man's Search For Meaning: The classic tribute ... | Viktor E Frankl | 4.4 | 8544 | 245.0 |
| 67 | The 7 Habits of Highly Effective People | R. Stephen Covey | 4.3 | 8229 | 397.0 |
| 47 | Harry Potter and the Philosopher's Stone | J.K. Rowling | 4.7 | 7737 | 234.0 |
| 40 | One Indian Girl | Chetan Bhagat | 3.8 | 7128 | 113.0 |
| 65 | Thinking, Fast and Slow (Penguin Press Non-Fic... | Daniel Kahneman | 4.4 | 7087 | 410.0 |
| 27 | The Intelligent Investor (English) Paperback –... | Benjamin Graham | 4.4 | 6201 | 650.0 |
| 17 | The Monk Who Sold His Ferrari | Robin Sharma | 4.6 | 5877 | 137.0 |
| 53 | Ram - Scion of Ikshvaku (Ram Chandra) | Amish Tripathi | 4.2 | 5766 | 262.0 |
| 93 | The Richest Man in Babylon | George S. Clason | 4.5 | 5694 | 129.0 |
from bokeh.transform import factor_cmap
from bokeh.models import Legend
from bokeh.palettes import Dark2_5 as palette
import itertools
from bokeh.palettes import d3
#colors has a list of colors which can be used in plots
colors = itertools.cycle(palette)
palette = d3['Category20'][20]
index_cmap = factor_cmap('Author', palette=palette,
factors=data["Author"])
p = figure(plot_width=700, plot_height=700, title = "Top Authors: Rating vs. Customers Rated")
p.scatter('Rating','Customers_Rated',source=data,fill_alpha=0.6, fill_color=index_cmap,size=20,legend='Author')
p.xaxis.axis_label = 'RATING'
p.yaxis.axis_label = 'CUSTOMERS RATED'
p.legend.location = 'top_left'
BokehDeprecationWarning: 'legend' keyword is deprecated, use explicit 'legend_label', 'legend_field', or 'legend_group' keywords instead
show(p)

Yukarıdaki grafik, müşteri oyu ile gerçek puanı karşılaştıran yazarların bir saçılım grafiğidir. Grafiğe bakıldıktan sonra şu sonuçlar çıkarılabilir.
- Tereddütsüz, Paulo Coelho’nun The Alchemist’i, puanı ile oylayan müşteri sayısı uyumlu olduğundan en çok satan kitaptır.
- Amish Tripathi’nin Ram - Scion of Ikshvaku (Ram Chandra) adlı kitabı 4,2 puana ve 5766 müşteri oyuna sahiptir. Ancak George S. Clason’ın The Richest Man in Babylon adlı kitabı neredeyse benzer müşteri oylamasına sahipken genel puanı 4,5’tir. Dolayısıyla, daha çok müşteri The Richest Man in Babylon’a yüksek puan vermiştir.
Sonuç
Eğitimi tamamladığınız için tebrikler.
Bu eğitim, Beautiful Soup ile Amazon’u kazımaya ve Bokeh çizim kütüphanesini kullanarak çıkarılan bilgileri görselleştirip anlamlandırmaya temel bir giriş niteliğindeydi. Beautiful Soup ile web kazımayı öğrenme yolunda bir adım daha atmak için iyi bir alıştırma, başka sitelerden veri kazıyıp buradan nasıl içgörüler elde edebileceğinizi görmektir. Popüler siteleri kazımaya dair daha fazla yönlendirme isterseniz, Reddit’i kazıma üzerine bir eğitimimiz de var.
Python’a yeni başlıyorsanız ve daha fazla öğrenmek istiyorsanız, DataCamp’in Python ile Veri Bilimine Giriş kursunu alın.
