-
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.
-
Phân tích chiến lược Chiến lược thu thập dữ liệu bao gồm:
-
Truy cập trang chủ JD.
-
Nhập từ khóa tìm kiếm, chuyển đến trang cần thu thập.
-
Trích xuất thông tin sản phẩm từ trang.
-
Cuộn trang để tải thêm dữ liệu và tiếp tục thu thập thông tin.
-
Thực hiện mã nguồn
-
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ị
- 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
- 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
- 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}")