HomeLập trìnhPythonQuét web bằng...

Quét web bằng Python – Cách cạo trang web thương mại điện tử bằng Beautiful Soup và Pandas


Trong bài đăng này, chúng tôi sẽ cạo một trang web thương mại điện tử. Chúng tôi sẽ vào từng trang sản phẩm riêng lẻ và lấy thông tin của chúng tôi từ đó. Đây là trang web mà chúng ta sẽ tìm kiếm – đó là một cửa hàng trực tuyến bán rượu whisky.

Hãy nhớ kiểm tra các robots.txt trước khi cạo bất kỳ trang web nào. Bạn phải nhớ rằng bạn có thể khiến một trang web ngừng hoạt động một cách không cần thiết và có thể gây hại cho các dịch vụ của họ. Vì vậy, vui lòng không làm ngập máy chủ của họ với các yêu cầu tìm kiếm.

nhật bản

Tôi đã đi đến một phần phụ của trang web ở đây và có vẻ như có khá nhiều sự lựa chọn. Và nếu bạn muốn tìm hiểu xếp hạng của người dùng cho mọi sản phẩm, thì bạn phải mở từng trang sản phẩm để lấy xếp hạng (bạn không thể tìm thấy chúng trên trang chính).

nhật bản2

Vì vậy, chúng tôi sẽ nhận được một danh sách tất cả các liên kết cho từng sản phẩm từ tất cả năm trang. Sau đó, chúng tôi sẽ đi vào từng sản phẩm riêng lẻ và thu thập dữ liệu mong muốn của chúng tôi.

Nhưng một số trong số họ không có đánh giá. Thay vào đó, trong những trường hợp đó, chúng tôi sẽ đi vào từng sản phẩm và nhận xung quanh văn bản cũng vậy. Đi nào!

Thiết lập của chúng tôi khá đơn giản. Chỉ cần tạo một thư mục và cài đặt Beautiful Soup, pandas và các yêu cầu. Để tạo một thư mục và cài đặt các thư viện, hãy nhập các lệnh dưới đây. Tôi giả định rằng bạn đã cài đặt Python 3.x.

mkdir scraper 
pip install beautifulsoup4 
pip install requests
pip install pandas

Bây giờ, hãy tạo một tệp bên trong thư mục đó và đặt tên cho nó là bất cứ thứ gì bạn thích. Tôi đang sử dụng tên scraper.py. Chúng tôi sẽ nhập các yêu cầu, gấu trúc và bs4.

import requests
from bs4 import BeautifulSoup
import pandas as pd

Bây giờ, chúng tôi sẽ đặt URL cơ sở của trang chính vì chúng tôi sẽ cần điều đó khi xây dựng URL cho từng sản phẩm riêng lẻ.

Đọc thêm  Giới thiệu đơn giản về Phát triển theo hướng thử nghiệm với Python

Ngoài ra, chúng tôi sẽ gửi tác nhân người dùng cho mọi yêu cầu HTTP, bởi vì nếu bạn thực hiện yêu cầu GET bằng cách sử dụng yêu cầu thì theo mặc định, tác nhân người dùng là con trăn mà có thể bị chặn.

Vì vậy, để ghi đè lên điều đó, chúng tôi sẽ khai báo một biến sẽ lưu trữ tác nhân người dùng của chúng tôi.

baseurl = "https://www.thewhiskyexchange.com"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

Bây giờ chúng ta cần điều tra trang để có thể tìm ra vị trí của các liên kết và cách lấy chúng. Bạn phải mở công cụ dành cho nhà phát triển Chrome bằng cách sử dụng kiểm tra (Command+Option+C).

nhật bản3

Chúng tôi sẽ viết một tập lệnh để xem qua từng cái trong số này và tạo một URL cho chúng tôi. Để làm điều đó, trước tiên chúng ta cần thực hiện cuộc gọi HTTP. Sau đó, chúng tôi sẽ giải nén li yếu tố bằng cách sử dụng BeautifulSoup.

k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky').text
soup=BeautifulSoup(k,'html.parser')
productlist = soup.find_all("li",{"class":"product-grid__item"})
print(productlist)

Chỉ để kiểm tra xem chúng tôi có đang đi đúng hướng hay không, chúng tôi đã in danh sách đầy đủ.

nhật bản4
đầu ra

Tiếp theo, lấy HTML cho các mục trên trang này. Bây giờ, bên trong mỗi danh sách này có một liên kết đến trang sản phẩm riêng lẻ. Chúng tôi sẽ viết một kịch bản để loại bỏ tất cả các liên kết đó khỏi danh sách sản phẩm.

productlinks = []
for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')                 productlinks.append(baseurl + link)

Ở đây đầu tiên chúng tôi đã khai báo một danh sách trống được gọi là productlinks. Sau đó, chúng tôi đã sử dụng một cho vòng lặp để đạt được mỗi danh sách sản phẩm phần tử để trích xuất liên kết. Chúng tôi đã sử dụng .được() hàm lấy giá trị của thuộc tính href. Sau khi trích xuất liên kết, chúng tôi lưu trữ mọi liên kết trong danh sách productlinks. Vì chúng tôi phải tạo một URL hợp pháp nên chúng tôi đã thêm baseurl vào liên kết.

Đọc thêm  Nguyên tắc cơ bản về Python cho Khoa học dữ liệu
nhật bản6
đầu ra

Như chúng ta đã thảo luận trước đó, chúng ta phải bao gồm tất cả năm trang của trang web. Để làm như vậy, chúng tôi sẽ giới thiệu một vòng lặp for trước khi thực hiện cuộc gọi HTTP. Vì có 5 trang nên chúng tôi sẽ chạy vòng lặp từ 1 đến 6. Ngoài ra, hãy đảm bảo thay đổi URL mục tiêu.

productlinks = []
for x in range(1,6):  
 k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky?pg={}&psize=24&sort=pasc'.format(x)).text  
 soup=BeautifulSoup(k,'html.parser')  
 productlist = soup.find_all("li",{"class":"product-grid__item"})
 
    for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')
        productlinks.append(baseurl + link)

Điều này sẽ cung cấp cho chúng tôi tất cả các liên kết có sẵn trên trang web. Bây giờ để xác nhận, bạn có thể in chiều dài của liên kết sản phẩm. Chúng ta sẽ nhận được tổng cộng 97 liên kết.

nhật bản7
đầu ra

Giờ đây, chúng tôi có thể lặp qua từng liên kết này để trích xuất thông tin sản phẩm từ mỗi trang và sau đó lưu trữ thông tin đó trong một danh sách hoặc từ điển khác.

Tiếp theo, chúng ta sẽ phân tích mẫu hiển thị thông tin trên trang sản phẩm. Chúng tôi sẽ trích xuất tên, giá, xếp hạng và văn bản giới thiệu.

nhật bản8

Các Tên nằm dưới một thẻ h1các xung quanh văn bản nằm dưới thẻ div, giá dưới một thẻ pXếp hạng nằm dưới thẻ span. Bây giờ, hãy giải nén chúng.

data=[]
for link in productlinks:
    f = requests.get(link,headers=headers).text
    hun=BeautifulSoup(f,'html.parser')

    try:
        price=hun.find("p",{"class":"product-action__price"}).text.replace('\n',"")
    except:
        price = None

    try:
        about=hun.find("div",{"class":"product-main__description"}).text.replace('\n',"")
    except:
        about=None

    try:
        rating = hun.find("div",{"class":"review-overview"}).text.replace('\n',"")
    except:
        rating=None

    try:
        name=hun.find("h1",{"class":"product-main__name"}).text.replace('\n',"")
    except:
        name=None

    whisky = {"name":name,"price":price,"rating":rating,"about":about}

    data.append(whisky)

Ở đây, mọi thứ khá đơn giản. Chúng tôi đã bắt đầu một vòng lặp for để lặp qua từng liên kết riêng lẻ của productlinks. Chúng tôi sẽ thực hiện cuộc gọi HTTP GET tới mọi liên kết và sau đó giải nén giá, tên, đánh giáxung quanh chữ.

Đọc thêm  Giải thích về Ghi nhớ, Đệ quy và Vòng lặp For trong Python

Chúng tôi đang sử dụng cố gắngngoại trừ để tránh bất kỳ lỗi nào nếu không tìm thấy bất kỳ phần tử nào. Sử dụng thay thế chức năng loại bỏ tất cả các ngắt dòng hoặc các chuỗi không cần thiết mà chúng tôi có cùng với thông tin được trích xuất.

Chúng tôi đã tạo một từ điển với tên whisky nơi chúng tôi sẽ lưu trữ tất cả các thông tin trích xuất. Cuối cùng, chúng tôi đang lưu trữ từ điển trong danh sách dữ liệu.

Bây giờ trước khi in dữ liệu, chúng ta sẽ làm cho dữ liệu dễ nhìn hơn. Ở đây chúng ta sẽ sử dụng gấu trúc. Tôi thích sử dụng gấu trúc!

df = pd.DataFrame(data)

print(df)
nhật9
đầu ra

Đây là mã hoàn chỉnh cho Scraper

import requests
from bs4 import BeautifulSoup
import pandas as pd

baseurl = "https://www.thewhiskyexchange.com"

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
productlinks = []
t={}
data=[]
c=0
for x in range(1,6):
    k = requests.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky?pg={}&psize=24&sort=pasc'.format(x)).text
    soup=BeautifulSoup(k,'html.parser')
    productlist = soup.find_all("li",{"class":"product-grid__item"})


    for product in productlist:
        link = product.find("a",{"class":"product-card"}).get('href')
        productlinks.append(baseurl + link)


for link in productlinks:
    f = requests.get(link,headers=headers).text
    hun=BeautifulSoup(f,'html.parser')

    try:
        price=hun.find("p",{"class":"product-action__price"}).text.replace('\n',"")
    except:
        price = None

    try:
        about=hun.find("div",{"class":"product-main__description"}).text.replace('\n',"")
    except:
        about=None

    try:
        rating = hun.find("div",{"class":"review-overview"}).text.replace('\n',"")
    except:
        rating=None

    try:
        name=hun.find("h1",{"class":"product-main__name"}).text.replace('\n',"")
    except:
        name=None

    whisky = {"name":name,"price":price,"rating":rating,"about":about}

    data.append(whisky)
    c=c+1
    print("completed",c)

df = pd.DataFrame(data)

print(df)

Phần kết luận

Cuối cùng, chúng tôi đã thu thập được tất cả thông tin từ mọi trang của trang web. Tương tự, bạn có thể cạo văn bản khác từ trang web này. Như một bài tập, bạn có thể thử cạo trang web này. Nếu bạn có bất kỳ câu hỏi cho tôi, xin vui lòng dm tôi trên của tôi xử lý twitter.





Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status