Cách theo dõi các khuyến nghị của Amazon Rufus theo thời gian
Expert Network Defense Engineer
Những điểm chính:
- Gợi ý của Amazon Rufus là dữ liệu sản phẩm có cấu trúc, không phải là bản ghi cuộc trò chuyện. Một lần gọi đến actor
scraper.amazonvớitype: rufustrả về một mảngproducts, mỗi mục có ASIN, tiêu đề, giá cả, đánh giá và nhãn mục mà Rufus nhóm lại. - Tỷ lệ gợi ý là chỉ số mà pipeline này sản xuất ra. Theo dõi các ASIN mà Rufus đưa ra cho một tập hợp truy vấn cố định theo thời gian biến kệ hàng trò chuyện thành một tín hiệu khả năng đo lường — tương đương với Rufus về tỷ lệ hiển thị.
- Rufus chia các lựa chọn của mình thành các mục có nhãn. Phản hồi nhóm các sản phẩm qua
content_blocksnhư "Những lựa chọn hàng đầu - ANC tốt nhất" và "Những lựa chọn giá trị tốt", vì vậy mỗi sản phẩm đều mang theo cả thứ hạng tổng thể và tiêu đề mục mà nó nằm trong đó. related_questionsmở rộng tập hợp truy vấn hạt giống tự nó. Mỗi lần thu thập đều trả về các câu hỏi tiếp theo mà Rufus gợi ý cho truy vấn, và những câu hỏi đó sẽ được đưa thẳng vào danh sách gợi ý cho lượt chạy tiếp theo.- Mọi trường đều có thể null và câu trả lời được tạo ra mỗi phiên. Một truy vấn có thể không trả về câu trả lời Rufus cho một vùng nhất định, và một chỗ sản phẩm có thể đến mà không có số lượng
bought— vì vậy pipeline lưu trữ các bẵng chạy theo từng lần chạy và đọc chuỗi, không bao giờ chỉ là một lần gọi duy nhất. - Pipeline giảm xuống chỉ còn các bẵng ghi thêm và phân biệt. Mỗi lần chạy ghi một bản ghi JSONL với khóa là truy vấn và thời gian lấy mẫu; việc so sánh các bản ghi liên tiếp sẽ báo cáo các ASIN nào đã gia nhập hoặc rời bỏ giữa các lần chạy.
- Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm các khoản tín dụng dùng thử miễn phí - đăng ký tại app.scrapeless.com.
Giới thiệu: kệ hàng mua sắm đưa vào trợ lý
Amazon Rufus trả lời các câu hỏi mua sắm với danh sách sản phẩm được xếp hạng. Một người mua hỏi về tai nghe chống ồn tốt nhất, và Rufus trả về các lựa chọn được nhóm lại — "Những lựa chọn hàng đầu", "Tốt nhất cho người dùng Apple", "Những lựa chọn giá trị tốt" — mỗi cái có một mức giá, một đánh giá và một liên kết mua, trong trợ lý và trước khi bất kỳ trang kết quả tìm kiếm nào được tải. Đối với một thương hiệu, câu hỏi không còn là sản phẩm đứng ở vị trí nào trong bảng kết quả; mà là liệu Rufus có đề cập đến sản phẩm đó hay không, trong mục nào, và với thứ hạng nào.
Kệ hàng đó khó được theo dõi theo thời gian. Rufus tạo ra câu trả lời của mình theo từng phiên, các lựa chọn thay đổi theo truy vấn và khu vực, và các thẻ sản phẩm được giải quyết trong một bề mặt cuộc trò chuyện mà chống lại tự động hóa. Đọc bằng mắt một lần không cho bạn biết gì cả; tín hiệu nằm ở cách tập hợp gợi ý di chuyển từ tuần này sang tuần khác.
Hướng dẫn này xây dựng một pipeline giám sát dựa trên Scrapeless Scraping API: một tập hợp truy vấn cố định được đưa vào, actor scraper.amazon trả lại các gợi ý của Rufus dưới dạng sản phẩm có cấu trúc, và pipeline trích xuất ASIN, hạng, và mục, ánh xạ mỗi ASIN đến một thương hiệu, lưu trữ một bẵng chạy theo từng lần chạy, và phân biệt các bẵng để báo cáo tỷ lệ gợi ý. Nó kết hợp tự nhiên với khả năng hiển thị thương hiệu trong Google AI Overviews, theo dõi câu hỏi gợi ý tương tự ở phía tìm kiếm.
Tổng quan về Pipeline
Toàn bộ hệ thống có sáu giai đoạn, từ đầu đến cuối:
- Định nghĩa tập hợp truy vấn — một danh sách cố định các câu hỏi mua sắm, được mở rộng bởi
related_questionsmà mỗi lần thu thập trả về. - Thu thập theo truy vấn — Gửi POST từng truy vấn đến actor
scraper.amazonvớitype: rufus; một vùng không được hỗ trợ sẽ không trả về câu trả lời Rufus, mà pipeline sẽ ghi nhận và bỏ qua. - Trích xuất sản phẩm — đi qua
content_blocks, lấy ASIN của từng sản phẩm, thứ hạng tổng thể, và nhãn mục. - Ánh xạ ASIN → thương hiệu — xác định thương hiệu từ tiêu đề sản phẩm với một quy tắc nhỏ để tỷ lệ có thể được tổng hợp trên cấp độ ASIN.
- Lưu trữ một bẵng chạy theo từng lần chạy — thêm một bản ghi JSONL cho từng truy vấn với khóa là truy vấn và thời gian thu thập; không bao giờ ghi đè.
- So sánh theo thời gian — so sánh các bẵng liên tiếp để báo cáo tỷ lệ gợi ý và các ASIN nào đã gia nhập hoặc rời bỏ.
Các giai đoạn 1–4 chạy trên mỗi truy vấn trong mỗi chu kỳ; Các giai đoạn 5–6 biến những lần thu thập đó thành một chuỗi thời gian. Các phần dưới đây xây dựng từng giai đoạn theo thứ tự.
Điều kiện tiên quyết
- Python 3.10 hoặc mới hơn (mã dưới đây chỉ sử dụng thư viện chuẩn cộng với
requests) - Một tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com
- Khóa được xuất ra dưới dạng
SCRAPELESS_API_KEY - Kiến thức cơ bản về terminal và JSON
Giai đoạn 1 — Định nghĩa tập hợp truy vấn
Một chương trình giám sát chỉ tốt như tập hợp truy vấn của nó. Bắt đầu với các câu hỏi mua sắm quan trọng cho danh mục mà bạn theo dõi — diễn đạt chúng theo cách mà một người mua hỏi Rufus, với ý định mua sắm rõ ràng.
python
SEED_QUERIES = [
"tai nghe chống ồn tốt nhất",
"tai nghe không dây tốt nhất cho việc đi lại",
"tai nghe chụp tai ngân sách tốt nhất"
```python
THƯƠNG_HIỆU_NỔI_BẬT = ("Sony", "Bose", "Apple", "Sennheiser", "Beats", "JBL", "Anker")
def brand_from_title(title: str) -> str | None:
if not title:
return None
lowered = title.lower()
for brand in THƯƠNG_HIỆU_NỔI_BẬT:
if brand.lower() in lowered:
return brand
return title.split()[0] # ngã ba: từ đầu tiên của tiêu đề
Giữ danh sách THƯƠNG_HIỆU_NỔI_BẬT trong phạm vi danh mục mà bạn theo dõi; ngã ba xử lý các trường hợp không có bảng tra cứu.
Lấy khóa API của bạn trong kế hoạch miễn phí: app.scrapeless.com
Giai đoạn 4 — Lưu một bản chụp theo mỗi lần chạy
Pipeline là chỉ thêm: mỗi lần chụp ghi một bản ghi JSONL được khóa bởi truy vấn và thời gian chụp, và không có gì bị ghi đè. Điều đó giúp bạn có toàn bộ lịch sử để so sánh, và có nghĩa là một lần chạy xấu hoặc trống sẽ không bao giờ tiêu hủy một lần chạy tốt trước đó.
python
import json
import time
def append_snapshot(path: str, query: str, rows: list[dict]) -> dict:
record = {"query": query, "captured_at": int(time.time()), "products": rows}
with open(path, "a", encoding="utf-8") as handle:
handle.write(json.dumps(record, ensure_ascii=False) + "\n")
return record
Sử dụng một epoch số nguyên cho captured_at giữ cho mỗi bản ghi có khả năng mô tả và sắp xếp mà không cần một chỉ mục riêng biệt. Để tải lại lịch sử cho một truy vấn nhất định, đọc tệp từng dòng và lọc theo khóa query — một lượt sẽ cung cấp mọi bản chụp theo thứ tự chụp.
Giai đoạn 5 — So sánh và báo cáo tỷ lệ khuyến nghị
Hai hàm đọc phía bên tạo ra các số liệu từ lịch sử bản chụp. Tỷ lệ khuyến nghị đếm số lần mỗi thương hiệu xuất hiện trong suốt một lần chạy và chuẩn hóa thành tỷ lệ phần trăm; sự khác biệt so sánh các tập ASIN của hai lần chạy để hiển thị sự chuyển động.
python
from collections import Counter
def share_of_recommendation(rows: list[dict]) -> dict[str, float]:
counts = Counter(row["brand"] for row in rows if row.get("brand"))
total = sum(counts.values())
if not total:
return {}
return {brand: round(100 * n / total, 1) for brand, n in counts.most_common()}
def diff_runs(prev_rows: list[dict], curr_rows: list[dict]) -> dict[str, list[str]]:
prev = {row["asin"] for row in prev_rows}
curr = {row["asin"] for row in curr_rows}
return {
"entered": sorted(curr - prev),
"dropped": sorted(prev - curr),
}
Chạy share_of_recommendation cho mỗi truy vấn để xem thương hiệu nào chiếm lĩnh ngăn kệ đối thoại cho câu hỏi đó, hoặc trên toàn bộ tập truy vấn cho cái nhìn theo danh mục. Chạy diff_runs giữa hai bản chụp gần nhất của một truy vấn để bắt kịp tuần mà một thương hiệu gia nhập hoặc rời khỏi danh sách — khoảnh khắc xứng đáng để cảnh báo.
Lập lịch và mở rộng
Vòng lặp chụp kết nối các giai đoạn lại với nhau: cho mỗi truy vấn, chụp, trích xuất, bản chụp, và ghi lại một kết quả trống như là bỏ qua. Chạy nó theo lịch — hàng ngày hoặc hàng tuần — và tệp JSONL trở thành chuỗi thời gian.
python
if __name__ == "__main__":
snapshot_path = "rufus_snapshots.jsonl"
for query in SEED_QUERIES:
result = capture_rufus(query)
rows = extract_products(result)
if not rows:
print(f"{query}: không có câu trả lời Rufus cho truy vấn/khu vực này")
continue
append_snapshot(snapshot_path, query, rows)
share = share_of_recommendation(rows)
leaders = ", ".join(f"{b} {pct}%" for b, pct in list(share.items())[:3])
print(f"{query}: {len(rows)} sản phẩm — {leaders}")
Một số giới hạn thực tiễn khi bạn mở rộng tập truy vấn:
- Giữ độ đồng thời khiêm tốn — một vài truy vấn đang xử lý là đủ; một lần theo dõi là ổn định, không phải là một đợt bùng nổ.
- Ghi rõ khu vực mỗi lần chạy để chuỗi vẫn có thể so sánh; một truy vấn không trả về câu trả lời Rufus ở một khu vực sẽ được ghi là bỏ qua, không bị trộn lẫn vào số liệu của khu vực khác.
- Giới hạn tập truy vấn vào những gì bạn hành động. Mỗi truy vấn là một cuộc gọi tính phí, vì vậy hãy theo dõi các câu hỏi mà thúc đẩy quyết định và để
related_questionsgợi ý những câu hỏi tiếp theo để thêm vào. Lập kế hoạch nhịp điệu dựa trên các bậc giá Scrapeless.
Những gì bạn nhận được
Mỗi lần chụp tạo ra danh sách products phẳng cộng với content_blocks được nhóm theo phần; pipeline giảm cả hai thành các hàng bản chụp và một bảng tỷ lệ. Hình dạng dưới đây là những gì actor trả về, cắt gọn về một phần.
json
// Lược đồ là những gì scraper.amazon (loại: rufus) trả về; giá trị trường là một mẫu minh họa từ một lần chạy trực tiếp (các phần và sản phẩm đã được cắt).
{
"metadata": { "type": "rufus", "rawUrl": "https://…" },
"result": {
"user_query": "tai nghe chống ồn tốt nhất",
"content_blocks": [
{
"type": "product_section",
"category": "Lựa Chọn Hàng Đầu – ANC Tốt Nhất",
json
"products": [
{
"asin": "B0GN4CFF6H",
"title": "Tai nghe không dây chống ồn Sony WH-1000XM6/B",
"price": "398,00 USD",
"original_price": "428,00 USD",
"rating": "4.5",
"reviews": "238",
"delivery": "Giao hàng MIỄN PHÍ vào thứ Sáu, 19 tháng 6",
"url": "https://…"
}
]
}
],
"products": [
{ "asin": "B0GN4CFF6H", "title": "Sony WH-1000XM6/B …", "category": "Lựa Chọn Hàng Đầu – ANC Tốt Nhất" }
],
"related_questions": ["So sánh Sony XM6 và Bose QC Ultra 2", "Có sản phẩm nào đang giảm giá không?"]
}
}
json
{
"snapshot": {
"query": "tai nghe chống ồn tốt nhất",
"captured_at": 1781716376,
"products": [
{ "asin": "B0GN4CFF6H", "rank": 1, "section": "Lựa Chọn Hàng Đầu – ANC Tốt Nhất", "brand": "Sony" },
{ "asin": "B0FDKR293G", "rank": 2, "section": "Lựa Chọn Hàng Đầu – ANC Tốt Nhất", "brand": "Bose" },
{ "asin": "B0GSS4SGZR", "rank": 3, "section": "Tốt Nhất cho Người Dùng Apple", "brand": "Apple" }
]
},
"share_of_recommendation": { "Sony": 33.3, "Bose": 33.3, "Apple": 33.3 }
}
A few honest observations from running it:
- Câu trả lời theo từng phiên. Cùng một truy vấn trả về một bộ gợi ý khác nhau, và các
related_questionscũng khác nhau, từ lần chạy này sang lần khác. Lưucaptured_attrên mỗi bản ghi; chuỗi theo thời gian là tín hiệu, không phải là một lần thu thập đơn lẻ. - Các phần tạo khung cho thứ hạng.
sectioncủa một sản phẩm (content_blocks[].category) giải thích tại sao nó lại có thứ hạng như vậy — "Tốt Nhất cho Người Dùng Apple" là một kệ khác với "Lựa Chọn Giá Trị Tốt". Mang theo phần, không chỉ vị trí. - Các trường có thể có giá trị null.
bought,original_price, vàdeliveryxuất hiện ở một số sản phẩm và không xuất hiện ở những sản phẩm khác; một slot chưa hoàn chỉnh có thể xuất hiện mà không cótitlehoặcasin. Đọc từng trường với.get()và bỏ qua hàng nếu không có giá trị. - Khu vực quyết định xem có câu trả lời hay không. Một cửa hàng không được hỗ trợ trả về một lỗi khu vực thay vì sản phẩm. Ghi lại khu vực mà bạn theo dõi và ghi lại những lần bỏ qua là bỏ lỡ.
Xử lý điều này một cách có trách nhiệm
Pipeline này chỉ đọc các gợi ý sản phẩm công khai mà Rufus hiển thị cho bất kỳ khách mua sắm nào — ASIN, tiêu đề, giá, xếp hạng và nhãn phần. Giữ vững bề mặt công khai đó: không thu thập dữ liệu cá nhân và nội dung có giới hạn tài khoản, tôn trọng điều khoản dịch vụ và chỉ lưu trữ các trường sản phẩm mà chương trình giám sát cần. Tỷ lệ gợi ý là một chỉ số về sự hiển thị thương hiệu được xây dựng từ các danh sách công khai, không hơn.
Kết luận: một kệ trò chuyện như một chuỗi thời gian
Giám sát Amazon Rufus giảm xuống một vòng lặp: ghi lại mỗi truy vấn chống lại tác nhân scraper.amazon với type: rufus, trích xuất ASIN cộng với thứ hạng cộng với phần từ content_blocks, ánh xạ từng ASIN tới một thương hiệu, thêm một bản ghi snapshot theo phiên, và chênh lệch các bản snapshot để tính tỷ lệ gợi ý. Ghi lại khu vực, coi mỗi trường là có thể null, ghi lại câu trả lời thiếu là bỏ qua, và cho phép related_questions mở rộng bộ truy vấn. Hình thức giám sát tương tự áp dụng cho các bề mặt câu trả lời khác — ghép Rufus với scraping Google's AI Overviews cho một chương trình xuyên suốt giữa cả hai trợ lý mua sắm và tìm kiếm. Tác nhân, endpoint và tên trường ở đây được xác nhận với tài liệu Scrapeless Scraping API trực tiếp.
Sẵn sàng xây dựng Pipeline Giám sát Gợi ý AI của bạn?
Tham gia cộng đồng của chúng tôi để nhận một kế hoạch miễn phí và kết nối với các nhà phát triển xây dựng các pipeline dữ liệu câu trả lời AI: Discord · Telegram.
Đăng ký tại app.scrapeless.com để nhận tín dụng dùng thử miễn phí và chỉ định bộ truy vấn ở trên cho các danh mục và khu vực mà chương trình hiển thị thương hiệu của bạn theo dõi.
Câu hỏi thường gặp
Q: Giám sát các gợi ý của Amazon Rufus có hợp pháp không?
Dữ liệu được thu thập là các gợi ý sản phẩm công khai mà Rufus hiển thị cho bất kỳ khách mua sắm nào. Giống như bất kỳ công việc scrape nào, tính hợp pháp phụ thuộc vào khu vực và cách sử dụng — xem xét các điều khoản liên quan và tham khảo ý kiến luật sư trước khi xây dựng dựa trên nó, và chỉ thu thập dữ liệu sản phẩm công khai, không bao giờ dữ liệu cá nhân hoặc dữ liệu bị khóa theo tài khoản.
Q: Tại sao một truy vấn không trả về câu trả lời từ Rufus?
Hai nguyên nhân. Truy vấn có thể không đủ giao dịch — hãy diễn đạt nó như một câu hỏi mua hàng với ý định sản phẩm rõ ràng. Hoặc khu vực bạn nhắm tới không có bề mặt Rufus, trong trường hợp đó, diễn viên báo cáo về một sự cố khu vực cho cửa hàng đó; hãy gán một khu vực được hỗ trợ và ghi nhận sự thiếu sót đó như là một lượt bỏ qua.
H: Tôi có cần một proxy hoặc trình duyệt không?
Không. Việc kết xuất, xử lý khu vực và phân tích diễn ra ở phía máy chủ. Bạn gửi một POST với tiêu đề x-api-token và nhận lại JSON; diễn viên trả về bộ khuyến nghị đã được cấu trúc.
H: Làm thế nào để tôi có được thứ hạng và phần mà một sản phẩm xuất hiện?
Đi qua result.content_blocks: mỗi khối product_section mang một tiêu đề category và mảng products riêng. Đếm các sản phẩm khi bạn làm phẳng các khối sẽ cho thứ hạng tổng thể, và category của khối sẽ cho phần — cả hai điều này đều đáng để lưu trữ theo từng bản chụp.
H: Share-of-recommendation là gì?
Đó là tỷ lệ phần trăm các vị trí được khuyến nghị mà một thương hiệu chiếm trong một truy vấn hoặc một tập hợp truy vấn, tổng hợp từ các sản phẩm đã được ghi nhận. Theo dõi theo thời gian, nó cho thấy một thương hiệu đang tăng hay giảm sự hiện diện trên kệ Rufus — tương đương với việc chia sẻ tiếng nói trong mua sắm qua hội thoại.
H: Tại sao lại lưu trữ bản chụp thay vì một cái nhìn hiện tại duy nhất?
Rufus tạo ra câu trả lời của nó theo từng phiên, vì vậy bất kỳ bản chụp nào cũng chỉ là một điểm tại thời gian. Các bản chụp chỉ bổ sung được khóa bởi truy vấn và thời gian chụp giúp bạn có lịch sử để so sánh, do đó bạn có thể báo cáo các ASIN nào đã vào hoặc rời khỏi giữa các lần chạy thay vì phải đoán từ một phản hồi duy nhất.
H: Tôi có thể theo dõi bao nhiêu truy vấn cùng một lúc?
Giữ cho độ đồng thời ở mức vừa phải — một vài truy vấn cùng lúc là đủ cho một quá trình theo dõi ổn định. Hạn chế tập hợp vào những câu hỏi mà bạn hành động và để related_questions gợi ý những câu hỏi tiếp theo cần thêm vào, do đó mỗi cuộc gọi tính phí đều được ghi nhận.
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.



