🥳Tham gia Cộng đồng Scrapelessnhận thử nghiệm miễn phí của bạn để truy cập Bộ công cụ Web Scraping mạnh mẽ của chúng tôi!
Quay lại blog

Cập nhật sản phẩm | Tính năng hồ sơ mới

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

17-Jul-2025

Để nâng cao tính thực tiễn và ổn định của Scraping Browser trong các tình huống phiên liên tiếp, chúng tôi đã chính thức ra mắt tính năng Hồ sơ để lưu trữ dữ liệu người dùng vĩnh viễn. Tính năng này lưu trữ dữ liệu trình duyệt (chẳng hạn như cookie, dữ liệu lưu trữ, bộ nhớ cache và trạng thái đăng nhập) trên đám mây, cho phép chia sẻ và tái sử dụng liền mạch giữa các phiên khác nhau — loại bỏ nhu cầu đăng nhập lại nhiều lần. Nó đơn giản hóa đáng kể quá trình gỡ lỗi và cải thiện hiệu suất của các kịch bản tự động hóa.


Tại sao lại giới thiệu Hồ sơ?

Trong các quy trình tự động hóa thực sự, người dùng thường cần “nhớ trạng thái đăng nhập”, “tái sử dụng cookie từ một lần thu thập cụ thể” và “đồng bộ hóa bộ nhớ cache trang giữa các tác vụ”. Các trình duyệt headless truyền thống khởi động trong một môi trường hoàn toàn mới mỗi lần và không thể giữ lại bất kỳ ngữ cảnh lịch sử nào. Tính năng Hồ sơ mới giải quyết vấn đề này bằng cách cho phép Scraping Browser hỗ trợ:

  • Lưu trữ lâu dài trạng thái đăng nhập, loại bỏ nhu cầu xác thực lại mỗi lần
  • Danh tính người dùng nhất quán giữa nhiều yêu cầu tới cùng một trang web
  • Tái sử dụng ngữ cảnh trình duyệt giữa các phiên trong quá trình gỡ lỗi kịch bản

Điểm nổi bật của bản cập nhật này

Trang Tạo và Quản lý Hồ sơ hiện đã hoạt động

Bạn có thể truy cập vào “Cho Scraping → Hồ sơ” để:

  • Tạo/Sửa/Bản sao/Xóa
  • Xem kích thước dữ liệu tệp, thời gian sử dụng gần nhất
  • Tìm Hồ sơ mục tiêu bằng tên hoặc ID
  • Sao chép ID chỉ với một cú nhấp chuột cho việc lập kịch bản hoặc tham khảo nhóm.

Trang Chi tiết Hồ sơ: Toàn bộ thông tin về cấu hình và lịch sử sử dụng

Truy cập bất kỳ Hồ sơ nào để xem cấu hình đầy đủ và hồ sơ sử dụng của nó, bao gồm:

  • Thông tin cơ bản: Tên hồ sơ, ID, kích thước dữ liệu, thời gian sử dụng gần nhất và tổng số lần sử dụng (tức là, số lần nó đã được sử dụng trong các phiên);
  • Hồ sơ Phiên liên kết:
    • Danh sách Phiên đang diễn ra: Các phiên thực tế hiện đang sử dụng Hồ sơ này;

    • Danh sách Lịch sử Phiên: Tất cả các phiên lịch sử nơi Hồ sơ này đã được sử dụng, với các mục có thể nhấp để xem chi tiết.

Điều này giúp quá trình gỡ lỗi trở nên minh bạch hơn và giúp tái hiện và truy dấu sự cố một cách hiệu quả hơn.


Tích hợp sâu với Hệ thống Phiên

Chúng tôi cũng đã thêm hiển thị thông tin Hồ sơ và điều hướng nhanh trong các giao diện sau:

  • Các Phiên đang hoạt động: Hiển thị Hồ sơ đang sử dụng (có thể nhấp để chuyển đến trang chi tiết Hồ sơ)
  • Lịch sử Phiên: Hiển thị Hồ sơ liên kết với từng phiên
  • Chi tiết Phiên: Cho phép bạn thấy Hồ sơ nào đã được sử dụng trong thời gian chạy cụ thể

Thuyết minh chức năng

Trường hợp 1: Đăng nhập vĩnh viễn + Tăng tốc độ tải

Mục tiêu: Mở tự động các trang yêu cầu đăng nhập mà không cần nhập tên đăng nhập và mật khẩu mỗi lần.

Các bước:

1. Cấu hình và lưu trạng thái đăng nhập lần đầu tiên.

Cách tạo một Hồ sơ:

  • Tạo Thủ công qua Bảng điều khiển: Tạo Hồ sơ thủ công thông qua Bảng điều khiển.
  • Tạo qua API: Tự động tạo Hồ sơ bằng API Tạo Hồ sơ.
  • Tạo qua SDK: Tạo Hồ sơ bằng phương pháp SDK.

NodeJS

Copy
import { Scrapeless } from "@scrapeless-ai/sdk"

const scrapeless = new Scrapeless({
     apiKey: "YOUR_API_KEY"
})

// tạo một hồ sơ mới
const profile = await scrapeless.profiles.create("scrapeless_profile")

console.log("Id hồ sơ:", profile.profileId)

Bắt đầu một phiên, sau đó chỉ định profile_id và kích hoạt chế độ lưu trữ, và đăng nhập thủ công một lần. Trạng thái đăng nhập (chẳng hạn như cookie và mã thông báo) sẽ tự động được lưu vào Hồ sơ trên đám mây.

NodeJS

Copy
import puppeteer from "puppeteer-core"
import { Scrapeless } from "@scrapeless-ai/sdk"

const scrapeless = new Scrapeless({
     apiKey: "YOUR_API_KEY"
});

async function main() {
    const proxy= "YOUR_PROXY"
    const profileId = "YOUR_PROFILE_ID" // thay thế bằng profileId của bạn
    const { browserWSEndpoint } = scrapeless.browser.create({
        proxy_country: "ANY",
        proxy_url: proxy,
        session_ttl: "900",
        session_name: "Hồ sơ Kiểm tra",
        profile_id: profileId, 
        profile_persist: true,
    });
    
    const browser = await puppeteer.connect({
        browserWSEndpoint,
        defaultViewport: null,
    })
    
    const page = await browser.newPage()
    await page.goto("https://the-internet.herokuapp.com/login", {
        timeout: 30000,
        waitUntil: "domcontentloaded",
    })
    
    const username = "tên đăng nhập của bạn"
    const password = "mật khẩu của bạn!"
    await page.type('[name="username"]', username)
    await page.type('[name="password"]', password)
    await Promise.all([
        page.click('button[type="submit"]'),
        page.waitForNavigation({ timeout: 15000 }).catch(() => { }),
    ])
    const successMessage = await page.$(".flash.success")
    if (successMessage) {
        console.log("✅ Đăng nhập thành công!")
    } else {
        console.log("❌ Đăng nhập thất bại.")
    }
    await browser.close()
}

main().catch(console.error)

2. Tự động tái sử dụng thông tin đăng nhập

  • Tái sử dụng cùng một profileId trong các script hoặc tác vụ tiếp theo
  • Bắt đầu một phiên mới tham chiếu đến profileId đã tạo trước đó, tự động đăng nhập vào https://the-internet.herokuapp.com/ và mở trang cá nhân

Trường hợp 1: Đăng nhập vĩnh viễn + Tăng tốc độ tải trang

Mục tiêu: Trong các quy trình đăng nhập liên quan đến các biện pháp chống bot và CAPTCHAs, vượt qua các CAPTCHAs thông qua sự bền vững của Profile để giảm gián đoạn.

Trang kiểm tra: https://www.leetchi.com/fr/login

Các bước:

1. Vượt qua CAPTCHAs và lưu trạng thái

  • Tạo một Profile mới với tính năng lưu trữ trình duyệt được bật
  • Đăng nhập thủ công và hoàn thành các CAPTCHAs người (ví dụ: nhấp vào một CAPTCHA, chọn hình ảnh, v.v.)
  • Tất cả kết quả CAPTCHAs và trạng thái đăng nhập sẽ được lưu vào Profile này

2. Tái sử dụng kết quả xác minh để đăng nhập tự động

  • Bắt đầu một phiên mới trong script sử dụng cùng một profile_id
  • Phiên sẽ vượt qua các CAPTCHAs và đăng nhập tự động mà không cần bất kỳ hành động nào của người dùng

Mục tiêu: Nhiều phiên chia sẻ cùng một danh tính người dùng để thực hiện các hoạt động đồng thời, chẳng hạn như thêm mục vào giỏ hàng.
Trường hợp sử dụng: Quản lý nhiều trình duyệt để truy cập đồng thời các nền tảng như Amazon và thực hiện các tác vụ khác nhau dưới cùng một tài khoản.

Các bước:

1. Thiết lập Danh tính Thống nhất

  • Tạo một Hồ sơ chung trong bảng điều khiển
  • Đăng nhập vào Amazon bằng cách nhập tên người dùng và mật khẩu của bạn, sau đó lưu dữ liệu phiên sau khi đăng nhập thành công

NodeJS

javascript Copy
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"

async function loginToAmazonWithSessionProfile() {
    const token = "YOUR_API_KEY"; // Khóa API
    const proxy = "YOUR_PROXY"
    const amazonAccountEmail = "YOUR_EMAIL"
    const amazonAccountPassword = "YOUR_PASSWORD"
    const profileName = "amazon";
      
    const scrapeless = new Scrapeless({ apiKey: token });

    let profile;
    let profileId = "";

    // cố gắng lấy hồ sơ hiện có, hoặc tạo một cái mới
    const profiles = await scrapeless.profiles.list({
        name: profileName,
        page: 1,
        pageSize: 1,
    });

    if (profiles?.docs && profiles.docs.length > 0) {
        profile = profiles.docs[0];
    } else {
        profile = await scrapeless.profiles.create(profileName);
    }

    profileId = profile?.profileId;
    if (!profileId) {
        return;
    }

    console.log(profile)

    // Xây dựng URL kết nối cho trình duyệt Scrapeless
    const { browserWSEndpoint } = scrapeless.browser.create({
        proxy_country: "ANY",
        proxy_url: proxy,
        session_recording: true,
        session_ttl: 900,
        session_name: "Đăng nhập vào amazon",
        profile_id: profileId, // id hồ sơ cụ thể
        profile_persist: true, // lưu trữ dữ liệu trình duyệt vào hồ sơ
    })

    const browser = await puppeteer.connect({
        browserWSEndpoint: browserWSEndpoint
    })

    const page = await browser.newPage();
    await page.goto("https://amazon.com", { waitUntil: "networkidle2" });

    // Nhấn "Tiếp tục mua sắm" nếu có
    try {
        await page.waitForSelector("button.a-button-text", { timeout: 5000 });
        await page.evaluate(() => {
            const buttons = Array.from(document.querySelectorAll("button.a-button-text"));
            const btn = buttons.find(b => b.textContent.trim() === "Tiếp tục mua sắm");
            if (btn) btn.click();
        });
        console.log("nhấn nút 'Tiếp tục mua sắm'.");
    } catch (e) {
        console.log("Nút 'tiếp tục mua sắm' không tìm thấy, tiếp tục...");
    }

    // Nhấn nút "Đăng nhập"
    await page.waitForSelector("#nav-link-accountList", { timeout: 5000 });
    await page.click("#nav-link-accountList");
    console.log("nhấn nút 'Đăng nhập'.");

    // Nhập email
    await page.waitForSelector("#ap_email_login", { timeout: 5000 });
    await page.type("#ap_email_login", amazonAccountEmail, { delay: Math.floor(Math.random() * 91) + 10 });
    console.log("nhập email.");

    // Nhấn "Tiếp tục"
    await page.waitForSelector("#continue-announce", { timeout: 5000 });
    await page.click("#continue-announce");
    console.log("nhấn nút 'Tiếp tục'.");

    // Nhập mật khẩu với độ trễ ngẫu nhiên cho mỗi ký tự
    await page.waitForSelector("#ap_password", { timeout: 5000 });
    for (const char of amazonAccountPassword) {
        await page.type("#ap_password", char, { delay: Math.floor(Math.random() * 91) + 10 });
    }
    console.log("nhập mật khẩu.");

    // Nhấn nút gửi "Đăng nhập"
    await page.waitForSelector("#signInSubmit", { timeout: 5000 });
    await page.click("#signInSubmit");
    console.log("nhấn nút gửi 'Đăng nhập'.");

    Tùy chọn: await page.waitForNavigation();
    await browser.close();
}

(async () => {
    await loginToAmazonWithSessionProfile();
})();

2. Các cuộc gọi đồng thời với Danh tính Thống nhất

  • Khởi động nhiều phiên (ví dụ: 3), tất cả tham chiếu đến cùng một profile_id

  • Tất cả các phiên chạy dưới cùng một danh tính người dùng

  • Thực hiện các hành động trang khác nhau riêng biệt, chẳng hạn như thêm các sản phẩm A, B và C vào giỏ hàng

  • Phiên 1 tìm kiếm giày và thêm chúng vào giỏ hàng

javascript Copy
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"

async function addGoodsToCart() {
   const token = "YOUR_API_KEY"
   const proxy = "YOUR_PROXY"
   const profileId = "YOUR_PROFILE_ID"
   const search = "giày"

   const scrapeless = new Scrapeless({
       apiKey: token
   })

   // tạo phiên trình duyệt
   const { browserWSEndpoint } = scrapeless.browser.create({
       proxy_country: "ANY",
       proxy_url: proxy,
       session_recording: true,
       session_ttl: 900,
       session_name: `hàng hóa ${search}`,
       profile_id: profileId,
       profile_persist: false, // tắt lưu lại phiên
   })

   const client = await puppeteer.connect({
       browserWSEndpoint: browserWSEndpoint
   })

   const page = await client.newPage()
   try {
       await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" }) 
javascript Copy
await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })

        // Tìm kiếm hàng hóa
        console.log(`tìm kiếm hàng hóa: ${search}`);
        await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
        await page.keyboard.press('Enter');

        await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })

        // Nhấn vào hàng hóa
        await page.click('button[id="a-autoid-3-announce"]')
        console.log(`đã nhấn vào hàng hóa`);

        await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })

        await new Promise((resolve) => setTimeout(resolve, 5000))
        const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
        if (buttons.length > 0) {
            // Nhấn thêm vào giỏ hàng
            await buttons[0].click();
            console.log(`đã nhấn thêm vào giỏ hàng`);
        }
        await client.close();
    } catch (e) {
        console.log("Thêm vào giỏ hàng không thành công.", e);
    }
}

(async () => {
    await addGoodsToCart()
})()
  • Phiên 2 tìm kiếm quần áo và thêm chúng vào giỏ hàng
Copy
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"

async function addGoodsToCart() {
   const token = "YOUR_API_KEY"
   const proxy = "YOUR_PROXY"
   const profileId = "YOUR_PROFILE_ID"
   const search = "quần áo"

   const scrapeless = new Scrapeless({
       apiKey: token
   })

   // tạo phiên trình duyệt
   const { browserWSEndpoint } = scrapeless.browser.create({
       proxy_country: "ANY",
       proxy_url: proxy,
       session_recording: true,
       session_ttl: 900,
       session_name: `hàng hóa ${search}`,
       profile_id: profileId,
       profile_persist: false, // vô hiệu hóa lưu phiên
   })

   const client = await puppeteer.connect({
       browserWSEndpoint: browserWSEndpoint
   })

   const page = await client.newPage()
   try {
       await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })

       await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })

       // Tìm kiếm hàng hóa
       console.log(`tìm kiếm hàng hóa: ${search}`);
       await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
       await page.keyboard.press('Enter');

       await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })

       // Nhấn vào hàng hóa
       await page.click('button[id="a-autoid-3-announce"]')
       console.log(`đã nhấn vào hàng hóa`);

       await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })

       await new Promise((resolve) => setTimeout(resolve, 5000))
       const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
       if (buttons.length > 0) {
           // Nhấn thêm vào giỏ hàng
           await buttons[0].click();
           console.log(`đã nhấn thêm vào giỏ hàng`);
       }
       await client.close();
   } catch (e) {
       console.log("Thêm vào giỏ hàng không thành công.", e);
   }
}

(async () => {
   await addGoodsToCart()
})()
  • Phiên 3 tìm kiếm quần và thêm chúng vào giỏ hàng
Copy
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"

async function addGoodsToCart() {
    const token = "YOUR_API_KEY"
    const proxy = "YOUR_PROXY"
    const profileId = "YOUR_PROFILE_ID"
    const search = "quần"

    const scrapeless = new Scrapeless({
        apiKey: token
    })

    // tạo phiên trình duyệt
    const { browserWSEndpoint } = scrapeless.browser.create({
        proxy_country: "ANY",
        proxy_url: proxy,
        session_recording: true,
        session_ttl: 900,
        session_name: `hàng hóa ${search}`,
        profile_id: profileId,
        profile_persist: false, // vô hiệu hóa lưu phiên
    })

    const client = await puppeteer.connect({
        browserWSEndpoint: browserWSEndpoint
    })

    const page = await client.newPage()
    try {
        await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })

        await page.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })

        // Tìm kiếm hàng hóa
        console.log(`tìm kiếm hàng hóa: ${search}`);
        await page.type('input[id="twotabsearchtextbox"]', search, { delay: Math.floor(Math.random() * 91) + 10 });
        await page.keyboard.press('Enter');

        await page.waitForSelector('button[id="a-autoid-3-announce"]', { timeout: 10000 })

        // Nhấn vào hàng hóa
        await page.click('button[id="a-autoid-3-announce"]')
        console.log(`đã nhấn vào hàng hóa`);

        await page.waitForSelector('div[id="a-popover-content-2"]', { timeout: 10000 })

        await new Promise((resolve) => setTimeout(resolve, 5000))
        const buttons = await page.$$('div#a-popover-content-2 button.a-button-text');
        if (buttons.length > 0) {
            // Nhấn thêm vào giỏ hàng
            await buttons[0].click();
            console.log(`đã nhấn thêm vào giỏ hàng`);
        }
vi Copy
await buttons[0].click();
            console.log(`đã nhấn thêm giỏ hàng`);
        }
        await client.close();
    } catch (e) {
        console.log("Thêm giỏ hàng thất bại.", e);
    }
}

(async () => {
    await addGoodsToCart()
})()
Trường hợp 3: Chia sẻ cookie đa phiên

Những tình huống nào thì những tính năng này phù hợp?

Việc ra mắt Profiles nâng cao đáng kể hiệu suất của Scraping Browser trong môi trường đa người dùng, đa phiên và quy trình làm việc phức tạp. Dưới đây là những trường hợp thực tiễn điển hình:

Dự án Thu thập dữ liệu tự động / Crawling

Khi thường xuyên lấy dữ liệu từ các trang web yêu cầu đăng nhập (chẳng hạn như thương mại điện tử, tuyển dụng, hoặc các nền tảng truyền thông xã hội):

  • Duy trì trạng thái đăng nhập để tránh việc kích hoạt kiểm soát rủi ro thường xuyên;
  • Giữ lại các ngữ cảnh quan trọng như cookie, lưu trữ và mã thông báo;
  • Gán các danh tính khác nhau (Profiles) cho các nhiệm vụ khác nhau để quản lý hồ bơi tài khoản hoặc hồ bơi danh tính.

Hợp tác nhóm / Quản lý cấu hình đa môi trường

Trong các nhóm phát triển, kiểm tra và vận hành:

  • Mỗi thành viên duy trì cấu hình Profile riêng của mình mà không bị can thiệp;
  • ID Profile có thể được nhúng trực tiếp vào các script tự động để đảm bảo các cuộc gọi nhất quán;
  • Hỗ trợ đặt tên tùy chỉnh và dọn dẹp hàng loạt để giữ cho các môi trường sạch sẽ và có tổ chức.

QA / Hỗ trợ Khách hàng / Tái hiện Vấn đề Trực tuyến

  • QA có thể thiết lập trước các Profile liên quan đến các trường hợp kiểm thử chính, tránh phải tái cấu trúc trạng thái trong quá trình phát lại;
  • Các tình huống hỗ trợ khách hàng có thể khôi phục môi trường hoạt động của khách hàng thông qua các Profile để tái hiện chính xác vấn đề;
  • Tất cả các phiên có thể liên kết với các bản ghi sử dụng Profile, tạo điều kiện cho việc xử lý sự cố liên quan đến ngữ cảnh.

👉 Mở Playground và trải nghiệm ngay bây giờ.

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.

Bài viết phổ biến nhất

Danh mục