Cách Truyền Dữ Liệu Web Vào Snowflake bằng Scrapeless và Streaming Snowpipe
Senior Web Scraping Engineer
Các điểm chính:
- Dữ liệu web đã thu thập được tải xuống Snowflake mà không cần lược đồ cố định. Trình duyệt thu thập không có Scrapeless hiển thị một trang trong trình duyệt đám mây và phát ra JSON phân tách bằng dòng (NDJSON); Snowflake sẽ nhập nó vào một cột
VARIANT, vì vậy các trường mới không bao giờ làm hỏng việc tải. - Bốn phương pháp nạp dữ liệu, một hình dạng dữ liệu. Sử dụng
COPY INTOhàng loạt cho các lần tải một lần, Snowpipe cho các lô tệp liên tục, Snowpipe Streaming cho các hàng có độ trễ thấp, và kết nối Kafka cho các pipeline dựa trên sự kiện - tất cả đều đọc cùng một NDJSON mà Scrapeless sản xuất. - Kiến trúc hiệu suất cao của Snowpipe Streaming hiện đã có sẵn (GA từ tháng 9 năm 2025). Nó ghi các hàng trực tiếp qua SDK (Java, Python, Node.js) hoặc REST, với các kênh, mã thông báo offset, và khôi phục chính xác một lần - không có tệp tạm.
- Schema-on-read giữ cho dữ liệu thu thập linh hoạt. Truy vấn một cột
VARIANTvới ký hiệucol:field::typevà phân giải mảng vớiLATERAL FLATTEN- không cần di chuyển khi trang nguồn thêm một trường mới. - Snowflake CLI (
snow) là công cụ hiện tại. Cài đặt bằng cáchpip install snowflake-cli, sau đósnow sql -f ingest.sqlsẽ chạy toàn bộ thiết lập từ một tệp. - Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm thời gian chạy Trình duyệt thu thập miễn phí - đăng ký tại Trang web Scrapeless.
Giới thiệu: từ trang đã hiển thị đến bảng Snowflake
Các nhóm phân tích ngày càng muốn dữ liệu web - danh mục sản phẩm, danh sách, đánh giá, tín hiệu thị trường - trong cùng một kho chứa với dữ liệu bên thứ nhất của họ, vì vậy nó có thể kết nối, mô hình hóa và cung cấp cho BI. Snowflake là một điểm đến phổ biến vì loại VARIANT của nó lưu trữ JSON nửa cấu trúc một cách tự nhiên và làm cho nó có thể truy vấn bằng SQL.
Sự ma sát là khoảng cách giữa hai hệ thống. Các trang thu thập thường được hiển thị bằng JavaScript và chống bot; dữ liệu thường đến dưới dạng JSON lồng nhau mà kiểu của nó thay đổi khi trang nguồn thay đổi. Các bộ nạp được xây dựng thủ công mà ánh xạ mọi trường đến một cột sẽ ngừng hoạt động ngay lần đầu tiên trang thêm một trường.
Bài viết này hướng dẫn một quy trình làm việc theo hướng dòng lệnh nhằm thu hẹp khoảng cách đó. Trình duyệt thu thập không có Scrapeless xử lý việc hiển thị và chống phát hiện và phát ra NDJSON; Snowflake sẽ nhập nó theo bốn cách khác nhau phụ thuộc vào mức độ tươi mới của dữ liệu. Nhà sản xuất ví dụ là công cụ thu thập công khai books.toscrape.com, vì vậy mọi lệnh bên dưới đều có thể tái tạo - cùng một mẫu áp dụng cho các mục tiêu khó khăn hơn (xem các hướng dẫn tương tự Các trình thu thập dữ liệu Zillow tốt nhất năm 2026 và Các trình thu thập dữ liệu Amazon tốt nhất năm 2026).
Bạn có thể làm gì với nó
- Xây dựng một lakehouse dữ liệu web. Nhập dữ liệu danh mục và danh sách đã thu thập vào Snowflake và kết nối chúng với dữ liệu bán hàng hoặc hàng tồn kho nội bộ.
- Chạy các bản chụp thị trường theo lịch. Nhập một tệp NDJSON mới mỗi lần chạy vào một giai đoạn và để Snowpipe tự động tải nó trong vòng vài phút.
- Cung cấp bảng điều khiển gần thời gian thực. Phát các sự kiện đã thu thập hàng dòng với Snowpipe Streaming để độ tươi mới chưa đầy một phút.
- Kết nối với một nền tảng Kafka hiện có. Đưa các bản ghi thu thập vào một chủ đề và để kết nối Kafka Snowflake tiếp nhận chúng.
- Giữ cho lược đồ linh hoạt. Lưu trữ JSON thô trong
VARIANTvà định hình nó vào thời điểm truy vấn, vì vậy các thay đổi của trang nguồn không bao giờ cản trở một lần tải.
Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu công khai có sẵn trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật của trang web hiện hành. Nội dung trong bài viết này chỉ dành cho mục đích trình diễn.
Tại sao chọn Scrapeless Scraping Browser
Scrapeless Scraping Browser là một trình duyệt đám mây tùy chỉnh, chống phát hiện, được thiết kế cho các crawler web và AI agents. Là mặt hàng sản xuất của một pipeline Snowflake, nó mang lại:
- Chức năng hiển thị JavaScript trên đám mây, vì vậy dữ liệu có mặt trong DOM trước khi trích xuất
- Proxy dân cư tại hơn 195 quốc gia, gắn cố định theo phiên
- Phát hiện chống lại fingerprint trình duyệt
- Một bề mặt CLI
scrapeless-scraping-browserduy nhất vớievaltrả về JSON mà bạn có thể tái hình thành thành NDJSON chỉ trong một bước - Duy trì phiên cho các phiên thu thập nhiều trang
Nhận khóa API của bạn trong gói miễn phí tại Trang web Scrapeless.
Yêu cầu trước khi bắt đầu
- Node.js phiên bản 18 hoặc mới hơn
- Tài khoản Scrapeless và khóa API - đăng ký tại Trang web Scrapeless
- Tài khoản Snowflake với vai trò có thể tạo cơ sở dữ liệu, kho chứa, giai đoạn và pipe
- Snowflake CLI:
pip install snowflake-cli(Python 3.10+) - Đối với Snowpipe tự động nhập và các giai đoạn bên ngoài: một bucket đám mây (AWS S3, GCS, hoặc Azure) và quyền tạo tích hợp lưu trữ
jqlà tùy chọn (một đoạn mã Node thay thế được hiển thị cho việc chuyển đổi NDJSON)
Cấu hình kết nối Snowflake một lần, trong ~/.snowflake/config.toml:
toml
[connections.demo]
account = "myorg-myaccount"
user = "jondoe"
vi
mat_khau = "your_password_here"
kho = "ingest_wh"
co_so = "web_data"
schema = "raw"
vai_tro = "sysadmin"
Sau đó snow sql -c demo -q "SELECT CURRENT_VERSION();" xác nhận nó hoạt động.
Quy trình tổng quan
Trình duyệt Scraping không mệt mỏi → tệp NDJSON → giai đoạn Snowflake → bảng (VARIANT)
(render + extract) (một đối tượng (nội bộ hoặc COPY INTO | một lần
mỗi dòng) thùng bên ngoài) Snowpipe | liên tục
Streaming | độ trễ thấp
Kafka | theo sự kiện
Hình dạng không bao giờ thay đổi: Scrapeless phát ra một đối tượng JSON cho mỗi dòng, tệp được đưa vào một giai đoạn, và một trong bốn phương pháp tải nó vào cột VARIANT mà bạn truy vấn bằng SQL.
Bước 1 — Tạo NDJSON với Scrapeless
Cài đặt CLI và thiết lập khóa của bạn:
bash
npm install -g scrapeless-scraping-browser
scrapeless-scraping-browser config set apiKey your_api_token_here
Mở một phiên cloud, điều hướng đến trang danh mục, chờ một dấu hiệu ổn định, và trích xuất các bản ghi sách với eval. JSON new-session lồng ghép id dưới data.taskId — sử dụng jq, hoặc lệnh grep có thể truy cập như sau:
bash
# mở một phiên và ghi lại id nhiệm vụ (đường dẫn jq là .data.taskId)
SID=$(scrapeless-scraping-browser new-session --name books --ttl 300 --proxy-country US --json | jq -r '.data.taskId')
# không có jq? phương pháp thay thế có thể:
# SID=$(scrapeless-scraping-browser new-session --name books --ttl 300 --proxy-country US --json | grep -oE '"taskId":"[^"]*"' | head -1 | cut -d'"' -f4)
# render trang danh mục, sau đó chờ lưới sản phẩm
scrapeless-scraping-browser --session-id "$SID" open "https://books.toscrape.com/catalogue/page-1.html"
scrapeless-scraping-browser --session-id "$SID" wait "article.product_pod"
# trích xuất một bản ghi cho mỗi sách; eval trả về một mảng JSON
scrapeless-scraping-browser --session-id "$SID" eval '
JSON.stringify(Array.from(document.querySelectorAll("article.product_pod")).map(el => ({
title: el.querySelector("h3 a")?.getAttribute("title") ?? null,
price: el.querySelector(".price_color")?.textContent.trim() ?? null,
rating: el.querySelector("p.star-rating")?.className.replace("star-rating", "").trim() ?? null,
in_stock: /In stock/i.test(el.querySelector(".availability")?.textContent ?? ""),
url: el.querySelector("h3 a")?.href ?? null
})))
' > books.raw.json
scrapeless-scraping-browser --session-id "$SID" close
Chuyển đổi mảng thành NDJSON — một đối tượng mỗi dòng, đó là định dạng mà các bộ tải của Snowflake đọc sạch nhất:
bash
# với jq
jq -c '.[]' books.raw.json > books.ndjson
# hoặc, không có jq, một dòng lệnh Node
node -e 'JSON.parse(require("fs").readFileSync("books.raw.json","utf8")).forEach(o=>console.log(JSON.stringify(o)))' > books.ndjson
books.ndjson bây giờ chứa một đối tượng JSON tự chứa cho mỗi dòng. Nếu một phiên lạnh trả về một shell trống hoặc một os error 10054 tạm thời, hãy đóng phiên, tạo một phiên mới và thử lại một số lần trước khi trích xuất.
Bước 2 — Chuẩn bị Snowflake
Tạo kho, cơ sở dữ liệu, schema, định dạng tệp JSON, và một bảng hạ cánh với một cột VARIANT duy nhất. Lưu lại như setup.sql và chạy nó với snow sql -c demo -f setup.sql:
sql
CREATE WAREHOUSE IF NOT EXISTS ingest_wh WITH WAREHOUSE_SIZE = 'XSMALL' AUTO_SUSPEND = 60;
CREATE DATABASE IF NOT EXISTS web_data;
CREATE SCHEMA IF NOT EXISTS web_data.raw;
USE WAREHOUSE ingest_wh;
USE SCHEMA web_data.raw;
-- NDJSON: một đối tượng JSON mỗi dòng, vì vậy không nên loại bỏ mảng ngoài
CREATE OR REPLACE FILE FORMAT ndjson_format
TYPE = JSON
STRIP_OUTER_ARRAY = FALSE
COMPRESSION = AUTO;
-- hạ cánh bản ghi thô như thế; định hình nó vào thời gian truy vấn
CREATE OR REPLACE TABLE raw_books (
src VARIANT,
loaded_at TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()
);
STRIP_OUTER_ARRAY = FALSE là chính xác cho NDJSON vì mỗi dòng đã là đối tượng của riêng nó — STRIP_OUTER_ARRAY = TRUE chỉ dành cho một tệp mà là một mảng lớn [ ... ].
Bước 3 — Phương pháp 1: Tải lớn một lần với COPY INTO
Đối với một tệp đơn hoặc một lô thủ công, đưa tệp vào giai đoạn và chạy COPY INTO. Con đường đơn giản nhất là một giai đoạn nội bộ được đặt tên cộng với PUT:
sql
-- một giai đoạn nội bộ có tên gắn bó với định dạng JSON
CREATE OR REPLACE STAGE books_stage FILE_FORMAT = ndjson_format;
bash
# tải NDJSON cục bộ lên giai đoạn nội bộ (snow CLI chạy PUT)
snow sql -c demo -q "PUT file://$(pwd)/books.ndjson @books_stage AUTO_COMPRESS=TRUE OVERWRITE=TRUE"
sql
-- tải mỗi đối tượng thành một hàng vào cột VARIANT
COPY INTO raw_books (src)
FROM @books_stage
FILE_FORMAT = (FORMAT_NAME = 'ndjson_format')
ON_ERROR = 'CONTINUE';
Để ánh xạ các khóa JSON trực tiếp vào các cột đã định kiểu thay vì một VARIANT, hãy tạo một bảng mà tên các cột khớp với các khóa và sử dụng MATCH_BY_COLUMN_NAME:
sql
CREATE OR REPLACE TABLE books (
title VARCHAR, price VARCHAR, rating VARCHAR, in_stock BOOLEAN, url VARCHAR
);
COPY INTO books
FROM @books_stage
FILE_FORMAT = (TYPE = 'JSON')
MATCH_BY_COLUMN_NAME = 'CASE_INSENSITIVE';
Nếu bạn muốn để Snowflake suy diễn cấu trúc từ các tệp đã lưu trữ, INFER_SCHEMA với CREATE TABLE … USING TEMPLATE sẽ xây dựng danh sách cột cho bạn:
sql
CREATE OR REPLACE TABLE books_auto
USING TEMPLATE (
SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
FROM TABLE(INFER_SCHEMA(
LOCATION => '@books_stage',
FILE_FORMAT => 'ndjson_format'
))
);
Đối với dữ liệu đã có trong một bucket đám mây, hãy chỉ định một giai đoạn bên ngoài đến nó thay vì tải lên. Với một tích hợp lưu trữ (không có khóa nội tuyến):
sql
CREATE OR REPLACE STAGE books_s3_stage
URL = 's3://my-bucket/scraped/books/'
STORAGE_INTEGRATION = my_s3_integration
FILE_FORMAT = ndjson_format;
COPY INTO raw_books (src) FROM @books_s3_stage;
Lấy khóa API của bạn trong kế hoạch miễn phí: app.scrapeless.com
Bước 4 — Phương pháp 2: Lô liên tục với Snowpipe
Khi trình thu thập dữ liệu thả một tệp mới vào một bucket theo lịch trình, Snowpipe tự động tải mỗi tệp — không cần COPY thủ công và không cần kho dữ liệu riêng. Một ống bọc một câu lệnh COPY INTO; với AUTO_INGEST = TRUE, thông báo sự kiện trên đám mây kích hoạt tải:
sql
CREATE OR REPLACE PIPE books_pipe
AUTO_INGEST = TRUE
AWS_SNS_TOPIC = 'arn:aws:sns:us-east-1:123456789012:scraped-bucket'
AS
COPY INTO raw_books (src)
FROM @books_s3_stage
FILE_FORMAT = (TYPE = 'JSON');
Trên S3, sự kiện chảy qua SNS/SQS vào một hàng đợi được quản lý bởi Snowflake; GCS sử dụng Pub/Sub và Azure sử dụng Event Grid, mỗi dịch vụ được kết nối với một tích hợp thông báo. Nếu bạn muốn gọi Snowpipe một cách trực tiếp, hãy để AUTO_INGEST không được thiết lập và gửi các đường dẫn tệp đã lưu trữ tới điểm cuối REST insertFiles, sau đó kiểm tra insertReport.
Hai ghi chú vận hành từ hướng dẫn của Snowflake:
- Tính phí là không có máy chủ và giờ đây được tính theo GB cho dữ liệu mà Snowpipe tiếp nhận — không có kho dữ liệu nào để điều chỉnh kích thước, và thành phần theo tệp trước đó đã ngừng hoạt động.
- Kích thước tệp quan trọng. Nhắm vào các tệp khoảng 100–250 MB nén, và không lưu trữ nhiều hơn khoảng một lần mỗi phút; lưu trữ thường xuyên hơn sẽ làm tăng chi phí quản lý hàng đợi mà không giảm độ trễ. Gộp các lô thu thập nhỏ vào các tệp lớn hơn trước khi lưu trữ.
Snowpipe làm cho dữ liệu có sẵn trong vòng vài phút, điều này rất phù hợp cho các snapshot thị trường theo lịch trình.
Bước 5 — Phương pháp 3: Dòng dữ liệu độ trễ thấp với Snowpipe Streaming
Khi độ tươi phải tính bằng giây, không phải phút, Snowpipe Streaming ghi các hàng dữ liệu trực tiếp vào một bảng — không có tệp đã lưu trữ. Kiến trúc hiệu suất cao đã có sẵn kể từ tháng 9 năm 2025, với SDK cho Java, Python và Node.js cùng với một API REST qua một lõi khách hàng chung; Snowpipe Streaming dựa trên tệp cổ điển đang trên đường ngừng hoạt động.
Mô hình có ba khái niệm cốt lõi:
- Kênh — một kết nối dòng có tên, dài hạn tới một bảng. Các hàng được cam kết theo thứ tự trong một kênh.
- Mã thông báo bù — một chuỗi mà ứng dụng của bạn gán cho mỗi lô. Sau khi khởi động lại,
getLatestCommittedOffsetToken()cho bạn biết vị trí đã cam kết bền bỉ cuối cùng, vì vậy bạn chỉ phát lại những gì tiếp theo — cơ sở cho việc giao hàng đúng một lần. - Tính phí qua tốc độ — tín dụng per GB không nén tiếp nhận, thay vì per tệp.
Hình dạng của khách hàng Java là nhỏ:
java
SnowflakeStreamingIngestClient client =
SnowflakeStreamingIngestClientFactory.builder("BOOKS_CLIENT")
.setProperties(props).build();
OpenChannelRequest request = OpenChannelRequest.builder("BOOKS_CHANNEL")
.setDBName("WEB_DATA").setSchemaName("RAW").setTableName("RAW_BOOKS")
.setOnErrorOption(OpenChannelRequest.OnErrorOption.CONTINUE)
.build();
SnowflakeStreamingIngestChannel channel = client.openChannel(request);
channel.insertRow(rowAsMap, offsetToken); // một bản ghi được thu thập
channel.getLatestCommittedOffsetToken(); // để phục hồi
Sử dụng Streaming khi các bản ghi thu thập đến dưới dạng một luồng liên tục (một tác nhân phát sự kiện khi nó thu thập dữ liệu) và bảng điều khiển cần chúng trong vòng vài giây.
Bước 6 — Phương pháp 4: Tải dữ liệu theo sự kiện với connector Kafka
Nếu các bản ghi thu thập dữ liệu đã chảy qua Apache Kafka, Snowflake Connector for Kafka sẽ đưa một chủ đề vào một bảng (một chủ đề ánh xạ đến một bảng). Nó chạy bên trong một worker Kafka Connect. Một thuộc tính đơn lẻ chọn động cơ tiếp nhận bên dưới:
properties
name=scraped-books-sink
connector.class=com.snowflake.kafka.connector.SnowflakeSinkConnector
topics=scraped_books
snowflake.database.name=WEB_DATA
snowflake.schema.name=RAW
# SNOWPIPE (dựa trên tệp, mặc định) hoặc SNOWPIPE_STREAMING (độ trễ thấp)
snowflake.ingestion.method=SNOWPIPE_STREAMING
Mỗi bảng mà trình kết nối tạo ra có hai cột VARIANT: RECORD_CONTENT (nội dung tin nhắn) và RECORD_METADATA (chủ đề, phân vùng, offset, thời gian và tiêu đề). Truy vấn nội dung chính xác như bạn sẽ làm với bất kỳ VARIANT nào.
Đối với một lựa chọn quản lý hoàn toàn — không cần vận hành cụm Kafka Connect — Snowflake Openflow (có sẵn chung, được xây dựng trên Apache NiFi) tiếp nhận từ Kafka, Kinesis, cơ sở dữ liệu và các nguồn SaaS vào Snowflake thông qua các đường ống được quản lý.
Chọn phương pháp
| Phương pháp | Độ trễ | Hình dạng dữ liệu | Khối lượng công việc | Sử dụng khi |
|---|---|---|---|---|
COPY INTO |
Thủ công | Tệp trong một giai đoạn | Thấp nhất | Tải một lần, bổ sung dữ liệu |
| Snowpipe | Phút | Tệp được thả vào một xô | Thấp (không máy chủ) | Tập hợp quét theo lịch trình |
| Snowpipe Streaming | Giây | Hàng qua SDK/REST | Trung bình (viết một khách hàng) | Dòng sự kiện liên tục |
| Kafka connector | Giây–phút | Hồ sơ chủ đề Kafka | Trung bình (kết nối công nhân) | Một hệ thống Kafka hiện có |
Hầu hết các nhóm bắt đầu với COPY INTO để xác thực schema, chuyển sang Snowpipe khi trình quét chạy theo lịch trình, và áp dụng Streaming hoặc Kafka chỉ khi tính mới dưới một phút biện minh cho việc thêm phần chuyển động.
Truy vấn dữ liệu đã tải
Bởi vì bản ghi thô nằm trong một VARIANT, bạn định hình nó tại thời điểm đọc. Di chuyển với toán tử : và chuyển đổi với :::
sql
SELECT
src:title::string AS title,
src:price::string AS price,
src:rating::string AS rating,
src:in_stock::boolean AS in_stock,
src:url::string AS url
FROM raw_books;
Khi một bản ghi được quét mang theo một mảng — danh sách photos, chuỗi priceHistory — LATERAL FLATTEN sẽ tách nó thành các hàng:
sql
-- raw_listings: một bảng danh sách được quét giả định được tải theo cách giống như raw_books.
-- (Ví dụ về sách không có mảng lồng nhau; điều này cho thấy mẫu cho một nguồn có.)
SELECT
src:title::string AS title,
ph.value:date::string AS price_date,
ph.value:price::number AS price
FROM raw_listings,
LATERAL FLATTEN(INPUT => src:priceHistory) ph;
Không cần di chuyển khi trang nguồn thêm một trường — nó đơn giản xuất hiện dưới src trong lần tải tiếp theo.
Những gì bạn nhận được
Sau COPY INTO, mỗi đối tượng được quét là một hàng trong raw_books. Cột VARIANT giữ lại bản ghi nguyên văn; schema dưới đây là chuẩn mực và các giá trị trường là mẫu minh họa:
json
// Một hàng src VARIANT, như được phát ra bởi bộ trích xuất Bước 1.
{
"title": "A Light in the Attic",
"price": "£51.77",
"rating": "Three",
"in_stock": true,
"url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
}
Một vài quan sát chính xác:
- Giá sẽ đến dưới dạng chuỗi hiển thị. Chuyển đổi và làm sạch trong SQL (
REPLACE(src:price::string, '£', '')::number) thay vì mong đợi số từ trang. - Trường điều kiện có thể là null. Một trường vắng mặt trên một trang nhất định đơn giản sẽ thiếu trong
src; truy cậpVARIANTsẽ trả vềNULLthay vì báo lỗi. MATCH_BY_COLUMN_NAMEbỏ qua các khóa không khớp. Các khóa mới sẽ tự động xuất hiện trong một bảngVARIANTnhưng sẽ bị bỏ qua bởi một bảng có kiểu cho đến khi bạn thêm cột.- Lịch sử tải Snowpipe được giữ trong 14 ngày trong metadata ống; lịch sử tải
COPYhàng loạt được giữ trong 64 ngày trong metadata bảng — hãy ghi nhớ điều đó khi kiểm toán một bổ sung dữ liệu.
Kết luận
Việc đưa dữ liệu web được quét vào Snowflake giảm xuống còn bốn bước: trình diễn và trích xuất với Scrapeless, phát ra NDJSON, giai đoạn tệp và tải nó bằng phương pháp có độ trễ phù hợp — COPY INTO, Snowpipe, Snowpipe Streaming hoặc trình kết nối Kafka. Đưa bản ghi thô vào một cột VARIANT và định hình nó tại thời điểm truy vấn, vì vậy pipeline có thể tồn tại khi trang nguồn thêm các trường.
Ghi lại US egress khi mục tiêu cần thiết, giữ chuỗi phiên Scrapeless trong một lệnh shell, theo dõi mẫu khám phá → trích xuất, và coi các trường vắng mặt là có thể null. Đối với các mục tiêu khó hơn so với sandbox được sử dụng ở đây, mẫu nhà sản xuất tương tự sẽ được chuyển giao — xem hướng dẫn chị em Best Zillow Scrapers in 2026, trang sản phẩm Scraping Browser, và tài liệu Scrapeless.
Sẵn sàng để Xây dựng Pipeline Dữ liệu 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 web đến kho: Discord · Telegram.
Đăng ký tại Website Scrapeless để được sử dụng miễn phí thời gian chạy Scraping Browser, và xem scrapeless.com/en/pricing để mở rộng số phút phiên và khả năng đồng thời khi pipeline phát triển.
Câu hỏi thường gặp
Q1: Web scraping để thu thập dữ liệu kho có hợp pháp không?
Việc thu thập dữ liệu công khai là hợp lý, nhưng tính hợp pháp phụ thuộc vào điều khoản của trang web mục tiêu, quyền tài phán và loại dữ liệu. Hãy xem xét điều khoản dịch vụ của trang web, tránh dữ liệu cá nhân hoặc bị hạn chế, và tham khảo ý kiến luật sư trước khi sử dụng cho mục đích thương mại. Trang sandbox được sử dụng ở đây, books.toscrape.com, tồn tại cụ thể để thực hành thu thập dữ liệu.
C2: NDJSON hay mảng JSON - cái nào nên được scraper phát ra?
NDJSON (một đối tượng mỗi dòng) tải vào sạch hơn và phát trực tiếp mà không cần đệm cả tệp. Đặt STRIP_OUTER_ARRAY = FALSE. Nếu bộ phát của bạn phát ra một mảng [ ... ] duy nhất, hãy đặt STRIP_OUTER_ARRAY = TRUE để mỗi phần tử trở thành một hàng.
C3: Tôi nên lưu vào một cột VARIANT hay các cột kiểu?
Hãy lưu dữ liệu chưa xử lý vào một VARIANT và định hình nó bằng SQL — các trang nguồn thay đổi, và VARIANT hấp thụ các trường mới mà không cần di chuyển. Sử dụng MATCH_BY_COLUMN_NAME vào các cột kiểu chỉ khi nào sơ đồ ổn định.
C4: Tôi nên chọn phương pháp nạp nào?
COPY INTO cho các tải một lần, Snowpipe cho các lô tệp theo lịch (với độ trễ phút, không máy chủ), Snowpipe Streaming cho mức độ tươi mới theo hàng dưới một phút, và kết nối Kafka khi các bản ghi đã chảy qua Kafka. Bắt đầu với COPY INTO, sau đó nâng cấp khi nhu cầu tươi mới tăng lên.
C5: Tôi xử lý các lỗi tạm thời của scraper như os error 10054 hoặc 503 như thế nào?
Hãy coi chúng là tạm thời: đóng phiên Scrapeless, tạo một phiên mới, điều hướng lại, và chờ một bộ chọn ổn định trước khi trích xuất. Giữ cho số lần thử có giới hạn. Những điều này thuộc về phía bộ phát và không ảnh hưởng đến Snowflake, nơi mà tải bất cứ thứ gì vào vùng.
C6: Tôi có cần một kho chạy cho Snowpipe không?
Không. Snowpipe không máy chủ và được tính phí theo GB đã nạp — Snowflake cung cấp tính toán. Một kho do người dùng quản lý chỉ cần thiết cho COPY INTO hàng loạt và để truy vấn.
C7: Tôi có thể chạy điều này mà không có đại lý AI không?
Có. CLI scrapeless-scraping-browser sản xuất NDJSON đầu cuối từ một shell thông thường, và phía Snowflake là SQL thông thường. Một đại lý kết nối MCP là con đường thuận tiện, không phải là yêu cầ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.



