Đánh giá và thực hiện công cụ tự động hóa để thu thập thông tin sản phẩm từ JD

  1. Xác định yêu cầu Xác định các sản phẩm trên JD, thu thập tên và giá của mỗi sản phẩm.

  2. Phân tích chiến lược Chiến lược thu thập dữ liệu bao gồm:

  3. Truy cập trang chủ JD.

  4. Nhập từ khóa tìm kiếm, chuyển đến trang cần thu thập.

  5. Trích xuất thông tin sản phẩm từ trang.

  6. Cuộn trang để tải thêm dữ liệu và tiếp tục thu thập thông tin.

  7. Thực hiện mã nguồn

  8. Truy cập trang và nhập từ khóa tìm kiếm:

from DrissionPage import ChromiumPage

trang = ChromiumPage()
trang.get('https://www.jd.com')

# Thực hiện tìm kiếm
o_input = trang.ele('#key')
o_input.input('Huawei\n')  # Nhập từ khóa tìm kiếm và nhấn Enter
trang.wait.ele_displayed('.gl-item', timeout=10)  # Chờ cho danh sách sản phẩm hiển thị
  1. Trích xuất thông tin sản phẩm:
  • Các sản phẩm được hiển thị trong thẻ <ul><li class='gl-item'></li></ul>.
  • Sử dụng DrissionPage để chọn tất cả các phần tử có class gl-item.
def lay_thong_tin():
    """Lấy thông tin sản phẩm từ trang hiện tại"""
    san_phams = trang.eles(".gl-item")
    danh_sach_du_lieu = []

    for sp in san_phams:
        try:
            # Tên sản phẩm
            ten_sp = sp.ele('css:.p-name em', timeout=0)
            ten = ten_sp.text if ten_sp else 'Không xác định'

            # Giá sản phẩm
            gia_sp = sp.ele('css:.p-price i', timeout=0)
            gia = gia_sp.text if gia_sp else 'Không xác định'

            # Tên cửa hàng
            ten_cua_hang = sp.ele('css:.p-shop a', timeout=0)
            cua_hang = ten_cua_hang.attr('title') if ten_cua_hang else 'Không xác định'

            # Số lượng đánh giá
            so_luong_danh_gia = sp.ele('css:.p-commit strong a', timeout=0)
            text_danh_gia = so_luong_danh_gia.text if so_luong_danh_gia else '0'
            danh_gia = re.search(r'\d+', text_danh_gia).group() if text_danh_gia else '0'

            # Liên kết sản phẩm
            lien_ket = sp.ele('css:.p-img a', timeout=0)
            link = lien_ket.attr('href') if lien_ket else 'Không xác định'
            if link.startswith('//'):
                link = f'https:{link}'

            danh_sach_du_lieu.append(
                {"Tên sản phẩm": ten, "Giá sản phẩm": gia, "Cửa hàng": cua_hang, "Đánh giá": danh_gia, "Liên kết": link})

        except Exception as e:
            print(f"Lỗi khi lấy thông tin sản phẩm: {e}")
            continue

    return danh_sach_du_lieu
  1. Cuộn trang để tải thêm dữ liệu:
import time
import random

def thu_thap_du_lieu(so_lan_cuon):
    """Thực hiện thu thập dữ liệu"""
    tong_so_san_pham = 0
    for _ in range(so_lan_cuon):
        # Lấy thông tin sản phẩm từ trang hiện tại
        du_lieu_san_pham = lay_thong_tin()
        if du_lieu_san_pham:
            tong_so_san_pham += len(du_lieu_san_pham)
            r.add_data(du_lieu_san_pham)  # Thêm dữ liệu vào recorder
            print(f'Đã thu thập {len(du_lieu_san_pham)} sản phẩm')

        # Cuộn trang để tải thêm dữ liệu
        trang.scroll.to_bottom()
        time.sleep(random.uniform(5, 10))  # Ngừng ngẫu nhiên để tránh bị chặn
  1. Mã nguồn hoàn chỉnh
import time
import random
import pandas as pd
from DrissionPage import ChromiumPage
from DataRecorder import Recorder
import re

# Khởi tạo DataRecorder
thoi_gian_hien_tai = time.localtime()
duong_dan_file = f'Thu_thap_du_lieu-{time.strftime("%Y-%m-%d %H%M%S", thoi_gian_hien_tai)}.xlsx'
r = Recorder(path=duong_dan_file, cache_size=30)

def lay_thong_tin():
    """Lấy thông tin sản phẩm từ trang hiện tại"""
    san_phams = trang.eles(".gl-item")
    danh_sach_du_lieu = []

    for sp in san_phams:
        try:
            # Tên sản phẩm
            ten_sp = sp.ele('css:.p-name em', timeout=0)
            ten = ten_sp.text if ten_sp else 'Không xác định'

            # Giá sản phẩm
            gia_sp = sp.ele('css:.p-price i', timeout=0)
            gia = gia_sp.text if gia_sp else 'Không xác định'

            # Tên cửa hàng
            ten_cua_hang = sp.ele('css:.p-shop a', timeout=0)
            cua_hang = ten_cua_hang.attr('title') if ten_cua_hang else 'Không xác định'

            # Số lượng đánh giá
            so_luong_danh_gia = sp.ele('css:.p-commit strong a', timeout=0)
            text_danh_gia = so_luong_danh_gia.text if so_luong_danh_gia else '0'
            danh_gia = re.search(r'\d+', text_danh_gia).group() if text_danh_gia else '0'

            # Liên kết sản phẩm
            lien_ket = sp.ele('css:.p-img a', timeout=0)
            link = lien_ket.attr('href') if lien_ket else 'Không xác định'
            if link.startswith('//'):
                link = f'https:{link}'

            danh_sach_du_lieu.append(
                {"Tên sản phẩm": ten, "Giá sản phẩm": gia, "Cửa hàng": cua_hang, "Đánh giá": danh_gia, "Liên kết": link})

        except Exception as e:
            print(f"Lỗi khi lấy thông tin sản phẩm: {e}")
            continue

    return danh_sach_du_lieu

def thu_thap_du_lieu(so_lan_cuon):
    """Thực hiện thu thập dữ liệu"""
    tong_so_san_pham = 0
    for _ in range(so_lan_cuon):
        # Lấy thông tin sản phẩm từ trang hiện tại
        du_lieu_san_pham = lay_thong_tin()
        if du_lieu_san_pham:
            tong_so_san_pham += len(du_lieu_san_pham)
            r.add_data(du_lieu_san_pham)  # Thêm dữ liệu vào recorder
            print(f'Đã thu thập {len(du_lieu_san_pham)} sản phẩm')

        # Cuộn trang để tải thêm dữ liệu
        trang.scroll.to_bottom()
        time.sleep(random.uniform(5, 10))  # Ngừng ngẫu nhiên để tránh bị chặn

if __name__ == '__main__':
    trang = ChromiumPage()
    trang.get('https://www.jd.com')

    # Thực hiện tìm kiếm
    o_input = trang.ele('#key')
    o_input.input('Huawei\n')  # Nhập từ khóa tìm kiếm và nhấn Enter
    trang.wait.ele_displayed('.gl-item', timeout=10)  # Chờ cho danh sách sản phẩm hiển thị

    # Bắt đầu thu thập
    thu_thap_du_lieu(2)

    # Lưu dữ liệu (DataRecorder sẽ tự động lưu, bước này để đảm bảo dữ liệu được ghi vào file)
    r.record()

    print(f"Tổng số sản phẩm đã thu thập: {tong_so_san_pham}")

Thẻ: DrissionPage ChromiumPage DataRecorder web scraping python

Đăng vào ngày 23 tháng 5 lúc 19:03