Tự động hóa việc thu thập danh sách bất động sản với Scrapeless và quy trình n8n

Advanced Data Extraction Specialist
Trong ngành bất động sản, tự động hóa quy trình thu thập danh sách bất động sản mới nhất và lưu trữ chúng ở định dạng có cấu trúc để phân tích là chìa khóa để nâng cao hiệu quả. Bài viết này sẽ cung cấp hướng dẫn từng bước về cách sử dụng nền tảng tự động hóa mã thấp n8n, kết hợp với dịch vụ thu thập dữ liệu web Scrapeless, để thường xuyên thu thập danh sách cho thuê từ trang web bất động sản LoopNet và tự động ghi dữ liệu bất động sản có cấu trúc vào Google Sheets để dễ dàng phân tích và chia sẻ.
1. Mục tiêu và Kiến trúc Quy trình làm việc
Mục tiêu: Tự động lấy danh sách đang bán/cho thuê mới nhất từ một nền tảng bất động sản thương mại (ví dụ: Crexi / LoopNet) theo lịch trình hàng tuần.
Vượt qua các cơ chế chống thu thập dữ liệu và lưu trữ dữ liệu ở định dạng có cấu trúc trong Google Sheets, giúp dễ dàng cho việc báo cáo và trực quan hóa BI.
Kiến trúc Quy trình làm việc Cuối cùng:

2. Chuẩn bị
- Đăng ký tài khoản trên trang web chính thức của Scrapeless và nhận API Key của bạn (2.000 yêu cầu miễn phí mỗi tháng).
- Đăng nhập vào Bảng điều khiển Scrapeless
- Sau đó nhấp "Cài đặt" ở bên trái -> chọn "Quản lý API Key" -> nhấp "Tạo API Key". Cuối cùng, nhấp vào API Key bạn đã tạo để sao chép nó.

- Đảm bảo bạn đã cài đặt phiên bản cộng đồng của nút Scrapeless trong n8n

- Một tài liệu Google Sheets với quyền ghi và thông tin đăng nhập API tương ứng.
3. Tổng quan các bước Quy trình làm việc
Bước | Loại Nút | Mục đích |
---|---|---|
1 | Kích hoạt theo lịch | Tự động kích hoạt quy trình làm việc mỗi 6 giờ. |
2 | Bộ thu thập Scrapeless | Thu thập nội dung trang LoopNet và trả về nội dung đã thu thập ở định dạng markdown. |
4 | Nút Mã (Phân tích Danh sách) | Trích xuất trường markdown từ đầu ra của Scrapeless; sử dụng regex để phân tích markdown và trích xuất dữ liệu danh sách bất động sản có cấu trúc. |
6 | Thêm vào Google Sheets | Ghi dữ liệu bất động sản có cấu trúc vào một tài liệu Google Sheets. |
4. Cấu hình Chi tiết và Giải thích Mã
1. Kích hoạt theo lịch
- Loại Nút: Kích hoạt theo lịch
- Cấu hình: Đặt khoảng thời gian thành hàng tuần (hoặc điều chỉnh theo nhu cầu).
- Mục đích: Tự động kích hoạt quy trình thu thập dữ liệu theo lịch trình, không cần hành động thủ công.
2. Nút Bộ thu thập Scrapeless
- Loại Nút: Nút API Scrapeless (
crawler - crawl
) - Cấu hình:
- URL: Trang LoopNet mục tiêu, ví dụ:
https://www.loopnet.com/search/commercial-real-estate/los-angeles-ca/for-lease/
- API Key: Nhập API Key Scrapeless của bạn.
- Giới hạn các trang: 2 (điều chỉnh theo nhu cầu).
- URL: Trang LoopNet mục tiêu, ví dụ:
- Mục đích: Tự động thu thập nội dung trang và xuất nội dung trang web ở định dạng markdown.
3. Phân tích Danh sách
- Mục đích: Trích xuất dữ liệu bất động sản thương mại quan trọng từ nội dung trang web định dạng markdown mà Scrapeless đã thu thập, và tạo ra danh sách dữ liệu có cấu trúc.
- Mã:
const markdownData = [];
$input.all().forEach((item) => {
item.json.forEach((c) => {
markdownData.push(c.markdown);
});
});
const results = [];
function dataExtact(md) {
const re = /\[Chi tiết hơn cho ([^\]]+)\]\((https:\/\/www\.loopnet\.com\/Listing\/[^\)]+)\)/g;
let match;
while ((match = re.exec(md))) {
const title = match[1].trim();
const link = match[2].trim()?.split(' ')[0];
// Trích xuất một đoạn ngữ cảnh xung quanh kết quả
const context = md.slice(match.index, match.index + 500);
// Trích xuất phạm vi kích thước, ví dụ: "10,000 - 20,000 SF"
const sizeMatch = context.match(/([\d,]+)\s*-\s*([\d,]+)\s*SF/);
const sizeRange = sizeMatch ? `${sizeMatch[1]} - ${sizeMatch[2]} SF` : null;
// Trích xuất năm xây dựng, ví dụ: "Xây dựng năm 1988"
const yearMatch = context.match(/Xây dựng năm\s*(\d{4})/i);
const yearBuilt = yearMatch ? yearMatch[1] : null;
// Trích xuất URL hình ảnh
javascript
const imageMatch = context.match(/!\[[^\]]*\]\((https:\/\/images1\.loopnet\.com[^\)]+)\)/);
const image = imageMatch ? imageMatch[1] : null;
results.push({
json: {
title,
link,
size: sizeRange,
yearBuilt,
image,
},
});
// Trả về markdown gốc nếu không tìm thấy kết quả (để gỡ lỗi)
if (results.length === 0) {
return [
{
json: {
error: 'Không tìm thấy danh sách nào',
raw: md,
},
},
];
}
}
markdownData.forEach((item) => {
dataExtact(item);
});
return results;

4. Google Sheets Thêm (Nút Google Sheets)
- Hoạt động: Thêm
- Cấu hình:
- Chọn tệp Google Sheets mục tiêu.
- Tên Sheet: Ví dụ,
Báo cáo thị trường bất động sản
. - Cấu hình ánh xạ cột: Ánh xạ các trường dữ liệu tài sản đã cấu trúc đến các cột tương ứng trong bảng.
Cột Google Sheets | Trường JSON ánh xạ |
---|---|
Tiêu đề | {{ $json.title }} |
Liên kết | {{ $json.link }} |
Kích thước | {{ $json.size }} |
Năm xây dựng | {{ $json.yearBuilt }} |
Hình ảnh | {{ $json.image }} |


Lưu ý:
Khuyến nghị rằng tên bảng tính của bạn nên nhất quán với của chúng tôi. Nếu bạn cần sửa đổi tên cụ thể, bạn cần chú ý đến mối quan hệ ánh xạ.
5. Đầu ra kết quả

5. Sơ đồ quy trình làm việc

6. Mẹo gỡ lỗi
- Khi chạy từng nút Mã, mở đầu ra của nút để kiểm tra định dạng dữ liệu đã trích xuất.
- Nếu nút Phân tích danh sách không trả về dữ liệu, hãy kiểm tra xem đầu ra của Scrapeless có chứa nội dung markdown hợp lệ hay không.
- Nút Định dạng đầu ra chủ yếu được sử dụng để làm sạch và chuẩn hóa đầu ra nhằm đảm bảo ánh xạ các trường chính xác.
- Khi kết nối nút Google Sheets Thêm, hãy đảm bảo rằng xác thực OAuth của bạn đã được cấu hình chính xác.
7. Tối ưu hóa trong tương lai
- Loại bỏ trùng lặp: Tránh viết các danh sách tài sản trùng lặp.
- Lọc theo giá hoặc kích thước: Thêm bộ lọc để nhắm mục tiêu các danh sách cụ thể.
- Thông báo danh sách mới: Gửi cảnh báo qua email, Slack, v.v.
- Tự động hóa đa thành phố & đa trang: Tự động thu thập dữ liệu trên các thành phố và trang khác nhau.
- Trực quan hóa dữ liệu & Báo cáo: Xây dựng bảng điều khiển và tạo báo cáo từ dữ liệu đã cấu trúc.
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.