Cách quét web Amazon bằng Python

trăn, cạo, May-19-20215 phút đọc

Web scraping là nghệ thuật trích xuất dữ liệu từ internet và sử dụng nó cho các mục đích có ý nghĩa. Nó cũng đôi khi đượ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, nó cũng giống như sao chép dữ liệu từ internet và lưu trữ cục bộ. Tuy nhiên, đó là một quá trình thủ công. Quét web

Web scraping là nghệ thuật trích xuất dữ liệu từ internet và sử dụng nó cho các mục đích có ý nghĩa. Nó cũng đôi khi đượ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, nó cũng giống như sao chép dữ liệu từ internet và lưu trữ cục bộ. Tuy nhiên, đó là một quá trình thủ công. Web scraping là một quá 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 tìm nạp dữ liệu theo cách tự động. Người ta có thể coi internet là đất và dữ liệu được làm giàu như dầu mới, trong khi quét web 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 trong đó quét web có thể giúp ích rất nhiều. Trong bài viết này, chúng tôi sẽ cạo dữ liệu từ Amazon bằng Python. Cuối cùng, chúng tôi cũng sẽ phân tích dữ liệu được thu thập và xem tầm quan trọng của nó đối với bất kỳ người bình thường, nhà khoa học dữ liệu hoặc người nào điều hành một cửa hàng thương mại điện tử.

Chỉ cần đề phòng một chút: Nếu bạn chưa quen với Python và quét web, bài viết này có thể khó hiểu hơn một chút. 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 và sau đó đến với cái này.

Hãy bắt đầu với mã.

Nhập thư viện

Trước hết, chúng tôi sẽ nhập tất cả các thư viện cần thiết cần thiết cho mã. Các thư viện này sẽ được sử dụng để cạo và trực quan hóa dữ liệu. Nếu bạn muốn biết chi tiết của từng cái, bạn có thể truy cập tài liệu chính thức của họ.

Nhập khẩu gấu trúc dưới dạng PD
Nhập numpy dưới dạng NP
Nhập matplotlib.pyplot dưới dạng plt
Nhập khẩu Seaborn dưới dạng SNS
%matplotlib nội tuyến
Nhập khẩu lại
Thời gian nhập khẩu
từ datetime nhập datetime
Nhập matplotlib.dates dưới dạng mdates
Nhập matplotlib.ticker làm ticker
từ urllib.request import urlopen:
từ bs4 nhập khẩu BeautifulSoup
Yêu cầu nhập khẩu

Thu thập dữ liệu Amazon

Bây giờ chúng tôi 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ẽ cạo là:

https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_’+str(pageNo)+’?ie=UTF8&pg=’+str(pageNo)

Vì chúng tôi cần truy cập tất cả các trang, chúng tôi sẽ lặp qua từng trang để có được tập dữ liệu cần thiết. 

Để kết nối với URL và tìm nạp nội dung HTML, cần phải có những điều sau,

  • get_data: hàm này sẽ được sử dụng để nhập trang no làm đối số.
  • Tác nhân người dùng: Nó sẽ giúp bỏ qua việc phát hiện.
  • Chúng ta sẽ chỉ định URL cho request.get và truyền user-agent làm đối số.
  • Trích xuất nội dung từ requests.get.
  • Cạo trang được chỉ định và gán nó cho biến súp.

Một số thẻ quan trọng mà dữ liệu quan trọng của chúng tôi sẽ nằm là,

  • Tên sách
  • Tác giả
  • Đánh giá
  • Khách hàng đánh giá
  • Giá

Nếu bạn kiểm tra trang đã cho, bạn sẽ thấy thẻ mẹ và các yếu tố tương ứng của nó.

 Nếu bạn muốn kiểm tra một thuộc tính cụ thể, hãy đi đế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á cả, khách hàng được xếp hạng. 

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ả không đă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,

  • Thu thập dữ liệu bên trong một vòng lặp for.
  • Vòng lặp sẽ lặp lại trên mỗi trang, bắt đầu từ 1 đến trang + 1.
  • Trước tiên, chúng ta cần làm phẳng danh sách và sau đó chuyển nó vào DataFrame.
  • Cuối cùng chúng ta sẽ lưu khung dữ liệu dưới dạng tệp CSV.
Đối với i trong phạm vi(1, no_pages+1):
    results.append(get_data(i))
flatten = lambda l: [mục cho danh sách con trong l cho mục trong danh sách con]
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

Bây giờ chúng ta sẽ tải tệp csv,

df = pd.read_csv("amazon_products.csv")
df.hình dạng

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.

Hãy xem 5 hàng của tập dữ liệu,

df.head(61)

Bây giờ chúng tôi sẽ thực hiện một số xử lý sơ bộ về xếp hạng, customers_rated và cột giá.

  • Vì xếp hạng nằm ngoài 5, chúng tôi sẽ xóa phần bổ sung khỏi nó.
  • Chúng tôi sẽ xóa dấu phẩy khỏi cột customer_rated.
  • Trong cột giá, chúng tôi sẽ xóa biểu tượng rupee và chia nó theo dấu chấm.
  • Cuối cùng, chúng ta sẽ chuyển đổi cả ba cột thành số nguyên hoặc float.
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["Customers_Rated"] = df["Customers_Rated"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

Nếu chúng ta có một cái nhìn về các loại khung dữ liệu chúng ta nhận được,

Có một số thông tin chưa đầy đủ trong đầu ra ở trên. Đầu tiên chúng ta sẽ đếm số lượng NaNs và sau đó thả chúng.

Df. Thay thế (str (0), np.nan, inplace = True)
Df. Thay thế(0, np.nan, inplace = True)
count_nan = len(df) - df. đếm()
count_nan
df = df.dropna()

Sách có giá cao nhất của các tác giả

Bây giờ chúng ta sẽ làm quen với tất cả các tác giả với cuốn sách có giá cao nhất. Chúng ta sẽ làm quen với top 20 từ họ.

data = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
data

Sách được xếp hạng hàng đầu

Bây giờ chúng ta sẽ thấy những cuốn sách và tác giả được xếp hạng hàng đầu liên quan đến xếp hạng của khách hàng. Chúng tôi sẽ lọc ra những tác giả và sách có ít hơn 1000 đánh giá, vì vậy chúng tôi có được những tác giả nổi tiếng nhất.

data = df[df['Customers_Rated'] > 1000]
data = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
data

Hãy hình dung những cuốn sách được xếp hạng hàng đầu,

p = figure(x_range=data.iloc[:,0], plot_width=800, plot_height=600, title="Sách được xếp hạng hàng đầu với hơn 1000 xếp hạng của khách hàng", toolbar_location=None, 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 = toán học.pi/2
Hiển thị (p)

Tác giả và sách được khách hàng đánh giá cao nhất

Xếp hạng càng nhiều, sự tin tưởng của khách hàng càng tốt. Vì vậy, sẽ thuyết phục và đáng tin cậy hơn nếu chúng ta thêm các tác giả và sách được khách hàng đánh giá cao nhất.

từ Bokeh.Transform Nhập factor_cmap
từ bokeh.models nhập Legend
từ bokeh.palettes nhập Dark2_5 dưới dạng bảng màu
Nhập IterTools
từ bokeh.palettes nhập d3
#colorsmột danh sách các màu sắc có thể được sử dụng trong các ô
colors = itertools.cycle (bảng màu)
 
bảng màu = d3['Category20'][20]
index_cmap = factor_cmap('Tác giả', bảng màu = bảng màu,
                         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 được xếp hạng")
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 = 'KHÁCH HÀNG ĐÃ ĐÁNH GIÁ'P.LEGEND.LOCATION =  'top_left'show(p)

Tổng kết

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 để 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 cấp cao và có thể khó hiểu đối với những người mới làm quen với việc quét web và trực quan hóa dữ liệu. Đối với họ, tôi khuyên bạn nên đi đến các bài viết 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 công cụ cạp của riêng mình. Mã chúng tôi đã viết ở trên có thể không hoạt động cho 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ó trở ngại nào để bạn cạo 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ị cho độc giả. Đó là tất cả. Hẹn gặp lại các bạn trong những lần tiếp theo!