कोर्स
जब इंटरनेट पर इतनी अधिक मात्रा में डेटा उपलब्ध है, और डेटा को नए तेल के रूप में देखा जा रहा है, तो वेब स्क्रैपिंग का महत्व और व्यावहारिकता कई अनुप्रयोगों में और बढ़ गई है। वेब स्क्रैपिंग वेबसाइट से जानकारी निकालने या स्क्रैप करने से संबंधित है। इसे कभी-कभी वेब हार्वेस्टिंग या वेब डेटा एक्सट्रैक्शन भी कहा जाता है। किसी वेबसाइट से टेक्स्ट कॉपी करके अपने लोकल सिस्टम पर पेस्ट करना भी वेब स्क्रैपिंग ही है, हालांकि यह मैनुअल कार्य है। सामान्यतः, वेब स्क्रैपिंग वेब क्रॉलर की मदद से स्वतः डेटा निकालने से संबद्ध है। वेब क्रॉलर ऐसे स्क्रिप्ट होते हैं जो HTTP प्रोटोकॉल का उपयोग करके वर्ल्ड वाइड वेब से कनेक्ट होते हैं और आपको स्वचालित तरीके से डेटा लाने की सुविधा देते हैं।
चाहे आप डेटा साइंटिस्ट हों, इंजीनियर हों, या कोई भी व्यक्ति जो बड़े डेटा सेट्स का विश्लेषण करता है, वेब से डेटा स्क्रैप करने की क्षमता एक उपयोगी कौशल है। मान लें कि आपको वेब पर डेटा मिलता है और उसे सीधे डाउनलोड करने का कोई तरीका नहीं है, तो Python का उपयोग करके वेब स्क्रैपिंग ऐसा कौशल है जिसकी मदद से आप डेटा को ऐसे रूप में निकाल सकते हैं जिसे विभिन्न तरीकों से इम्पोर्ट और उपयोग किया जा सके।
वेब स्क्रैपिंग के कुछ व्यावहारिक उपयोग हो सकते हैं:
- किसी विशेष कौशल वाले उम्मीदवारों के रिज्यूमे एकत्र करना,
- ट्विटर से विशेष हैशटैग वाले ट्वीट्स निकालना,
- मार्केटिंग में लीड जनरेशन,
- Amazon जैसी ई-कॉमर्स वेबसाइटों से उत्पाद विवरण और समीक्षाएँ स्क्रैप करना — जो इस ट्यूटोरियल का केंद्र है
उपरोक्त उपयोग-केस के अलावा, वेब स्क्रैपिंग का व्यापक उपयोग नेचुरल लैंग्वेज प्रोसेसिंग में वेबसाइटों से टेक्स्ट निकालने के लिए किया जाता है ताकि डीप लर्निंग मॉडल को प्रशिक्षित किया जा सके।
आगे बढ़ने से पहले ध्यान रखें कि Amazon जैसी वेबसाइटें अपनी विशिष्ट सेवा शर्तों को अपडेट कर सकती हैं या नई तकनीकी पाबंदियाँ लागू कर सकती हैं जो उनकी सामग्री तक पहुँचने या उसे पुन: उपयोग करने के तरीकों को प्रभावित करती हैं। आपकी जिम्मेदारी है कि आप साइट की Terms of Service और robots.txt फ़ाइल की समीक्षा करें ताकि यह सुनिश्चित हो सके कि आपका विशेष उपयोग-केस अनुपालन में है। नीतियाँ बदल सकती हैं और अनुमतियाँ भिन्न हो सकती हैं।
वेब स्क्रैपिंग की संभावित चुनौतियाँ
-
वेबसाइटों से जानकारी स्क्रैप करते समय आप जिन चुनौतियों का सामना करेंगे उनमें से एक है वेबसाइटों की अलग-अलग संरचनाएँ। अर्थात, वेबसाइटों के टेम्पलेट्स अलग और विशिष्ट होंगे; इसलिए अलग-अलग वेबसाइटों पर सामान्यीकरण करना चुनौतीपूर्ण हो सकता है।
-
एक और चुनौती है दीर्घायु। चूँकि वेब डेवलपर अपनी वेबसाइटों को अपडेट करते रहते हैं, आप लंबे समय तक एक ही स्क्रैपर पर भरोसा नहीं कर सकते। भले ही बदलाव मामूली हों, फिर भी वे डेटा लाने में बाधा पैदा कर सकते हैं।
उपरोक्त चुनौतियों का समाधान करने के लिए कई संभावित उपाय हो सकते हैं। एक उपाय है कि वेबसाइट में होने वाले गतिशील परिवर्तनों के अनुरूप सतत इंटिग्रेशन व डेवलपमेंट (CI/CD) और नियमित रखरखाव का पालन किया जाए।
एक और अधिक व्यावहारिक तरीका है विभिन्न वेबसाइटों और प्लेटफ़ॉर्म द्वारा प्रदान किए गए एप्लीकेशन प्रोग्रामिंग इंटरफेस (APIs) का उपयोग करना। उदाहरण के लिए, Facebook और Twitter ऐसे API प्रदान करते हैं जो खास तौर पर उन डेवलपर्स के लिए बनाए गए हैं जो उनके डेटा के साथ प्रयोग करना चाहते हैं या ऐसी जानकारी निकालना चाहते हैं जैसे सभी मित्रों और साझा मित्रों से संबंधित डेटा लेकर उसका कनेक्शन ग्राफ बनाना। APIs का उपयोग करते समय डेटा का प्रारूप सामान्य वेब स्क्रैपिंग से अलग होता है, यानी JSON या XML; जबकि मानक वेब स्क्रैपिंग में आप मुख्य रूप से HTML फ़ॉर्मेट के डेटा से निपटते हैं।
Beautiful Soup क्या है?
Beautiful Soup एक शुद्ध Python लाइब्रेरी है जो किसी वेबसाइट से संरचित डेटा निकालने के लिए उपयोग होती है। यह आपको HTML और XML फ़ाइलों से डेटा पार्स करने देता है। यह एक सहायक मॉड्यूल की तरह कार्य करता है और HTML के साथ इस तरह इंटरैक्ट करता है जो डेवलपर टूल्स के अन्य उपलब्ध तरीकों की तुलना में समान और बेहतर है।
-
यह आमतौर पर प्रोग्रामर्स के कई घंटे या दिन बचा देता है क्योंकि यह आपके पसंदीदा पार्सर्स जैसे
lxmlऔरhtml5libके साथ काम करता है और पार्स ट्री को नेविगेट, सर्च और मॉडिफाई करने के लिए ऑर्गेनिक Python तरीके प्रदान करता है। -
Beautiful Soup की एक और शक्तिशाली और उपयोगी विशेषता इसकी यह समझदारी है कि वह प्राप्त दस्तावेज़ों को Unicode में और आउटगोइंग दस्तावेज़ों को UTF-8 में बदल दे। एक डेवलपर के रूप में, आपको इसकी चिंता नहीं करनी पड़ती, जब तक कि दस्तावेज़ स्वयं कोई एन्कोडिंग निर्दिष्ट न करे या Beautiful Soup उसे पहचानने में असमर्थ न हो।
-
इसे अन्य सामान्य पार्सिंग या स्क्रैपिंग तकनीकों की तुलना में तेज़ भी माना जाता है।
पार्सर्स के प्रकार
इसके बारे में अधिक पढ़ने के लिए यहाँ जाएँ।
काफी सिद्धांत हो गया, है न? तो आइए beautiful soup इंस्टॉल करते हैं और Python का उपयोग करके इसकी विशेषताओं और क्षमताओं के बारे में सीखना शुरू करते हैं।
पहले चरण के रूप में, आपको अपने टर्मिनल या jupyter lab का उपयोग करके Beautiful Soup लाइब्रेरी इंस्टॉल करनी होगी। beautiful soup को इंस्टॉल करने का सबसे अच्छा तरीका pip के माध्यम से है, इसलिए सुनिश्चित करें कि pip मॉड्यूल पहले से इंस्टॉल है।
!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)
आवश्यक लाइब्रेरी इम्पोर्ट करना
आइए वे पैकेज इम्पोर्ट करते हैं जिनका उपयोग आप वेबसाइट से डेटा स्क्रैप करने और seaborn, matplotlib और bokeh की मदद से उसे विज़ुअलाइज़ करने के लिए करेंगे।
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 के बेस्ट सेलिंग पुस्तकों को स्क्रैप करना
जिस URL को आप स्क्रैप करने जा रहे हैं वह है: https://www.amazon.in/gp/bestsellers/books/. पेज आर्गुमेंट को प्रत्येक पेज का डेटा एक्सेस करने के लिए बदला जा सकता है। इसलिए, सभी पेजों तक पहुँचने के लिए आपको सभी पेजों पर लूप चलाना होगा ताकि आवश्यक डेटा सेट मिल सके, लेकिन पहले आपको वेबसाइट से पेजों की संख्या पता करनी होगी।
URL से कनेक्ट होने और HTML सामग्री लाने के लिए निम्न चीज़ों की आवश्यकता है:
get_dataनाम का एक फंक्शन परिभाषित करें जो पेज नंबर को आर्गुमेंट के रूप में लेगा,- एक
user-agentपरिभाषित करें जो स्क्रैपर डिटेक्शन को बायपास करने में मदद करेगा, requests.getमें URL निर्दिष्ट करें और user-agent हेडर को आर्गुमेंट के रूप में पास करें,- requests.get से कंटेंट निकालें,
- निर्दिष्ट पेज को स्क्रैप करें और उसे soup वेरिएबल में असाइन करें,
अगला और महत्वपूर्ण चरण है उस parent tag की पहचान करना जिसके अंतर्गत आपकी जरूरत का सारा डेटा मौजूद होगा। जिस डेटा को आप निकालने जा रहे हैं, वह है:
- पुस्तक का नाम
- लेखक
- रेटिंग
- कस्टमर रेटिंग की संख्या
- कीमत
नीचे दी गई छवि दिखाती है कि पैरेंट टैग कहाँ स्थित है, और उस पर होवर करने पर सभी आवश्यक एलिमेंट्स हाइलाइट हो जाते हैं।

पैरेंट टैग की तरह ही, आपको पुस्तक का नाम, लेखक, रेटिंग, कस्टमर रेटिंग और कीमत के लिए एट्रिब्यूट्स ढूँढने होंगे। आपको उस वेबपेज पर जाना होगा जिसे आप स्क्रैप करना चाहते हैं, एट्रिब्यूट चुनना होगा और उस पर राइट-क्लिक करके Inspect Element चुनना होगा। यह आपको शुद्ध HTML वेब पेज से आवश्यक विशिष्ट सूचना फ़ील्ड ढूँढने में मदद करेगा, जैसा कि नीचे दिए गए चित्र में दिखाया गया है:

ध्यान दें कि कुछ लेखकों के नाम Amazon पर रजिस्टर्ड नहीं हैं, इसलिए आपको उन लेखकों के लिए अतिरिक्त find लागू करने की ज़रूरत होगी। नीचे दिए गए सेल कोड में, आप लेखक नामों के लिए नेस्टेड if-else कंडीशन्स पाएँगे, जिनका उपयोग लेखक/प्रकाशन के नाम निकालने के लिए किया गया है।
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
नीचे दिया गया कोड सेल निम्न कार्य करेगा:
get_dataफंक्शन को एक for लूप के भीतर कॉल करना,forलूप इस फंक्शन पर 1 से लेकर पेजों की संख्या+1 तक इटरेट करेगा।- क्योंकि आउटपुट एक नेस्टेड लिस्ट होगा, आप पहले लिस्ट को फ्लैट करेंगे और फिर उसे DataFrame में पास करेंगे।
- अंत में, डेटा फ्रेम को CSV फ़ाइल के रूप में सेव करेंगे।
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 फ़ाइल पढ़ना
अब आइए उस CSV फ़ाइल को लोड करते हैं जिसे आपने ऊपर वाले सेल में बनाया और सेव किया था। यह एक वैकल्पिक चरण है; आप सीधे डेटा फ्रेम df का भी उपयोग कर सकते हैं और नीचे दिए चरण को नज़रअंदाज़ कर सकते हैं।
df = pd.read_csv("amazon_products.csv")
df.shape
(100, 5)
डेटा फ्रेम के आकार से पता चलता है कि आपकी CSV फ़ाइल में 100 पंक्तियाँ और 5 कॉलम हैं।
आइए डेटा सेट की पहली 5 पंक्तियाँ प्रिंट करते हैं।
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 पंक्तियाँ × 5 कॉलम
आइए Ratings, Customers_Rated और Price कॉलम पर कुछ प्रीप्रोसेसिंग करें।
- चूँकि आपको पता है कि रेटिंग 5 में से होती है, आप केवल रेटिंग रखें और उसमें से अतिरिक्त हिस्सा हटा दें।
- customers_rated कॉलम से कॉमा हटाएँ।
- price कॉलम से रुपये का प्रतीक, कॉमा हटाएँ और डॉट के आधार पर स्प्लिट करें।
- अंत में, इन तीनों कॉलम को integer या float में कन्वर्ट करें।
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 |
आइए DataFrame के डेटा टाइप्स की जाँच करें।
df.dtypes
Book Name object
Author object
Rating float64
Customers_Rated int64
Price int64
dtype: object
DataFrame में शून्य मानों को NaN से बदलें।
df.replace(str(0), np.nan, inplace=True)
df.replace(0, np.nan, inplace=True)
DataFrame में NaN की संख्या गिनना
count_nan = len(df) - df.count()
count_nan
Book Name 0
Author 6
Rating 0
Customers_Rated 0
Price 1
dtype: int64
उपरोक्त आउटपुट से आप देख सकते हैं कि कुल छह पुस्तकें ऐसी हैं जिनके पास लेखक का नाम नहीं है, जबकि एक पुस्तक के साथ कीमत संबद्ध नहीं है। ये जानकारी किसी ऐसे लेखक के लिए महत्वपूर्ण है जो अपनी किताबें बेचना चाहता है और ऐसी जानकारी देना नज़रअंदाज़ नहीं करनी चाहिए।
आइए इन NaN को ड्रॉप करें।
df = df.dropna()
Amazon पर लेखकों की सबसे महँगी पुस्तक
आइए पता लगाएँ कि किन लेखकों की सबसे महँगी पुस्तकें थीं। आप ऐसे शीर्ष 20 लेखकों के परिणामों का विज़ुअलाइज़ेशन करेंगे।
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)

उपरोक्त ग्राफ से आप देख सकते हैं कि सबसे ऊपर की दो सबसे महँगी पुस्तकें Mecmillan और P L Dhingra के हैं।
लेखकों द्वारा शीर्ष-रेटेड पुस्तकें
आइए पता लगाएँ कि किन लेखकों की शीर्ष-रेटेड पुस्तकें हैं और उन लेखकों की कौन-सी पुस्तकें शीर्ष पर हैं। हालाँकि, यह पता लगाते समय, आप उन लेखकों को फ़िल्टर करेंगे जिनमें 1000 से कम कस्टमर रेटिंग हैं।
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)

उपरोक्त आउटपुट से आप देख सकते हैं कि 1000 से अधिक कस्टमर रेटिंग वाली शीर्ष तीन पुस्तकें हैं: Inner Engineering: A Yogi’s Guide to Joy, Bhagavad-Gita (Hindi), और The Alchemist।
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)

उपरोक्त ग्राफ 1000 से अधिक कस्टमर रेटिंग वाली सबसे उच्च-रेटेड पुस्तकों के संदर्भ में अवरोही क्रम में शीर्ष 10 लेखकों को दिखाता है, जो हैं Sadhguru, A. C. Bhaktivedanta और Paulo Coelho।
सबसे अधिक कस्टमर रेटिंग वाले लेखक और पुस्तकें
जबकि आपने पहले ही शीर्ष-रेटेड पुस्तकें और शीर्ष-रेटेड लेखक देख लिए हैं, फिर भी किसी पुस्तक के लिए रेटिंग देने वाले ग्राहकों की संख्या के आधार पर सर्वश्रेष्ठ लेखक और पुस्तक का निष्कर्ष निकालना अधिक विश्वसनीय और ठोस होगा।
तो, आइए इसे जल्दी से पता लगाते हैं।
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)

उपरोक्त ग्राफ लेखकों का एक स्कैटर प्लॉट है जिसमें कस्टमर रेटिंग की संख्या बनाम वास्तविक रेटिंग दिखाई गई है। उपरोक्त प्लॉट को देखकर निम्न निष्कर्ष निकाले जा सकते हैं।
- बिना किसी संदेह के Paulo Coelho की पुस्तक The Alchemist सबसे अधिक बिकने वाली है, क्योंकि रेटिंग और कस्टमर रेटिंग की संख्या दोनों एक-दूसरे के अनुरूप हैं।
- लेखक Amish Tripathi की पुस्तक Ram - Scion of Ikshvaku (Ram Chandra) की रेटिंग 4.2 है और कस्टमर रेटिंग 5766 है। वहीं लेखक George S. Clason की पुस्तक The Richest Man in Babylon की कस्टमर रेटिंग लगभग समान है, लेकिन कुल रेटिंग 4.5 है। इसलिए, यह निष्कर्ष निकाला जा सकता है कि अधिक ग्राहकों ने The Richest Man in Babylon को उच्च रेटिंग दी।
निष्कर्ष
ट्यूटोरियल पूरा करने पर बधाई।
यह ट्यूटोरियल beautiful soup के साथ Amazon को स्क्रैप करने की एक बुनियादी शुरुआत थी और यह भी कि आप bokeh plotting लाइब्रेरी का उपयोग करके निकाली गई जानकारी का अर्थ कैसे समझ सकते हैं। beautiful soup के साथ वेब स्क्रैपिंग सीखने में एक कदम आगे बढ़ने के लिए अच्छा अभ्यास होगा कि आप कुछ अन्य वेबसाइटों से डेटा स्क्रैप करें और देखें कि आप उससे क्या अंतर्दृष्टियाँ प्राप्त कर सकते हैं। यदि आप लोकप्रिय वेबसाइटों को स्क्रैप करने पर अधिक मार्गदर्शन चाहते हैं तो हमारे पास Reddit को स्क्रैप करने पर ट्यूटोरियल भी है।
यदि आप Python में अभी शुरुआत कर रहे हैं और अधिक सीखना चाहते हैं, तो DataCamp का Introduction to Data Science in Python कोर्स करें।