Web Scraping với LLaMA 3: Chuyển đổi bất kỳ trang web nào thành JSON có cấu trúc (Hướng dẫn 2025)

Expert Network Defense Engineer
Giới thiệu: Sự Tiến Hóa của Web Scraping với AI
Web scraping, việc tự động trích xuất dữ liệu từ các trang web, từ lâu đã là nền tảng cho các doanh nghiệp và nhà nghiên cứu mong muốn thu thập thông tin, theo dõi thị trường, và xây dựng các tập dữ liệu. Tuy nhiên, bối cảnh của web scraping đang liên tục phát triển, chủ yếu do các biện pháp chống bot ngày càng tinh vi được triển khai bởi các trang web. Các phương pháp scraping truyền thống, phụ thuộc vào các bộ chọn tĩnh như XPath hoặc CSS, nổi tiếng là mong manh. Những thay đổi nhỏ trong bố cục trang web hoặc cập nhật các phương thức phòng chống bot có thể làm cho toàn bộ hạ tầng scraping trở nên lỗi thời, dẫn đến chi phí bảo trì đáng kể và mất dữ liệu.
Sự ra đời của các mô hình ngôn ngữ lớn (LLMs) như LLaMA 3 của Meta đánh dấu một sự chuyển mình quan trọng trong lĩnh vực này. LLaMA 3, với khả năng đáng chú ý trong việc hiểu và xử lý ngôn ngữ tự nhiên, cung cấp một phương pháp trích xuất dữ liệu linh hoạt và thông minh hơn. Khác với các trình scraping thông thường hoạt động theo các quy tắc cứng nhắc, LLaMA 3 có thể hiểu ý nghĩa ngữ cảnh của nội dung web, giống như cách con người làm. Khả năng này cho phép nó thích nghi với những biến đổi trong cấu trúc trang web và trích xuất thông tin liên quan ngay cả khi bố cục thay đổi, khiến nó trở thành một công cụ quý giá cho những thử thách web scraping hiện đại.
Hướng dẫn toàn diện này cho năm 2025 sẽ đi sâu vào việc áp dụng LLaMA 3 cho web scraping tiên tiến, chuyển đổi HTML thô thành JSON sạch sẽ và có cấu trúc. Chúng ta sẽ khám phá các nguyên tắc cơ bản, các bước triển khai thực tế, và quan trọng là cách vượt qua những thách thức chống bot khó khăn nhất bằng cách tích hợp các giải pháp tiên tiến như Scrapeless Scraping Browser. Đến cuối hướng dẫn này, bạn sẽ có kiến thức để xây dựng các trình scraping web mạnh mẽ, được hỗ trợ bởi AI, vừa hiệu quả vừa bền bỉ trước các biện pháp phòng thủ web hiện nay.
Tại sao LLaMA 3 là một Thay Đổi Cục Diện cho Web Scraping
LLaMA 3, được phát hành vào tháng 4 năm 2024, là mô hình ngôn ngữ lớn mở của Meta với trọng số mạnh mẽ, có sẵn với nhiều kích thước từ 8B đến 405B tham số. Những phiên bản tiếp theo (LLaMA 3.1, 3.2 và 3.3) đã mang lại những cải tiến đáng kể về hiệu suất, hiểu biết ngữ cảnh và khả năng lý luận. Những tiến bộ này khiến LLaMA 3 rất phù hợp cho web scraping vì nhiều lý do thuyết phục:
1. Hiểu Biết Ngữ Cảnh và Trích Xuất Ngữ Nghĩa
Các trình scraping web truyền thống vốn dĩ mong manh vì chúng phụ thuộc vào các yếu tố cấu trúc chính xác của một trang web. Nếu tên lớp div
thay đổi hoặc vị trí của một phần tử bị xê dịch, trình scraping sẽ bị hỏng. Tuy nhiên, LLaMA 3 hoạt động ở một cấp độ trừu tượng cao hơn. Nó có thể hiểu nghĩa của nội dung, bất kể cấu trúc HTML dưới nền của nó. Ví dụ, nó có thể nhận diện tiêu đề sản phẩm, giá cả, hoặc mô tả dựa trên các dấu hiệu ngữ nghĩa, ngay cả khi các thẻ HTML xung quanh chúng thay đổi giữa các trang khác nhau hoặc sau một cuộc thiết kế lại trang web. Sự hiểu biết ngữ cảnh này giảm đáng kể tính mong manh của các trình scraping và nhu cầu bảo trì thường xuyên.
2. Khả Năng Chịu Đựng Tốt Hơn Trước Những Thay Đổi của Trang Web
Các trang web là những thực thể động, thường xuyên cập nhật thiết kế, nội dung và mã nguồn cơ bản của chúng. Đối với các trình scraping truyền thống, mỗi bản cập nhật có thể là một thay đổi gây hỏng hóc. Khả năng mà LLaMA 3 có thể giải thích nội dung theo ngữ nghĩa có nghĩa là nó có khả năng chịu đựng tốt hơn trước những thay đổi này. Nó có thể tiếp tục trích xuất dữ liệu một cách chính xác ngay cả khi các phần tử được sắp xếp lại, các phần mới được thêm vào, hoặc các điều chỉnh phong cách nhỏ được thực hiện. Khả năng chịu đựng này chuyển đổi trực tiếp thành chi phí vận hành giảm và dòng dữ liệu ổn định hơn.
3. Xử Lý Nội Dung Động và Các Trang Được Render Bằng JavaScript
Các trang web hiện đại phụ thuộc rất nhiều vào JavaScript để render nội dung một cách động. Điều này tạo ra một thách thức lớn cho các trình scraping dựa trên HTTP đơn giản. Trong khi các trình duyệt không có giao diện như Selenium có thể thực thi JavaScript, việc trích xuất dữ liệu cụ thể từ DOM được render vẫn yêu cầu các bộ chọn chính xác. LLaMA 3, khi kết hợp với một trình duyệt không có giao diện, có thể xử lý nội dung HTML hoàn toàn được render và thông minh trích xuất thông tin mong muốn, bỏ qua những phức tạp của việc render nội dung động và các tương tác phức tạp của JavaScript.
4. Hiệu Quả Thông Qua Chuyển Đổi Markdown
HTML thô có thể cực kỳ dài dòng và chứa một lượng lớn thông tin không liên quan (ví dụ: kịch bản, phong cách, các phần tử ẩn). Việc xử lý những đầu vào lớn như vậy bằng một LLM có thể tốn kém về mặt tính toán và dẫn đến việc sử dụng token gia tăng, làm tăng chi phí và thời gian xử lý. Một kỹ thuật tối ưu hóa chính là chuyển đổi HTML sang định dạng sạch hơn, ngắn gọn hơn như Markdown. Markdown giảm đáng kể số lượng token trong khi vẫn bảo tồn nội dung và cấu trúc thiết yếu, làm cho việc xử lý LLM hiệu quả hơn, nhanh chóng hơn và tiết kiệm hơn về chi phí. Việc giảm kích thước đầu vào này cũng nâng cao độ chính xác của LLM bằng cách cung cấp một đầu vào sạch hơn, ít ồn ào hơn.
5. Xử Lý Dữ Liệu Trong Môi Trường và An Ninh
Một trong những lợi thế quan trọng khi sử dụng LLM cục bộ như LLaMA 3 (thông qua Ollama) là việc xử lý dữ liệu diễn ra trong môi trường của riêng bạn. Điều này đặc biệt quan trọng khi xử lý thông tin nhạy cảm, vì nó giảm thiểu nguy cơ lộ dữ liệu có thể xảy ra khi gửi dữ liệu đến các API bên ngoài hoặc dịch vụ đám mây để xử lý. Giữ dữ liệu thu thập và LLM trong hạ tầng của bạn cung cấp sự kiểm soát lớn hơn và nâng cao bảo mật và quyền riêng tư của dữ liệu.
Điều kiện tiên quyết cho việc thu thập dữ liệu bằng LLaMA 3
Trước khi bắt đầu hành trình thu thập dữ liệu trên web bằng LLaMA 3, hãy đảm bảo bạn có các thành phần sau và kiến thức cơ bản cần thiết:
- Python 3: Ngôn ngữ lập trình chính cho hướng dẫn này. Mặc dù kiến thức Python cơ bản là đủ, nhưng sự quen thuộc với các khái niệm thu thập dữ liệu web sẽ có lợi.
- Hệ điều hành tương thích: LLaMA 3 thông qua Ollama hỗ trợ macOS (macOS 11 Big Sur trở lên), Linux và Windows (Windows 10 trở lên).
- Tài nguyên phần cứng đầy đủ: Các yêu cầu về tài nguyên phụ thuộc vào kích thước mô hình LLaMA 3 bạn chọn. Các mô hình nhỏ hơn (ví dụ:
llama3.1:8b
) nhẹ và có thể chạy trên hầu hết các laptop hiện đại (khoảng 4.9 GB dung lượng ổ đĩa và 6-8 GB RAM). Các mô hình lớn hơn (ví dụ: 70B hoặc 405B) đòi hỏi nhiều bộ nhớ và sức mạnh tính toán hơn đáng kể, phù hợp cho các máy tính mạnh hơn hoặc máy chủ chuyên dụng.
Thiết lập môi trường LLaMA 3 của bạn với Ollama
Ollama là một công cụ không thể thiếu giúp đơn giản hóa quá trình tải xuống, thiết lập và chạy các mô hình ngôn ngữ lớn tại địa phương. Nó loại bỏ bớt nhiều phức tạp liên quan đến việc triển khai LLM, cho phép bạn tập trung vào việc trích xuất dữ liệu.
1. Cài đặt Ollama
Để bắt đầu với Ollama:
- truy cập trang web chính thức của Ollama.
- Tải xuống và cài đặt ứng dụng dành cho hệ điều hành của bạn.
- Bước quan trọng: Trong quá trình cài đặt, Ollama có thể yêu cầu bạn chạy một lệnh trong terminal. Đừng thực hiện lệnh này ngay bây giờ. Chúng ta sẽ chọn phiên bản mô hình LLaMA phù hợp với khả năng phần cứng và trường hợp sử dụng cụ thể của bạn.
2. Chọn mô hình LLaMA của bạn
Việc chọn mô hình LLaMA đúng là rất quan trọng để cân bằng giữa hiệu suất và hiệu quả. Duyệt qua thư viện mô hình của Ollama để xác định phiên bản nào phù hợp nhất với thông số kỹ thuật của hệ thống bạn và nhu cầu của dự án.
Đối với đa số người dùng, llama3.1:8b
cung cấp sự cân bằng tối ưu. Nó nhẹ, rất mạnh mẽ và yêu cầu khoảng 4.9 GB dung lượng ổ đĩa và 6-8 GB RAM, phù hợp để thực hiện trên hầu hết các laptop hiện đại. Nếu máy của bạn có sức mạnh xử lý mạnh hơn và bạn cần khả năng suy luận nâng cao hoặc cửa sổ ngữ cảnh lớn hơn, hãy xem xét nâng cấp lên các mô hình lớn hơn như 70B
hoặc thậm chí 405B
. Hãy lưu ý rằng các mô hình lớn hơn này đòi hỏi bộ nhớ và tài nguyên tính toán lớn hơn đáng kể.
3. Tải xuống và chạy mô hình
Khi bạn đã chọn mô hình của mình, bạn có thể tải xuống và khởi tạo nó. Ví dụ, để tải xuống và chạy mô hình llama3.1:8b
, hãy thực hiện lệnh sau trong terminal của bạn:
bash
ollama run llama3.1:8b
Ollama sẽ tải mô hình xuống. Sau khi tải thành công, bạn sẽ thấy một thông báo nhắc tương tác đơn giản:
>>> Gửi một tin nhắn (/? để giúp đỡ)
Để xác nhận rằng mô hình đã được cài đặt và phản hồi đúng, bạn có thể gửi một câu hỏi nhanh:
>>> bạn là ai?
Tôi là LLaMA, *một trợ lý AI được phát triển bởi Meta AI...*
Một câu trả lời tương tự như trên xác nhận rằng mô hình LLaMA của bạn đã được thiết lập đúng cách. Để thoát khỏi nhắc tương tác, hãy gõ /bye
.
4. Khởi động máy chủ Ollama
Để kịch bản thu thập dữ liệu của bạn tương tác với LLaMA 3, máy chủ Ollama phải đang chạy trong nền. Mở một cửa sổ terminal mới và thực hiện:
bash
ollama serve
Lệnh này khởi động một phiên bản Ollama cục bộ, thường có sẵn tại http://127.0.0.1:11434/
. Việc giữ cho cửa sổ terminal này luôn mở là rất quan trọng, vì máy chủ phải hoạt động cho các hoạt động thu thập dữ liệu của bạn. Bạn có thể xác nhận trạng thái của máy chủ bằng cách điều hướng đến URL trong trình duyệt web của bạn; bạn sẽ thấy thông điệp "Ollama đang chạy."
Xây dựng một công cụ thu thập dữ liệu web dựa trên LLM: Một quy trình đa giai đoạn
Xây dựng một công cụ thu thập dữ liệu web mạnh mẽ, đặc biệt là cho các trang web phức tạp với nội dung động và biện pháp bảo vệ chống bot nghiêm ngặt, đòi hỏi một cách tiếp cận tinh vi. Công cụ thu thập dữ liệu sử dụng LLaMA của chúng tôi áp dụng một quy trình đa giai đoạn thông minh nhằm vượt qua các hạn chế của các phương pháp truyền thống và tối đa hóa hiệu quả trích xuất dữ liệu. Quy trình này đặc biệt hiệu quả cho các mục tiêu khó khăn như các trang thương mại điện tử, thường triển khai các biện pháp bảo vệ tiên tiến.
Dưới đây là một phân tích quy trình đa giai đoạn được hỗ trợ bởi AI:
- Tự động hóa trình duyệt: Sử dụng một trình duyệt không hiển thị (ví dụ: Selenium) để tải trang web mục tiêu, hiển thị tất cả nội dung động (JavaScript, các cuộc gọi AJAX), và mô phỏng các tương tác giống như con người.
- Trích xuất HTML: Sau khi trang được hiển thị đầy đủ, xác định và trích xuất phần HTML cụ thể chứa thông tin chi tiết sản phẩm mong muốn hoặc thông tin liên quan. Bước này tập trung vào việc tách riêng phần quan trọng nhất của trang.
- Chuyển đổi Markdown: Chuyển đổi HTML đã trích xuất thành định dạng Markdown rõ ràng, ngắn gọn. Tối ưu hóa quan trọng này giảm đáng kể số lượng token, làm cho việc nhập liệu hiệu quả hơn cho LLM và cải thiện tốc độ xử lý cũng như độ chính xác.
- Xử lý LLM: Sử dụng một prompt có cấu trúc được tạo ra cẩn thận với LLaMA 3 để trích xuất dữ liệu JSON rõ ràng, có cấu trúc từ nội dung Markdown. Sự hiểu biết ngữ cảnh của LLM là rất quan trọng ở đây.
- Xử lý đầu ra: Lưu trữ dữ liệu JSON đã trích xuất trong một định dạng tồn tại lâu dài (ví dụ: tệp JSON hoặc cơ sở dữ liệu) để sử dụng, phân tích hoặc tích hợp vào các hệ thống khác trong tương lai.
Cách tiếp cận mô-đun này đảm bảo rằng mỗi giai đoạn được tối ưu hóa cho nhiệm vụ cụ thể của nó, góp phần tạo ra một giải pháp lấy dữ liệu rất hiệu quả và đáng tin cậy. Mặc dù những ví dụ này chủ yếu sử dụng Python vì tính đơn giản và sự phổ biến rộng rãi của nó trong khoa học dữ liệu, nhưng các kết quả tương tự có thể đạt được với các ngôn ngữ lập trình khác như JavaScript.
Bước 1 – Cài đặt Thư viện Cần thiết
Bắt đầu bằng cách cài đặt các thư viện Python cần thiết. Mở terminal hoặc command prompt của bạn và thực hiện lệnh sau:
bash
pip install requests selenium webdriver-manager markdownify
Hãy cùng hiểu rõ vai trò của mỗi thư viện:
requests
: Một thư viện Python cơ bản dùng để thực hiện các yêu cầu HTTP. Nó sẽ được sử dụng để gửi các cuộc gọi API đến phiên bản Ollama cục bộ của bạn cho việc xử lý LLM.selenium
: Một công cụ mạnh mẽ để tự động hóa các trình duyệt web. Nó rất cần thiết cho việc tương tác với các trang web nặng JavaScript, hiển thị nội dung động và mô phỏng hành vi người dùng.webdriver-manager
: Đơn giản hóa quá trình thiết lập Selenium bằng cách tự động tải về và quản lý phiên bản ChromeDriver (hoặc trình điều khiển trình duyệt khác) phù hợp, loại bỏ cấu hình thủ công.markdownify
: Một tiện ích để chuyển đổi nội dung HTML thành Markdown, là bước quan trọng để tối ưu hóa đầu vào cho LLM.
Bước 2 – Khởi tạo Trình duyệt Headless
Thiết lập một trình duyệt headless với Selenium là bước lập trình đầu tiên. Một trình duyệt headless hoạt động mà không có giao diện người dùng đồ họa, giúp tiết kiệm thời gian cho các tác vụ tự động. Đoạn mã Python sau khởi tạo một trình duyệt Chrome ở chế độ headless:
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox") # Cần thiết cho một số môi trường
options.add_argument("--disable-dev-shm-usage") # Khắc phục vấn đề hạn chế tài nguyên
options.add_argument("--disable-gpu") # Chỉ áp dụng cho hệ điều hành Windows
options.add_argument("--window-size=1920,1080") # Đặt kích thước cửa sổ đồng nhất
options.add_argument("--ignore-certificate-errors") # Bỏ qua lỗi chứng chỉ
options.add_argument("--disable-extensions") # Vô hiệu hóa các tiện ích mở rộng
options.add_argument("--disable-infobars") # Vô hiệu hóa thông báo
options.add_argument("--disable-browser-side-navigation") # Vô hiệu hóa điều hướng bên trình duyệt
options.add_argument("--disable-features=VizDisplayCompositor") # Vô hiệu hóa VizDisplayCompositor
options.add_argument("--blink-settings=imagesEnabled=false") # Vô hiệu hóa hình ảnh để tải nhanh hơn
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
Các dòng options.add_argument
này rất quan trọng để cấu hình trình duyệt headless cho hiệu suất lấy dữ liệu tối ưu và giảm thiểu rủi ro phát hiện. Chúng vô hiệu hóa các tính năng khác nhau mà thường không cần thiết cho việc lấy dữ liệu và có thể tiêu tốn tài nguyên hoặc tiết lộ hành động tự động.
Bước 3 – Trích xuất HTML Sản phẩm
Khi trình duyệt headless đã được khởi tạo, bước tiếp theo là điều hướng đến URL mục tiêu và trích xuất nội dung HTML liên quan. Đối với các trang web phức tạp như Amazon, thông tin chi tiết sản phẩm thường được hiển thị động và nằm trong các phần tử HTML cụ thể. Chúng ta sẽ sử dụng WebDriverWait
của Selenium để đảm bảo phần tử mục tiêu được tải đầy đủ trước khi cố gắng trích xuất nội dung của nó.
python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 15)
product_container = wait.until(
EC.presence_of_element_located((By.ID, "ppd"))
)
# Trích xuất toàn bộ HTML của phần chứa sản phẩm
page_html = product_container.get_attribute("outerHTML")
Cách tiếp cận này mang lại hai lợi thế đáng kể:
- Xử lý Nội dung Động: Nó chờ đợi rõ ràng cho nội dung được hiển thị bằng JavaScript (chẳng hạn như giá, đánh giá và tình trạng tồn kho) xuất hiện trên trang, đảm bảo rằng bạn thu được thông tin đầy đủ và cập nhật.
- Trích xuất Có mục tiêu: Bằng cách chú trọng vào một phần tử cụ thể (ví dụ:
<div id="ppd">
cho các trang sản phẩm của Amazon), bạn chỉ trích xuất phần HTML liên quan, hiệu quả trong việc bỏ qua các yếu tố không cần thiết như tiêu đề, chân trang, thanh bên và quảng cáo. Điều này làm giảm lượng dữ liệu được xử lý bởi LLM, dẫn đến hiệu suất và độ chính xác tốt hơn.
Bước 4 – Chuyển đổi HTML sang Markdown
Như đã đề cập trước đó, việc chuyển đổi HTML đã trích xuất sang Markdown là một bước tối ưu hóa quan trọng. HTML thô, đặc biệt là từ các trang web phức tạp và lồng sâu, rất không hiệu quả cho LLM trong việc xử lý do độ dài và số lượng token cao của nó. Markdown, với định dạng văn bản sạch hơn và phẳng hơn, giảm mạnh số lượng token trong khi vẫn giữ lại nội dung và cấu trúc cần thiết.
Để minh họa tác động, hãy xem xét rằng HTML của một trang sản phẩm Amazon điển hình có thể chứa khoảng 270.000 token. Phiên bản Markdown tương đương, tuy nhiên, có thể ngắn gọn chỉ ~11.000 token. Sự giảm 96% đáng kể này mang lại nhiều lợi ích:
- Hiệu quả Chi phí: Ít token hơn dẫn đến chi phí API hoặc chi phí tính toán thấp hơn, đặc biệt là khi sử dụng dịch vụ LLM trả phí hoặc khi chạy các mô hình trên phần cứng hạn chế tài nguyên.
- Xử lý Nhanh hơn: Kích thước đầu vào nhỏ hơn có nghĩa là LLM có thể xử lý dữ liệu nhanh hơn nhiều, dẫn đến thời gian phản hồi nhanh hơn cho các hoạt động trích xuất của bạn.
- Cải thiện Độ Chính xác: Đầu vào sạch hơn, ít tiếng ồn giúp LLM tập trung vào thông tin liên quan, dẫn đến việc trích xuất dữ liệu chính xác và đúng hơn. Mô hình ít có khả năng bị phân tâm bởi các thẻ HTML hoặc thuộc tính không liên quan.
Dưới đây là cách thực hiện chuyển đổi HTML sang Markdown trong Python bằng cách sử dụng thư viện markdownify
:
python
from markdownify import markdownify as md
clean_text = md(page_html, heading_style="ATX")
Tham số heading_style="ATX"
đảm bảo rằng các tiêu đề Markdown được tạo ra bằng cách sử dụng kiểu ATX (ví dụ: # Tiêu đề 1
), kiểu này thường được LLM hiểu rõ.
Bước 5 – Tạo Đề xuất Trích xuất Dữ liệu
Đề xuất bạn cung cấp cho LLM là rất quan trọng để có được đầu ra JSON chính xác và nhất quán. Một đề xuất được thiết kế tốt hướng dẫn LLM hiểu vai trò của nó, nhiệm vụ cần thực hiện và định dạng chính xác yêu cầu cho đầu ra. Đề xuất sau đây chỉ đạo LLaMA 3 đóng vai trò là một chuyên gia trích xuất dữ liệu sản phẩm Amazon và chỉ trả lại JSON hợp lệ với một sơ đồ đã được định trước:
python
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"Bạn là một chuyên gia trích xuất dữ liệu sản phẩm Amazon. "
"Nhiệm vụ của bạn là trích xuất dữ liệu sản phẩm từ nội dung đã cung cấp. "
"\n\nTrả về CHỈ hợp lệ JSON với ĐÚNG các trường và định dạng sau:\n\n"\
"{\n"
" 'title': 'string' - tiêu đề sản phẩm,\n"
" 'price': number - giá hiện tại (giá trị số chỉ),\n"
" 'original_price': number hoặc null - giá gốc nếu có,\n"
" 'discount': number hoặc null - tỷ lệ giảm giá nếu có,\n"
" 'rating': number hoặc null - đánh giá trung bình (thang 0-5),\n"
" 'review_count': number hoặc null - tổng số đánh giá,\n"
" 'description': 'string' - mô tả chính của sản phẩm,\n"
" 'features': ['string'] - danh sách các tính năng chính,\n"
" 'availability': 'string' - trạng thái hàng tồn kho,\n"
" 'asin': 'string' - ID Amazon 10 ký tự\n"
"}\n\nChỉ trả về JSON mà không có văn bản bổ sung."
)
Đề xuất này rất cụ thể, để lại ít khoảng trống cho sự mơ hồ. Nó xác định:
- Vai trò: "chuyên gia trích xuất dữ liệu sản phẩm Amazon."
- Nhiệm vụ: "trích xuất dữ liệu sản phẩm từ nội dung đã cung cấp."
- Định dạng Đầu ra: Rõ ràng nêu chỉ trả về "JSON hợp lệ" và cung cấp cấu trúc và kiểu dữ liệu chính xác cho mỗi trường (ví dụ:
title
là chuỗi,price
là số,features
là danh sách các chuỗi). - Ràng buộc: "Chỉ trả về JSON mà không có văn bản bổ sung." Điều này rất quan trọng để ngăn LLM tạo thông tin thêm không cần thiết hoặc giải thích, đảm bảo đầu ra JSON sạch có thể được phân tích trực tiếp.
Bước 6 – Gọi API LLM
Với máy chủ Ollama của bạn đang chạy cục bộ, bạn có thể gửi văn bản Markdown đã chuẩn bị và đề xuất trích xuất đến instance LLaMA 3 của bạn qua API HTTP của nó. Thư viện requests
trong Python là lý tưởng cho mục đích này.
python
import requests
import json
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "llama3.1:8b",
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{clean_text}",
"stream": False,
"format": "json",
"options": {
"temperature": 0.1,
"num_ctx": 12000,
},
"timeout":250,
}
)
raw_output = response.json()["response"].strip()
product_data = json.loads(raw_output)
Hãy phân tích các tham số chính trong cuộc gọi API:
model
: Chỉ định phiên bản mô hình LLaMA cần sử dụng (ví dụ:llama3.1:8b
).prompt
: Đây là lời nhắc kết hợp, nốiPRODUCT_DATA_EXTRACTION_PROMPT
của bạn vớiclean_text
(nội dung Markdown) mà LLM cần xử lý.stream
: Đặt thànhFalse
để nhận phản hồi đầy đủ sau khi xử lý, thay vì một luồng liên tục các token. Điều này phù hợp cho việc xử lý dữ liệu theo lô.format
: Quan trọng là đặt thành"json"
. Điều này yêu cầu Ollama định dạng đầu ra của nó dưới dạng một đối tượng JSON, phù hợp với đầu ra dữ liệu có cấu trúc mà chúng ta mong muốn.options
:temperature
: Đặt thành0.1
. Nhiệt độ thấp hơn (gần 0) làm cho đầu ra của LLM trở nên xác định hơn và ít sáng tạo hơn, điều này lý tưởng cho việc trích xuất dữ liệu có cấu trúc mà tính nhất quán là rất quan trọng.num_ctx
: Xác định độ dài ngữ cảnh tối đa bằng token. Bài báo gốc cho rằng 12.000 token là đủ cho hầu hết các trang sản phẩm trên Amazon. Quan trọng là phải đặt giá trị này một cách hợp lý dựa trên độ dài mong đợi của nội dung Markdown. Việc tăng giá trị này cho phép xử lý các đầu vào dài hơn, nhưng cũng làm tăng mức sử dụng RAM và làm chậm quá trình xử lý. Chỉ nên tăng giới hạn ngữ cảnh nếu các trang sản phẩm của bạn đặc biệt dài hoặc nếu bạn có tài nguyên tính toán để hỗ trợ điều đó.
timeout
: Đặt thời gian tối đa (tính bằng giây) để chờ phản hồi từ LLM.
Sau khi nhận phản hồi, response.json()["response"].strip()
trích xuất chuỗi JSON thô từ đầu ra của LLM, và json.loads(raw_output)
phân tích chuỗi này thành một từ điển Python, giúp dữ liệu trích xuất dễ dàng truy cập.
Bước 7 – Lưu Kết Quả
Bước cuối cùng trong quy trình trích xuất dữ liệu là lưu dữ liệu sản phẩm có cấu trúc vào một tệp vĩnh viễn. Định dạng JSON rất phù hợp cho việc này, vì nó có thể đọc được bởi con người và dễ dàng phân tích bởi các ứng dụng khác.
python
with open("product_data.json", "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=4, ensure_ascii=False)
Đoạn mã này mở một tệp có tên là product_data.json
ở chế độ ghi ("w"
) với mã hóa UTF-8 để xử lý các ký tự khác nhau. json.dump()
sau đó ghi từ điển product_data
vào tệp này. Tham số indent=4
đảm bảo rằng đầu ra JSON được định dạng đẹp mắt với 4 khoảng cách, làm cho nó dễ đọc hơn, và ensure_ascii=False
đảm bảo rằng các ký tự không phải ASCII (như các biểu tượng đặc biệt hoặc ký tự quốc tế) được ghi trực tiếp thay vì bị thoát.
Bước 8: Thực thi Kịch bản
Để chạy bộ quét web hoàn toàn dựa trên LLaMA của bạn, bạn thường sẽ có một khối thực hiện chính xác định URL mục tiêu và gọi hàm quét của bạn. Dưới đây là một ví dụ đơn giản:
python
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO>"
# Gọi hàm của bạn để quét và trích xuất dữ liệu sản phẩm
scrape_amazon_product(url)
Trong một kịch bản thực tế, bạn sẽ bao gồm các bước từ việc lấy HTML đến việc lưu JSON trong một hàm (ví dụ: scrape_amazon_product
) và sau đó gọi hàm này với URL sản phẩm mong muốn.
Bước 9 – Ví dụ Mã Hoàn Chỉnh
Để có một triển khai hoàn chỉnh, từ đầu đến cuối, dưới đây là toàn bộ kịch bản Python kết hợp tất cả các bước đã thảo luận:
python
import json
import logging
import time
from typing import Final, Optional, Dict, Any
import requests
from markdownify import markdownify as html_to_md
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
# Cấu hình đăng nhập
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler()]
)
def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
"""Khởi tạo và trả về một phiên bản WebDriver Chrome đã được cấu hình."""
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox") # Cần thiết cho một số môi trường
options.add_argument("--disable-dev-shm-usage") # Khắc phục các vấn đề về tài nguyên hạn chế
options.add_argument("--disable-gpu") # Áp dụng chỉ cho hệ điều hành Windows
options.add_argument("--window-size=1920,1080") # Đặt kích thước cửa sổ nhất quán
options.add_argument("--ignore-certificate-errors") # Bỏ qua lỗi chứng chỉ
options.add_argument("--disable-extensions") # Vô hiệu hóa các tiện ích mở rộng
options.add_argument("--disable-infobars") # Vô hiệu hóa các thông báo
options.add_argument("--disable-browser-side-navigation") # Vô hiệu hóa điều hướng bên của trình duyệt
options.add_argument("--disable-features=VizDisplayCompositor") # Vô hiệu hóa VizDisplayCompositor
Here is the translation in Vietnamese:
python
options.add_argument("--blink-settings=imagesEnabled=false") # Vô hiệu hóa hình ảnh để tải nhanh hơn
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)
def fetch_product_container_html(product_url: str) -> Optional[str]:
"""Lấy nội dung HTML của container chi tiết sản phẩm trên Amazon."""
driver = initialize_web_driver()
try:
logging.info(f"Truy cập trang sản phẩm: {product_url}")
driver.set_page_load_timeout(15)
driver.get(product_url)
# Chờ cho container sản phẩm xuất hiện
wait = WebDriverWait(driver, 5)
product_container = wait.until(
EC.presence_of_element_located((By.ID, "ppd"))
)
return product_container.get_attribute("outerHTML")
except Exception as e:
logging.error(f"Lỗi trong việc lấy chi tiết sản phẩm: {str(e)}")
return None
finally:
driver.quit()
def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
"""Trích xuất dữ liệu sản phẩm có cấu trúc từ văn bản markdown
sử dụng API LLM."""
try:
response = requests.post(
LLM_API_CONFIG["endpoint"],
json={
"model": LLM_API_CONFIG["model"],
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n{markdown_content}",
"stream": LLM_API_CONFIG["stream"],
"format": LLM_API_CONFIG["format"],
"options": LLM_API_CONFIG["options"],
"timeout": LLM_API_CONFIG["timeout_seconds"],
}
)
response.raise_for_status() # Gây ra HTTPError cho các phản hồi xấu (4xx hoặc 5xx)
raw_output = response.json()["response"].strip()
return json.loads(raw_output)
except requests.exceptions.RequestException as e:
logging.error(f"Yêu cầu API LLM thất bại: {e}")
return None
except json.JSONDecodeError as e:
logging.error(f"Không thể giải mã JSON từ phản hồi LLM: {e}")
return None
def scrape_amazon_product(url: str) -> None:
"""Tổ chức quy trình ch scraping và trích xuất dữ liệu cho một trang sản phẩm trên Amazon."""
logging.info(f"Bắt đầu quá trình ch scraping cho: {url}")
# Bước 1: Lấy nội dung HTML
html_content = fetch_product_container_html(url)
if not html_content:
logging.error("Không thể lấy nội dung HTML. Đang thoát.")
return
# Bước 2: Chuyển HTML sang Markdown
markdown_content = html_to_md(html_content, heading_style="ATX")
logging.info("HTML đã được chuyển đổi thành Markdown.")
# Bước 3: Trích xuất dữ liệu qua LLM
product_data = extract_product_data_via_llm(markdown_content)
if not product_data:
logging.error("Không thể trích xuất dữ liệu sản phẩm qua LLM. Đang thoát.")
return
# Bước 4: Lưu kết quả
output_filename = "product_data.json"
try:
with open(output_filename, "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=4, ensure_ascii=False)
logging.info(f"Dữ liệu sản phẩm đã được lưu thành công vào {output_filename}")
except IOError as e:
logging.error(f"Không thể lưu dữ liệu sản phẩm vào tệp: {e}")
# Hằng số cấu hình
LLM_API_CONFIG: Final[Dict[str, Any]] = {
"endpoint": "http://localhost:11434/api/generate",
"model": "llama3.1:8b",
"temperature": 0.1,
"num_ctx": 12000,
"stream": False,
"format": "json",
"timeout_seconds": 220,
}
DEFAULT_PRODUCT_DATA: Final[Dict[str, Any]] = {
"title": "",
"price": 0.0,
"original_price": None,
"discount": None,
"rating": None,
"review_count": None,
"description": "",
"features": [],
"availability": "",
"asin": "",
}
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"Bạn là một chuyên gia trích xuất dữ liệu sản phẩm trên Amazon. Nhiệm vụ của bạn là "
"trích xuất dữ liệu sản phẩm từ nội dung được cung cấp. "
"\n\nTrả về CHỈ MÃ JSON hợp lệ với CÁC trường và định dạng ĐÚNG NHẤT sau:\n\n"\
"{\n"
" 'title': \"chuỗi\" - tiêu đề sản phẩm,\n"
" 'price': số - giá hiện tại (giá trị số chỉ),\n"
" 'original_price': số hoặc null - giá gốc nếu có,\n"
" 'discount': số hoặc null - phần trăm giảm giá nếu có,\n"
" 'rating': số hoặc null - đánh giá trung bình (thang điểm 0-5),\n"
" 'review_count': số hoặc null - tổng số đánh giá,\n"
" 'description': \"chuỗi\" - mô tả chính của sản phẩm,\n"
" 'features': [\"chuỗi\"] - danh sách các đặc điểm dạng gạch đầu dòng,\n"
" 'availability': \"chuỗi\" - trạng thái tồn kho,\n"
" 'asin': \"chuỗi\" - ID Amazon 10 ký tự\n"
"}\n\nTrả về CHỈ MÃ JSON mà không có bất kỳ văn bản bổ sung nào."
)
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJO>"
scrape_amazon_product(url)
Vượt qua các biện pháp chống bot với Trình duyệt Scrapeless Scraping
Web scraping, đặc biệt là khi quy mô lớn, là một cuộc chiến liên tục chống lại các hệ thống phát hiện bot tinh vi. Các trang web sử dụng nhiều kỹ thuật khác nhau để phát hiện và chặn các yêu cầu tự động, nhằm bảo vệ dữ liệu và cơ sở hạ tầng của họ. Những biện pháp này bao gồm:
- Chặn IP: Xác định và đưa vào danh sách đen các địa chỉ IP có hành vi đáng ngờ (ví dụ: quá nhiều yêu cầu từ một IP duy nhất trong thời gian ngắn).
- CAPTCHA: Đưa ra các thử thách (ví dụ: reCAPTCHA, hCaptcha) dễ dàng cho con người giải quyết nhưng khó khăn cho các bot tự động.
- Phân tích User-Agent: Phát hiện các User-Agent không phải trình duyệt hoặc đã lỗi thời, điều này có thể chỉ ra một khách hàng tự động.
- Nhận diện dấu vân tay trình duyệt: Phân tích các đặc điểm độc nhất của một trình duyệt (ví dụ: tiện ích cài đặt, độ phân giải màn hình, phông chữ) để xác định và chặn các công cụ tự động như cấu hình mặc định của Selenium.
- Giới hạn tỷ lệ: Hạn chế số lượng yêu cầu từ một nguồn duy nhất trong khung thời gian cụ thể.
- Bẫy honeypot: Các liên kết hoặc phần tử ẩn được thiết kế để bẫy các bot theo dõi mọi liên kết trên một trang.
- Phân tích hành vi: Giám sát di chuyển chuột, mẫu cuộn và tốc độ gõ phím để phân biệt giữa tương tác của con người và tự động.
Trong khi phương pháp LLaMA 3 nâng cao khả năng chống chịu bằng cách hiểu nội dung theo ngữ cảnh, nó không tự động vượt qua những hệ thống bảo vệ chống bot ở cấp độ thấp này. Đây là lúc một công cụ chuyên biệt như Scrapeless Scraping Browser trở nên cần thiết. Khác với các trình duyệt headless đa năng, Scrapeless Scraping Browser được thiết kế đặc biệt để mô phỏng hành vi duyệt web của con người và vượt qua nhiều biện pháp bảo vệ chống bot, khiến nó trở thành lựa chọn vượt trội cho việc web scraping mạnh mẽ.
Tại sao chọn Scrapeless Scraping Browser thay vì sản phẩm của Bright Data?
Trong khi Bright Data cung cấp một
Scraping Browser, Scrapeless cung cấp một giải pháp linh hoạt và tập trung vào nhà phát triển hơn, đặc biệt phù hợp cho các quy trình làm việc scraping được hỗ trợ bởi AI. Đây là lý do tại sao Scrapeless Scraping Browser được khuyến nghị:
- Tùy chỉnh dấu vân tay tiên tiến: Scrapeless cung cấp tính năng tùy chỉnh sâu sắc cho dấu vân tay trình duyệt, bao gồm User-Agent, đặc điểm thiết bị và các tham số khác. Điều này cho phép bạn tạo ra các hồ sơ trình duyệt cực kỳ thực tế, gần như không thể phân biệt với của người dùng thực, làm giảm đáng kể nguy cơ bị phát hiện.
- Mạng proxy phân tán toàn cầu: Nó có một mạng proxy phân tán toàn cầu cho phép bạn định tuyến các yêu cầu của mình thông qua một tập hợp lớn các IP dân cư và di động. Điều này giúp vượt qua các biện pháp chặn dựa trên IP và giới hạn tỷ lệ, cho phép bạn scrap ở quy mô lớn mà không bị phát hiện.
- Sự bí mật và né tránh hỗ trợ AI: Scrapeless Scraping Browser được xây dựng với suy nghĩ về các nhà phát triển AI. Nó kết hợp hỗ trợ chế độ ẩn động và các kỹ thuật né tránh dựa trên AI khác mà điều chỉnh theo các biện pháp chống bot của trang web mục tiêu theo thời gian thực. Cách tiếp cận chủ động này đảm bảo tỷ lệ thành công cao hơn cho các hoạt động scraping của bạn.
- Tích hợp liền mạch với quy trình làm việc AI: Scrapeless được thiết kế để tích hợp dễ dàng với AI và các quy trình làm việc dựa trên LLM. API của nó trực quan và được tài liệu tốt, giúp việc đưa vào các kịch bản Python và các công cụ tự động hóa khác dễ dàng. Sự tích hợp liền mạch này rất quan trọng để xây dựng các giải pháp scraping mạnh mẽ và hiệu quả được hỗ trợ bởi AI.
- Khả năng chi trả và linh hoạt: Scrapeless cung cấp một mô hình giá cả linh hoạt và thường tiết kiệm chi phí hơn so với các giải pháp tập trung vào doanh nghiệp như Bright Data. Điều này làm cho nó trở thành một lựa chọn khả thi nhưng mạnh mẽ cho các nhà phát triển cá nhân, nhà nghiên cứu và các doanh nghiệp vừa và nhỏ.
Bằng cách kết hợp hiểu biết ngữ cảnh của LLaMA 3 với khả năng né tránh chống bot tiên tiến của Scrapeless Scraping Browser, bạn có thể xây dựng một giải pháp web scraping thực sự mạnh mẽ vừa thông minh vừa bền bỉ.
Các bước tiếp theo và giải pháp nâng cao
Khi bạn đã thành thạo các nguyên tắc cơ bản của việc web scraping được hỗ trợ bởi LLaMA 3, bạn có thể mở rộng khả năng của bộ thu thập dữ liệu và khám phá những triển khai tiên tiến hơn. Dưới đây là một số cải tiến và giải pháp thay thế để xem xét:
- Làm cho đoạn mã có thể tái sử dụng: Nâng cao đoạn mã của bạn để chấp nhận URL mục tiêu và prompt trích xuất dữ liệu như các tham số dòng lệnh. Điều này sẽ làm cho bộ thu thập dữ liệu của bạn linh hoạt và có thể tái sử dụng cho nhiều trang web và nhiệm vụ trích xuất dữ liệu khác nhau.
- Bảo mật thông tin đăng nhập của bạn: Nếu bạn đang sử dụng một dịch vụ thương mại như Scrapeless Scraping Browser, việc xử lý API keys và thông tin đăng nhập của bạn một cách an toàn là rất quan trọng. Lưu trữ chúng trong tệp
.env
và sử dụng thư viện nhưpython-dotenv
để tải chúng vào đoạn mã của bạn, tránh việc mã hóa cứng thông tin nhạy cảm trong mã nguồn của bạn. - Triển khai hỗ trợ đa trang: Đối với các trang web có nội dung phân trang (ví dụ: kết quả tìm kiếm thương mại điện tử, lưu trữ tin tức), triển khai logic để thu thập dữ liệu qua nhiều trang. Việc này thường bao gồm xác định nút hoặc mẫu URL "trang tiếp theo" và lặp qua các trang cho đến khi tất cả dữ liệu mong muốn được thu thập.
- Thu thập dữ liệu từ nhiều trang web hơn: Tận dụng các tính năng chống phát hiện mạnh mẽ của Scrapeless Scraping Browser để thu thập dữ liệu từ các nền tảng thương mại điện tử phức tạp khác, các trang mạng xã hội và các ứng dụng web giàu dữ liệu.
- Trích xuất dữ liệu từ các dịch vụ của Google: Xây dựng các trình thu thập dữ liệu chuyên dụng cho các dịch vụ của Google như Google Flights, Google Search và Google Trends. Ngoài ra, đối với kết quả của công cụ tìm kiếm, hãy xem xét sử dụng một API SERP chuyên biệt, có thể cung cấp dữ liệu có cấu trúc sẵn sàng sử dụng từ tất cả các công cụ tìm kiếm lớn, giúp bạn tiết kiệm công sức xây dựng và duy trì trình thu thập dữ liệu của riêng mình.
Nếu bạn thích các giải pháp được quản lý hoặc muốn khám phá các phương pháp khác do LLM điều khiển, các tùy chọn sau cũng có thể phù hợp:
- Thu thập dữ liệu với Gemini: Khám phá các mô hình Gemini của Google cho các khả năng trích xuất dữ liệu tương tự được hỗ trợ bởi AI.
- Thu thập dữ liệu với Perplexity: Perplexity AI cũng cung cấp các mô hình ngôn ngữ mạnh mẽ có thể được điều chỉnh cho các nhiệm vụ thu thập dữ liệu web.
- Xây dựng trình thu thập dữ liệu AI với Crawl4AI và DeepSeek: Nghiên cứu các công cụ và mô hình thu thập dữ liệu AI chuyên dụng khác như Crawl4AI và DeepSeek, được thiết kế cho việc trích xuất dữ liệu thông minh.
Kết luận: Tương lai của thu thập dữ liệu web là thông minh
Hướng dẫn này đã cung cấp một lộ trình toàn diện để xây dựng các trình thu thập dữ liệu web mạnh mẽ và thông minh sử dụng LLaMA 3. Bằng cách kết hợp khả năng lý luận ngữ cảnh của các mô hình ngôn ngữ lớn với các công cụ và kỹ thuật thu thập dữ liệu tiên tiến, bạn có thể vượt qua những hạn chế của các phương pháp truyền thống và trích xuất dữ liệu có cấu trúc từ ngay cả những trang web phức tạp và được bảo vệ tốt nhất với nỗ lực tối thiểu.
Điểm rút ra chính là tương lai của thu thập dữ liệu web không chỉ là về tự động hóa mà còn về tự động hóa thông minh. Khả năng của LLaMA 3 trong việc hiểu nội dung theo nghĩa ngữ nghĩa, kết hợp với khả năng chống bot tinh vi của các công cụ như Scrapeless Scraping Browser, đại diện cho một sự chuyển dịch trong cách tiếp cận của chúng ta đối với việc trích xuất dữ liệu. Sự kết hợp mạnh mẽ này trao quyền cho các nhà phát triển và nhà nghiên cứu xây dựng các trình thu thập dữ liệu không chỉ hiệu quả hơn mà còn có khả năng thích ứng và bền vững hơn trước bối cảnh web đang không ngừng thay đổi.
Khi bạn bắt đầu hành trình thu thập dữ liệu web được hỗ trợ bởi AI, hãy nhớ rằng những vấn đề đạo đức là rất quan trọng. Luôn tôn trọng điều khoản dịch vụ của các trang web mà bạn thu thập dữ liệu, tránh làm quá tải máy chủ của họ với các yêu cầu quá mức, và hãy chú ý đến các quy định về quyền riêng tư dữ liệu. Bằng cách áp dụng một cách tiếp cận có trách nhiệm và thông minh, bạn có thể khai thác tiềm năng rộng lớn của dữ liệu web để thúc đẩy đổi mới, thông báo quyết định và tạo ra giá trị trong một thế giới dựa trên dữ liệu.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.