製品アップデート | 新しいプロフィール機能

Advanced Data Extraction Specialist
クロスセッションシナリオにおけるScraping Browserの実用性と安定性を向上させるために、正式に永続的なユーザーデータ用のProfile機能を導入しました。この機能は、ブラウザデータ(クッキー、ストレージ、キャッシュ、ログイン状態など)をクラウドに保存し、異なるセッション間でシームレスに共有および再利用できるようにします。これにより、再度ログインする必要がなくなります。デバッグを大幅に簡素化し、オートメーションスクリプトの効率を向上させます。
プロファイルを導入する理由
実際の自動キャプチャやインタラクションプロセスでは、ユーザーはしばしば「ログイン状態を記憶する」、特定のクローリングからの「クッキーを再利用する」、および「タスク間でページキャッシュを同期する」必要があります。従来のヘッドレスブラウザは、毎回まったく新しい環境で起動し、履歴のコンテキストを保持できません。この新しいProfile機能は、Scraping Browserが以下をサポートすることでこの問題を解決します:
- ログイン状態の長期保持、毎回再認証する必要がなくなる
- 同じサイトへの複数リクエストでの一貫したユーザーID
- スクリプトデバッグ中のセッション間でのブラウザコンテキストの再利用
このアップデートのハイライト
プロファイル作成および管理ページが公開されました
「For Scraping → Profiles」に移動して以下を行うことができるようになりました:
- 作成/編集/コピー/削除
- ファイルデータサイズ、最終使用時間の表示
- 名称またはIDでターゲットプロファイルを検索
- スクリプティングまたはチーム参照用にIDをワンクリックでコピー
プロファイル詳細ページ:設定と使用履歴の完全な可視化
任意のプロファイルにアクセスして、その完全な設定と使用履歴を表示できます。これには以下が含まれます:
- 基本情報: プロファイル名、ID、データサイズ、最終使用時間、総使用回数(セッションでの使用回数)
- 関連セッション記録:
-
ライブセッションリスト: 現在このプロファイルを使用しているリアルタイムセッション;
-
セッション履歴リスト: このプロファイルが使用されたすべての履歴セッションで、詳細表示用のクリック可能なエントリ。
-
これにより、デバッグプロセスがより透明になり、問題をより効率的に再現および追跡するのに役立ちます。
セッションシステムとの深い統合
次のインターフェースにプロファイル情報表示とクイックナビゲーションを追加しました:
- ライブセッション: 使用中のプロファイルを表示(クリックするとプロファイル詳細ページにジャンプ)
- セッション履歴: 各セッションに関連付けられたプロファイルを表示
- セッション詳細: 特定の実行時に使用されたプロファイルを確認
機能デモンストレーション
ケース1:永続的なログイン + 速度向上
目標: 毎回ユーザー名とパスワードを入力せずに、ログインを必要とするページを自動的に開く。
手順:
1. 初めてログイン状態を設定して保存します。
プロファイル作成方法:
- ダッシュボードから手動で作成:ダッシュボードからプロファイルを手動で作成します。
- API作成: Create Profile APIを使用して自動的にプロファイルを作成します。
- SDK作成:SDKメソッドを使用してプロファイルを作成します。
NodeJS
import { Scrapeless } from "@scrapeless-ai/sdk"
const scrapeless = new Scrapeless({
apiKey: "YOUR_API_KEY"
})
// 新しいプロファイルを作成
const profile = await scrapeless.profiles.create("scrapeless_profile")
console.log("profile Id:", profile.profileId)
セッションを開始し、profile_idを指定して永続化を有効にし、一度手動でログインします。ログイン状態(クッキーやトークンなど)は自動的にクラウドプロファイルに保存されます。
NodeJS
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" // あなたのprofileIdに置き換えてください
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_ttl: "900",
session_name: "Test Profile",
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 = "your username"
const password = "your password!"
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("✅ ログイン成功!")
} else {
console.log("❌ ログイン失敗。")
}
await browser.close()
}
main().catch(console.error)
2. ログイン情報の自動再利用
- 同じ profileId を後続のスクリプトやタスクで再利用する
- 以前に作成した profileId を参照して新しいセッションを開始し、https://the-internet.herokuapp.com/ に自動ログインして個人ホームページを開く
ケース 2: 自動的にアンチボットを回避して自動化スクリプトの成功率を向上させる
目標: アンチボット対策や CAPTCHA を含むログインプロセスで、プロファイルの永続性を通じて CAPTCHA を回避し、中断を減らす。
テストサイト: https://www.leetchi.com/fr/login
手順:
1. CAPTCHA を通過し、状態を保存する
- ブラウザの永続性を有効にして新しいプロファイルを作成する
- 手動でログインし、人間の CAPTCHA をクリアする(例: CAPTCHA をクリック、画像を選択など)
- すべての CAPTCHA の結果とログイン状態がこのプロファイルに保存される
2. 検証結果を再利用して自動ログインする
- スクリプト内で同じ profile_id を使用して新しいセッションを開始する
- セッションは CAPTCHA を回避し、自動的にログインを行い、ユーザーの操作は不要となる
ケース 3: マルチセッションクッキー共有
目標: 複数のセッションが単一のユーザーIDを共有し、ショッピングカートにアイテムを追加するなどの同時操作を実行する。
ユースケース: 複数のブラウザを管理して、Amazonなどのプラットフォームに同時にアクセスし、同じアカウントで異なるタスクを実行する。
手順:
1. 統一されたアイデンティティ設定
- コンソールに共有プロファイルを作成
- ユーザー名とパスワードを入力してAmazonにログインし、成功したログイン後にセッションデータを保存
NodeJS
javascript
import { Scrapeless } from "@scrapeless-ai/sdk"
import puppeteer from "puppeteer-core"
async function loginToAmazonWithSessionProfile() {
const token = "YOUR_API_KEY"; // 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 = "";
// 既存のプロファイルを取得するか、新しいプロファイルを作成
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)
// Scrapelessブラウザ用の接続URLを構築
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: "Amazonにログイン",
profile_id: profileId, // 特定のprofileId
profile_persist: true, // プロファイルにブラウザデータを永続化
})
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await browser.newPage();
await page.goto("https://amazon.com", { waitUntil: "networkidle2" });
// 存在する場合は「ショッピングを続ける」をクリック
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() === "ショッピングを続ける");
if (btn) btn.click();
});
console.log("「ショッピングを続ける」ボタンをクリックしました。");
} catch (e) {
console.log("「ショッピングを続ける」ボタンが見つかりませんでした。続行します...");
}
// 「サインイン」ボタンをクリック
await page.waitForSelector("#nav-link-accountList", { timeout: 5000 });
await page.click("#nav-link-accountList");
console.log("「サインイン」ボタンをクリックしました。");
// メールアドレスを入力
await page.waitForSelector("#ap_email_login", { timeout: 5000 });
await page.type("#ap_email_login", amazonAccountEmail, { delay: Math.floor(Math.random() * 91) + 10 });
console.log("メールアドレスを入力しました。");
// 「続ける」をクリック
await page.waitForSelector("#continue-announce", { timeout: 5000 });
await page.click("#continue-announce");
console.log("「続ける」ボタンをクリックしました。");
// ランダムな遅延でパスワードを入力
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("パスワードを入力しました。");
// 「サインイン」送信ボタンをクリック
await page.waitForSelector("#signInSubmit", { timeout: 5000 });
await page.click("#signInSubmit");
console.log("「サインイン」送信ボタンをクリックしました。");
任意: await page.waitForNavigation();
await browser.close();
}
(async () => {
await loginToAmazonWithSessionProfile();
})();
2. 一貫したアイデンティティでの同時呼び出し
-
すべて同じ
profile_id
を参照する複数のセッション(例:3)を立ち上げる -
すべてのセッションが同じユーザーアイデンティティの下で実行される
-
商品A、B、Cをショッピングカートに追加するなど、異なるページアクションを別々に実行
-
セッション1は
shoes
を検索してカートに追加
javascript
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 = "shoes"
const scrapeless = new Scrapeless({
apiKey: token
})
// ブラウザセッションを作成
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `商品 ${search}`,
profile_id: profileId,
profile_persist: false, // セッションの永続化を無効化
})
const client = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint
})
const page = await client.newPage()
try {
await page.goto("https://www.amazon.com", { waitUntil: "networkidle2" })
待機ページ.waitForSelector('input[id="twotabsearchtextbox"]', { timeout: 5000 })
// 商品を検索
console.log(`商品を検索: ${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 })
// 商品をクリック
await page.click('button[id="a-autoid-3-announce"]')
console.log(`商品をクリック`);
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) {
// カートに追加をクリック
await buttons[0].click();
console.log(`カートに追加をクリック`);
}
await client.close();
} catch (e) {
console.log("カートに追加できませんでした。", e);
}
}
(async () => {
await addGoodsToCart()
})()
- セッション2は
服
を検索してカートに追加します。
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 = "服"
const scrapeless = new Scrapeless({
apiKey: token
})
// ブラウザセッションを作成
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `商品 ${search}`,
profile_id: profileId,
profile_persist: false, // セッションの永続化を無効にする
})
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 })
// 商品を検索
console.log(`商品を検索: ${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 })
// 商品をクリック
await page.click('button[id="a-autoid-3-announce"]')
console.log(`商品をクリック`);
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) {
// カートに追加をクリック
await buttons[0].click();
console.log(`カートに追加をクリック`);
}
await client.close();
} catch (e) {
console.log("カートに追加できませんでした。", e);
}
}
(async () => {
await addGoodsToCart()
})()
- セッション3は
ズボン
を検索してカートに追加します。
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 = "ズボン"
const scrapeless = new Scrapeless({
apiKey: token
})
// ブラウザセッションを作成
const { browserWSEndpoint } = scrapeless.browser.create({
proxy_country: "ANY",
proxy_url: proxy,
session_recording: true,
session_ttl: 900,
session_name: `商品 ${search}`,
profile_id: profileId,
profile_persist: false, // セッションの永続化を無効にする
})
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 })
// 商品を検索
console.log(`商品を検索: ${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 })
// 商品をクリック
await page.click('button[id="a-autoid-3-announce"]')
console.log(`商品をクリック`);
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) {
// カートに追加をクリック
await buttons[0].click();
console.log(カートに追加しました
);
}
await client.close();
} catch (e) {
console.log("ショッピングカートの追加に失敗しました。", e);
}
}
(async () => {
await addGoodsToCart()
})()

## これらの機能はどのシナリオに適していますか?
プロファイルの開始により、Scraping Browserのパフォーマンスがマルチユーザー、マルチセッション、複雑なワークフロー環境で大幅に向上します。以下は典型的な実用的なユースケースです。
### 自動データ収集 / クローリングプロジェクト
ログインが必要なウェブサイト(例えば、eコマース、リクルートメント、ソーシャルメディアプラットフォーム)を頻繁にスクレイピングする場合:
- リスクコントロールのトリガーを回避するために、ログイン状態を保持します;
- クッキー、ストレージ、トークンなどの重要なコンテキストを保持します;
- 異なるタスクのために異なるアイデンティティ(プロファイル)を割り当て、アカウントプールやアイデンティティプールを管理します。
---
### チームコラボレーション / マルチ環境設定管理
開発、テスト、運用チーム内で:
- 各メンバーが干渉することなく独自のプロファイル設定を維持します;
- プロファイルIDを自動化スクリプトに直接埋め込むことができ、一貫した呼び出しを保証します;
- 環境を清潔で整理された状態に保つために、カスタム命名や一括クリーンアップをサポートします。
---
### QA / カスタマーサポート / オンライン問題再現
- QAは、再生中の状態再構築を避けるために、主要なテストケースに関連するプロファイルをあらかじめ設定できます;
- カスタマーサポートのシナリオは、問題を正確に再現するためにプロファイルを介して顧客の操作環境を復元できます;
- すべてのセッションはプロファイルの使用記録にリンクでき、コンテキスト関連の問題のトラブルシューティングを容易にします。
---
👉 [プレイグラウンドを開く](https://app.scrapeless.com/passport/login) して、今すぐ体験してください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。