Web scraping là nghệ thuật trích xuất dữ liệu từ internet và sử dụng cho mục đích có ý nghĩa. Đôi khi nó còn được gọi là trích xuất dữ liệu web hoặc thu thập dữ liệu web. Đối với người mới bắt đầu, nó cũng giống như sao chép dữ liệu từ internet và lưu trữ cục bộ. Tuy nhiên, đây là một quá trình thủ công. Web scraping
Web scraping là nghệ thuật trích xuất dữ liệu từ internet và sử dụng cho mục đích có ý nghĩa. Đôi khi nó còn được gọi là trích xuất dữ liệu web hoặc thu thập dữ liệu web. Đối với người mới bắt đầu, nó cũng giống như sao chép dữ liệu từ internet và lưu trữ cục bộ. Tuy nhiên, đây là một quy trình thủ công. Web scraping là một quy trình tự động hoạt động với sự trợ giúp của trình thu thập dữ liệu web. Trình thu thập dữ liệu web kết nối với internet bằng giao thức HTTP và cho phép người dùng lấy dữ liệu theo cách tự động. Người ta có thể coi internet là đất giàu và dữ liệu là dầu mới, trong khi web scraping là kỹ thuật để chiết xuất dầu đó.
Khả năng thu thập và phân tích dữ liệu từ internet đã trở thành một kỹ thuật thiết yếu cho dù bạn là nhà khoa học dữ liệu, kỹ sư hay nhà tiếp thị. Có thể có nhiều trường hợp sử dụng khác nhau mà việc thu thập dữ liệu web có thể giúp ích rất nhiều. Trong bài viết này, chúng ta sẽ thu thập dữ liệu từ Amazon bằng Python. Cuối cùng, chúng ta cũng sẽ phân tích dữ liệu đã thu thập và xem dữ liệu đó quan trọng như thế nào đối với bất kỳ người bình thường, nhà khoa học dữ liệu hay người điều hành một cửa hàng thương mại điện tử nào.
Chỉ là một lưu ý nhỏ: Nếu bạn mới làm quen với Python và web scraping , bài viết này có thể hơi khó hiểu đối với bạn. Tôi khuyên bạn nên xem qua các bài viết ở cấp độ giới thiệu tại ProxyScrape rồi mới đến bài này.
Chúng ta hãy bắt đầu với mã.
Trước hết, chúng ta sẽ nhập tất cả các thư viện cần thiết cho mã. Các thư viện này sẽ được sử dụng để thu thập và trực quan hóa dữ liệu. Nếu bạn muốn biết chi tiết về từng thư viện, bạn có thể truy cập tài liệu chính thức của chúng.
nhập pandas dưới dạng pd nhập numpy dưới dạng np nhập matplotlib.pyplot dưới dạng plt nhập seaborn dưới dạng sns %matplotlib inline nhập re nhập thời gian từ datetime nhập datetime nhập matplotlib.dates dưới dạng mdates nhập matplotlib.ticker dưới dạng ticker từ urllib.request nhập urlopen từ bs4 nhập BeautifulSoup nhập yêu cầu
Bây giờ chúng ta sẽ thu thập thông tin hữu ích từ những cuốn sách bán chạy nhất của Amazon. URL chúng ta sẽ thu thập là:
https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_’+str(pageNo)+’?ie=UTF8&pg=’+str(pageNo)
Vì chúng ta cần truy cập vào tất cả các trang nên chúng ta sẽ lặp qua từng trang để lấy tập dữ liệu cần thiết.
Để kết nối với URL và lấy nội dung HTML, cần có những điều sau:
Một số thẻ quan trọng mà dữ liệu quan trọng của chúng tôi sẽ nằm trong đó là:
Nếu bạn kiểm tra trang này, bạn sẽ thấy thẻ cha và các phần tử tương ứng.
Nếu bạn muốn kiểm tra một thuộc tính cụ thể, hãy đến từng thuộc tính và kiểm tra chúng. Bạn sẽ tìm thấy một số thuộc tính quan trọng cho tác giả, tên sách, xếp hạng, giá, khách hàng đánh giá.
Trong mã của chúng tôi, chúng tôi sẽ sử dụng các câu lệnh if-else lồng nhau để áp dụng các phát hiện bổ sung cho những tác giả chưa đăng ký với Amazon.
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
Điều này sẽ thực hiện các chức năng sau:
đối với i trong phạm vi ( 1 , no_pages+ 1 ): kết quả .append ( get_data (i)) flatten = lambda l: [mục cho danh sách con trong l đối với mục trong danh sách con] df = pd .DataFrame ( flatten (kết quả), cột = [ 'Tên sách' , 'Tác giả' , 'Xếp hạng' , 'Khách hàng đánh giá' , 'Giá' ]) df .to_csv ( 'amazon_products.csv' , index=False, mã hóa= 'utf-8' )
Bây giờ chúng ta sẽ tải tệp csv,
df = pd.read_csv( "amazon_products.csv" ) df.shape
Hình dạng của khung dữ liệu cho thấy có 100 hàng và 5 cột trong tệp CSV.
Chúng ta hãy xem 5 hàng của tập dữ liệu,
df .head( 61 )
Bây giờ chúng ta sẽ thực hiện một số xử lý trước trên các cột xếp hạng, customers_rated và giá.
df [ 'Xếp hạng' ] = df [ 'Xếp hạng' ] .apply (lambda x: x .split () [0] ) df [ 'Xếp hạng' ] = pd .to_numeric (df [ 'Xếp hạng' ] ) df [ "Giá" ] = df [ "Giá" ] .str .replace ( '₹' , '' ) df [ "Giá " ] = df [ "Giá" ] .str .replace ( ',' , '' ) df [ 'Giá' ] = df [ 'Giá' ] .apply (lambda x: x .split ( '.' ) [0] ) df [ 'Giá' ] = df [ 'Giá' ] .astype (int) df [ "Khách hàng_Xếp hạng" ] = df [ "Khách hàng_Xếp hạng" ] .str .replace ( ',' , '' ) df [ 'Khách hàng được đánh giá' ] = pd .to_numeric (df [ 'Khách hàng được đánh giá' ] , lỗi = 'bỏ qua' ) df .head ()
Nếu chúng ta xem xét các loại khung dữ liệu mà chúng ta nhận được,
Có một số thông tin không đầy đủ trong kết quả ở trên. Đầu tiên chúng ta sẽ đếm số NaN rồi loại bỏ chúng.
df. thay thế (str( 0 ), np. nan , inplace= True ) df. thay thế ( 0 , np. nan , inplace= True ) count_nan = len(df) - df. count () count_nan
df = df.dropna()
Bây giờ chúng ta sẽ biết tất cả các tác giả có cuốn sách có giá cao nhất. Chúng ta sẽ làm quen với 20 tác giả hàng đầu trong số họ.
dữ liệu = dữ liệu .sort_values([' Đánh giá '], trục = 0, tăng dần = Sai )[: 15] dữ liệu
Bây giờ chúng ta sẽ thấy những cuốn sách và tác giả được đánh giá cao nhất theo đánh giá của khách hàng. Chúng tôi sẽ lọc ra những tác giả và cuốn sách có ít hơn 1000 đánh giá, để chúng tôi có được những tác giả nổi tiếng nhất.
dữ liệu = df[df[' Customers_Rated' ] > 1000] dữ liệu = dữ liệu .sort_values([' Rating '], trục =0, tăng dần = False )[:15] dữ liệu
Hãy cùng hình dung những cuốn sách được đánh giá cao nhất,
p = figure( x_range =data.iloc[:,0], plot_width =800, plot_height =600, title = "Những cuốn sách được đánh giá cao nhất với hơn 1000 lượt đánh giá của khách hàng" , toolbar_location =Không có, tools = "" ) p.vbar( x =data.iloc[:,0], top =data.iloc[:,2], width =0.9) p.xgrid.grid_line_color = Không có p.y_range.start = 0 p.xaxis.major_label_orientation = math.pi/2 show(p)
Xếp hạng càng cao thì độ tin cậy của khách hàng càng lớn. Vì vậy, sẽ thuyết phục và đáng tin hơn nếu chúng ta thêm các tác giả và cuốn sách được khách hàng đánh giá cao nhất.
từ bokeh .transform import factor_cmap từ bokeh .models import Legend từ bokeh .palettes import Dark2_5 as palette import itertools từ bokeh .palettes import d3 #colors có danh sách các màu có thể được sử dụng trong các biểu đồ colors = itertools .cycle (palette) palette = d3 [ 'Category20' ] [20] index_cmap = factor_cmap ( 'Tác giả' , palette=palette, factors=data [ "Tác giả" ] ) p = figure (plot_width= 700 , plot_height= 700 , title = "Tác giả hàng đầu: Xếp hạng so với Khách hàng đánh giá" ) p .scatter ( 'Xếp hạng' , 'Khách hàng đánh giá' ,source=data,fill_alpha= 0.6 , fill_color=index_cmap,size= 20 ,legend= 'Tác giả' ) p .xaxis .axis_label = 'XẾP HẠNG' p .yaxis .axis_label = 'KHÁCH HÀNG ĐÃ ĐÁNH GIÁ' p .legend .location = 'top_left' hiển thị (p)
Trong bài viết này, chúng ta đã thấy web scraping là gì bằng cách sử dụng một trường hợp sử dụng rất quan trọng là trích xuất dữ liệu từ Amazon. Chúng tôi không chỉ trích xuất dữ liệu từ các trang Amazon khác nhau mà còn trực quan hóa dữ liệu bằng các thư viện Python khác nhau. Bài viết này là một bài viết nâng cao và có thể khó hiểu đối với những người mới làm quen với web scraping và trực quan hóa dữ liệu. Đối với họ, tôi khuyên bạn nên tham khảo các bài viết về gói khởi động có sẵn tại ProxyScrape . Web scraping là một kỹ thuật rất hữu ích có thể thúc đẩy doanh nghiệp của bạn. Ngoài ra còn có một số công cụ trả phí tuyệt vời có sẵn trên thị trường, nhưng tại sao phải trả tiền cho chúng khi bạn có thể viết mã cho trình scraper của riêng mình. Mã chúng tôi đã viết ở trên có thể không hoạt động với mọi trang web vì cấu trúc trang có thể khác nhau. Nhưng nếu bạn đã hiểu các khái niệm trên, thì không có rào cản nào đối với bạn khi trích xuất bất kỳ trang web nào bằng cách sửa đổi mã theo cấu trúc của nó. Tôi hy vọng bài viết này thú vị đối với độc giả. Vậy là hết. Hẹn gặp lại các bạn trong những bài viết tiếp theo!