Khóa học
Trong thời đại internet ngập tràn dữ liệu và dữ liệu được ví như “dầu mỏ mới”, web scraping càng trở nên quan trọng và hữu ích trong nhiều ứng dụng. Web scraping là việc trích xuất hay “cào” thông tin từ các trang web. Đôi khi nó cũng được gọi là thu hoạch dữ liệu web hay trích xuất dữ liệu web. Sao chép văn bản từ một trang web và dán về máy của bạn cũng là web scraping, nhưng đó là thao tác thủ công. Nhìn chung, web scraping đề cập đến việc tự động trích xuất dữ liệu nhờ các web crawler. Web crawler là các script kết nối với World Wide Web thông qua giao thức HTTP và cho phép bạn tự động lấy dữ liệu.
Dù bạn là nhà khoa học dữ liệu, kỹ sư, hay bất kỳ ai phân tích lượng dữ liệu lớn, thì khả năng thu thập dữ liệu từ web là một kỹ năng hữu ích. Giả sử bạn tìm thấy dữ liệu trên web nhưng không có cách tải xuống trực tiếp, kỹ năng web scraping bằng Python sẽ giúp bạn trích xuất dữ liệu thành dạng hữu ích để nhập và sử dụng theo nhiều cách khác nhau.
Một số ứng dụng thực tế của web scraping có thể là:
- Thu thập hồ sơ ứng viên có kỹ năng cụ thể,
- Trích xuất tweet trên Twitter với các hashtag nhất định,
- Tạo danh sách khách hàng tiềm năng trong marketing,
- Cào chi tiết sản phẩm và đánh giá từ các website thương mại điện tử như Amazon, trọng tâm của hướng dẫn này
Ngoài các trường hợp trên, web scraping còn được dùng rộng rãi trong xử lý ngôn ngữ tự nhiên để trích xuất văn bản từ trang web phục vụ huấn luyện mô hình học sâu.
Trước khi tiếp tục, lưu ý rằng các trang như Amazon có thể cập nhật điều khoản dịch vụ hoặc áp dụng các hạn chế kỹ thuật mới ảnh hưởng đến cách nội dung của họ được truy cập hay tái sử dụng. Bạn có trách nhiệm xem lại Điều khoản Dịch vụ và tệp robots.txt của trang để đảm bảo trường hợp sử dụng của bạn tuân thủ. Chính sách có thể thay đổi và quyền hạn có thể khác nhau.
Những thách thức tiềm ẩn của Web Scraping
-
Một thách thức khi cào thông tin từ các trang web là cấu trúc trang rất đa dạng. Nghĩa là mẫu (template) của mỗi trang thường khác nhau và độc nhất; do đó việc khái quát hóa trên nhiều trang có thể là thách thức.
-
Một thách thức khác là tính bền vững. Vì các nhà phát triển liên tục cập nhật website, bạn khó có thể dựa vào một scraper trong thời gian dài. Dù thay đổi có thể nhỏ, chúng vẫn có thể gây trở ngại khi bạn lấy dữ liệu.
Vì vậy, để giải quyết các thách thức trên, có một số hướng khả thi. Một là áp dụng quy trình tích hợp liên tục & phát triển (CI/CD) và bảo trì thường xuyên vì thay đổi trên website là động.
Một cách tiếp cận thực tế hơn là sử dụng các Giao diện Lập trình Ứng dụng (API) do nhiều trang & nền tảng cung cấp. Ví dụ, Facebook và Twitter cung cấp API dành riêng cho nhà phát triển muốn thử nghiệm với dữ liệu của họ hoặc trích xuất thông tin, chẳng hạn dữ liệu về tất cả bạn bè & bạn chung để vẽ đồ thị kết nối. Định dạng dữ liệu khi dùng API khác với web scraping thông thường, cụ thể là JSON hoặc XML, trong khi với web scraping tiêu chuẩn, bạn chủ yếu xử lý dữ liệu ở dạng HTML.
Beautiful Soup là gì?
Beautiful Soup là thư viện Python thuần dùng để trích xuất dữ liệu có cấu trúc từ website. Nó cho phép bạn phân tích dữ liệu từ tệp HTML và XML. Thư viện này hoạt động như một mô-đun hỗ trợ và tương tác với HTML theo cách tương tự nhưng thuận tiện hơn so với việc bạn dùng các công cụ dành cho nhà phát triển khác để tương tác với trang web.
-
Thường giúp lập trình viên tiết kiệm hàng giờ hoặc vài ngày công vì nó hoạt động với các trình phân tích cú pháp ưa thích như
lxmlvàhtml5lib, cung cấp cách điều hướng, tìm kiếm và chỉnh sửa cây phân tích theo phong cách Python tự nhiên. -
Một tính năng mạnh và hữu ích khác của Beautiful Soup là khả năng tự động chuyển đổi tài liệu lấy về sang Unicode và tài liệu xuất ra sang UTF-8. Là nhà phát triển, bạn không cần lo việc này trừ khi bản thân tài liệu không chỉ định mã hóa hoặc Beautiful Soup không thể phát hiện.
-
Nó cũng được xem là nhanh hơn so với nhiều kỹ thuật phân tích hay cào dữ liệu thông thường khác.
Các loại trình phân tích cú pháp
Thoải mái tìm hiểu thêm tại đây.
Lý thuyết vậy là đủ rồi nhỉ? Giờ hãy cài đặt Beautiful Soup và bắt đầu tìm hiểu các tính năng, khả năng của nó bằng Python.
Bước đầu tiên, bạn cần cài đặt thư viện Beautiful Soup bằng terminal hoặc jupyter lab. Cách tốt nhất là cài qua pip, nên hãy đảm bảo bạn đã cài sẵn mô-đun 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)
Import các thư viện cần thiết
Hãy import các gói cần dùng để cào dữ liệu từ website và trực quan hóa bằng seaborn, matplotlib và 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
Cào dữ liệu sách bán chạy nhất trên Amazon
URL bạn sẽ cào là: https://www.amazon.in/gp/bestsellers/books/. Tham số trang có thể được chỉnh để truy cập dữ liệu của từng trang. Vì vậy, để lấy hết dữ liệu, bạn cần lặp qua toàn bộ các trang, nhưng trước hết, bạn cần xác định số trang từ website.
Để kết nối tới URL và lấy nội dung HTML, cần những bước sau:
- Định nghĩa hàm
get_datanhận số trang làm đối số, - Định nghĩa
user-agentgiúp vượt qua việc bị phát hiện là scraper, - Chỉ định URL cho
requests.getvà truyền header user-agent làm đối số, - Trích nội dung từ requests.get,
- Cào trang chỉ định và gán vào biến soup,
Bước tiếp theo và quan trọng là xác định thẻ cha (parent tag) nơi chứa toàn bộ dữ liệu bạn cần. Dữ liệu bạn sẽ trích xuất gồm có:
- Tên sách
- Tác giả
- Đánh giá
- Số khách hàng đã đánh giá
- Giá
Hình dưới đây cho thấy vị trí của thẻ cha, khi bạn di chuột lên, mọi phần tử cần thiết sẽ được tô sáng.

Tương tự thẻ cha, bạn cần tìm thuộc tính cho tên sách, tác giả, đánh giá, số khách hàng đánh giá và giá. Bạn sẽ vào trang muốn cào, chọn thuộc tính, nhấp chuột phải và chọn inspect element. Việc này giúp bạn xác định chính xác các trường thông tin cần trích xuất từ trang HTML thô, như minh họa bên dưới:

Lưu ý một số tên tác giả không được đăng ký với Amazon, nên bạn cần áp dụng thêm find cho các tác giả đó. Trong ô mã dưới đây, bạn sẽ thấy các điều kiện if-else lồng nhau cho tên tác giả, nhằm trích xuất tên tác giả/nhà xuất bản.
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
Ô mã dưới đây sẽ thực hiện các chức năng sau:
- Gọi hàm
get_databên trong một vòng lặpfor, - Vòng lặp
forsẽ lặp từ 1 đến số trang+1. - Vì đầu ra là danh sách lồng nhau, trước tiên bạn sẽ làm phẳng danh sách rồi truyền vào DataFrame.
- Cuối cùng, lưu dataframe thành tệp 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')
Đọc tệp CSV
Giờ hãy tải tệp CSV bạn đã tạo và lưu ở ô trên. Đây là bước tùy chọn; bạn có thể dùng trực tiếp dataframe df và bỏ qua bước dưới.
df = pd.read_csv("amazon_products.csv")
df.shape
(100, 5)
Kích thước của dataframe cho thấy có 100 hàng và 5 cột trong tệp CSV của bạn.
Hãy in 5 hàng đầu tiên của tập dữ liệu.
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 hàng × 5 cột
Hãy tiền xử lý các cột Ratings, Customers_Rated và Price.
- Vì điểm đánh giá theo thang 5, bạn chỉ giữ lại số điểm và bỏ phần thừa.
- Ở cột customers_rated, bỏ dấu phẩy.
- Ở cột price, bỏ ký hiệu rupee, dấu phẩy và tách theo dấu chấm.
- Cuối cùng, chuyển cả ba cột sang kiểu số nguyên hoặc số thực.
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 |
Hãy kiểm tra kiểu dữ liệu của DataFrame.
df.dtypes
Book Name object
Author object
Rating float64
Customers_Rated int64
Price int64
dtype: object
Thay thế các giá trị 0 trong DataFrame thành NaN.
df.replace(str(0), np.nan, inplace=True)
df.replace(0, np.nan, inplace=True)
Đếm số lượng NaN trong DataFrame
count_nan = len(df) - df.count()
count_nan
Book Name 0
Author 6
Rating 0
Customers_Rated 0
Price 1
dtype: int64
Từ kết quả trên, bạn có thể thấy có tổng cộng sáu cuốn sách không có tên tác giả, trong khi một cuốn không có giá đi kèm. Đây là những thông tin quan trọng đối với tác giả muốn bán sách của mình và không nên bỏ qua.
Hãy loại các giá trị NaN này.
df = df.dropna()
Sách có giá cao nhất của các tác giả trên Amazon
Hãy tìm xem tác giả nào có sách giá cao nhất. Bạn sẽ trực quan hóa kết quả cho 20 tác giả hàng đầu.
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)

Từ biểu đồ trên, bạn có thể thấy hai cuốn sách có giá cao nhất thuộc về các tác giả Mecmillan và P L Dhingra.
Sách được đánh giá cao nhất theo tác giả
Hãy tìm xem những tác giả nào có sách được đánh giá cao nhất và đó là những cuốn nào. Tuy nhiên, khi thực hiện, bạn sẽ lọc ra các tác giả có dưới 1000 lượt khách hàng đánh giá.
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)

Từ kết quả trên, bạn có thể thấy ba cuốn sách được đánh giá cao nhất với hơn 1000 lượt đánh giá là Inner Engineering: A Yogi’s Guide to Joy, Bhagavad-Gita (Hindi) và 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)

Biểu đồ trên hiển thị 10 tác giả hàng đầu theo thứ tự giảm dần có sách được đánh giá cao nhất với hơn 1000 lượt đánh giá, gồm Sadhguru, A. C. Bhaktivedanta và Paulo Coelho.
Tác giả và sách có nhiều lượt đánh giá nhất
Dù bạn đã xem các sách và tác giả được đánh giá cao nhất, vẫn sẽ thuyết phục và đáng tin cậy hơn nếu kết luận tác giả và cuốn sách tốt nhất dựa trên số lượng khách hàng đã đánh giá.
Vậy hãy nhanh chóng tìm điều đó.
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)

Biểu đồ trên là scatter plot giữa tác giả với số lượt khách hàng đánh giá và điểm đánh giá thực tế. Có thể rút ra các kết luận sau:
- Không nghi ngờ gì, cuốn The Alchemist của Paulo Coelho là sách bán chạy nhất vì điểm đánh giá và số lượt khách hàng đánh giá đều rất đồng nhất.
- Sách Ram - Scion of Ikshvaku (Ram Chandra) của tác giả Amish Tripathi có điểm 4.2 với 5766 lượt đánh giá. Tuy nhiên, cuốn The Richest Man in Babylon của George S. Clason có số lượt đánh giá gần như tương đương, nhưng điểm tổng thể là 4.5. Do đó, có thể kết luận nhiều khách hàng chấm điểm cao cho The Richest Man in Babylon hơn.
Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn.
Hướng dẫn này giới thiệu cơ bản về cách cào dữ liệu Amazon với Beautiful Soup và cách bạn có thể khai thác ý nghĩa từ thông tin trích xuất bằng cách trực quan hóa với thư viện vẽ Bokeh. Bài tập tốt để tiến thêm một bước trong học web scraping với Beautiful Soup là cào dữ liệu từ các trang khác và xem bạn có thể rút ra insight gì. Chúng tôi cũng có hướng dẫn về cào dữ liệu Reddit nếu bạn muốn thêm gợi ý khi cào các trang phổ biến.
Nếu bạn mới bắt đầu với Python và muốn học thêm, hãy tham gia khóa Giới thiệu Khoa học Dữ liệu với Python của DataCamp.