Infinite feeds, "load more" buttons and pages built by JavaScript hand a plain request an empty shell. Gologin Cloud Browser loads them the way a person's browser does, so your Playwright or Puppeteer script collects everything that appears.
Free to start, no card. Residential IPs included.
A plain request reads the HTML the server sends. Dynamic pages send the data later, through JavaScript, scrolling and clicks. Here is what each approach gets back.
| What you get back | Plain HTTP request | Headless Chrome | |
|---|---|---|---|
| Content built by JavaScript | Yes | No | Yes |
| Infinite scroll and "load more" | Yes | No | Yes |
| Content that loads seconds later | Yes | No | Yes |
| Residential IP included | Yes | No | No |
| Same session on the next run | Yes | No | No |
| Servers to run | None | None | Yours |
Only need the rendered page, not a session? Web Unlocker returns it in one request and bills only on success.
Connect your script to Gologin Cloud Browser in one line, wait for the content, then scroll until nothing new appears. The code below collected all 100 quotes from an infinite-scroll test page.
Sign up with Google and copy your key from the dashboard. Free, no card.
One click in the dashboard, or one API call. The profile keeps the device, the IP and the login.
Install the library and run the script below with your token and profile id. It scrolls until no new quotes load, then collects each one with its author. More in the getting started guide.
npm install playwright-coreGOLOGIN_TOKEN=your_token GOLOGIN_PROFILE_ID=your_profile_id node scrape.mjswss://cloudbrowser.gologin.com/connect?token=…&profile=…import { chromium } from "playwright-core";
const token = process.env.GOLOGIN_TOKEN;
const profileId = process.env.GOLOGIN_PROFILE_ID;
const endpoint = `wss://cloudbrowser.gologin.com/connect?token=${token}&profile=${profileId}`;
const browser = await chromium.connectOverCDP(endpoint);
const page = await browser.contexts()[0].newPage();
await page.goto("http://quotes.toscrape.com/scroll");
await page.waitForSelector(".quote");
for (let i = 0; i < 30; i++) {
const before = await page.locator(".quote").count();
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
try {
await page.waitForFunction(
(n) => document.querySelectorAll(".quote").length > n,
before,
{ timeout: 3000 }
);
} catch {
break;
}
}
const quotes = await page.$$eval(".quote", (els) =>
els.map((el) => ({
text: el.querySelector(".text")?.textContent,
author: el.querySelector(".author")?.textContent,
}))
);
console.log(quotes.length, quotes[0]);
await page.close();
await browser.close();npm install puppeteer-coreGOLOGIN_TOKEN=your_token GOLOGIN_PROFILE_ID=your_profile_id node scrape.mjswss://cloudbrowser.gologin.com/connect?token=…&profile=…import puppeteer from "puppeteer-core";
const token = process.env.GOLOGIN_TOKEN;
const profileId = process.env.GOLOGIN_PROFILE_ID;
const endpoint = `wss://cloudbrowser.gologin.com/connect?token=${token}&profile=${profileId}`;
const browser = await puppeteer.connect({ browserWSEndpoint: endpoint });
const page = await browser.newPage();
await page.goto("http://quotes.toscrape.com/scroll");
await page.waitForSelector(".quote");
for (let i = 0; i < 30; i++) {
const before = await page.$$eval(".quote", (els) => els.length);
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
try {
await page.waitForFunction(
(n) => document.querySelectorAll(".quote").length > n,
{ timeout: 3000 },
before
);
} catch {
break;
}
}
const quotes = await page.$$eval(".quote", (els) =>
els.map((el) => ({
text: el.querySelector(".text")?.textContent,
author: el.querySelector(".author")?.textContent,
}))
);
console.log(quotes.length, quotes[0]);
await page.close();
await browser.disconnect();pip install playwrightGOLOGIN_TOKEN=your_token GOLOGIN_PROFILE_ID=your_profile_id python scrape.pywss://cloudbrowser.gologin.com/connect?token=…&profile=…import os
from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError
token = os.environ["GOLOGIN_TOKEN"]
profile_id = os.environ["GOLOGIN_PROFILE_ID"]
endpoint = f"wss://cloudbrowser.gologin.com/connect?token={token}&profile={profile_id}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(endpoint)
page = browser.contexts[0].new_page()
page.goto("http://quotes.toscrape.com/scroll")
page.wait_for_selector(".quote")
for _ in range(30):
before = page.locator(".quote").count()
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
try:
page.wait_for_function(
"n => document.querySelectorAll('.quote').length > n",
arg=before,
timeout=3000,
)
except PlaywrightTimeoutError:
break
quotes = page.eval_on_selector_all(
".quote",
"els => els.map(el => ({text: el.querySelector('.text')?.textContent, author: el.querySelector('.author')?.textContent}))",
)
print(len(quotes), quotes[0])
page.close()
browser.close()Every plan runs the same browser, with residential IPs included. Plans differ in browser hours and parallel sessions.
$0
No card needed
$4.50/ month
For individual developers
$8/ month
For growing teams
$14/ month
For critical operations
Need more at once? Add parallel sessions to any plan for $2 a month each, as many as you need. Proxy traffic beyond your allowance is $1/GB.
From 4 parallel sessions, with a dedicated account manager, a premium SLA and tailored onboarding.
One account, one proxy network, one ecosystem. Pick the product the job needs.
Collecting data from pages that build their content in the browser: feeds, search results, prices or reviews that appear after the page loads, on scroll or after a click. You need a real browser to run the page before you can read it.
The server sends a shell and the data arrives later through JavaScript. A plain request stops at the shell, so the data is never there to parse. Load the page in a browser and wait for the element you need, as the scripts above do.
Use Web Unlocker when you need the rendered page from a URL: one request, billed only when it succeeds. Use Cloud Browser when the job needs a session: scrolling a feed, clicking through pages, staying logged in between runs.
Scroll to the bottom, wait for new items to appear, and repeat until the count stops growing. The scripts above do exactly that and stop on their own when nothing new loads.
Yes. Log in once in a profile and the session stays with it: reconnect later and you are still signed in. Need one login across several browsers? See Scraping browser. Only collect data you are allowed to access.
Yes. Python Playwright connects to the same address with connect_over_cdp, and the Python tab above has the full script. Install it with pip install playwright; no local browser download is needed, because the browser runs in the cloud.
Connect your Playwright or Puppeteer script in one line, and collect what a real browser sees.
Free to start, no card. Residential IPs included.