Glossary

SSR

SSR stands for server-side rendering: the server builds the HTML before sending it to the browser. For scraping, that matters because SSR pages often expose the data you need directly in the initial response, so you can skip the whole browser-rendering mess.

Examples

A simple SSR page returns the content in the first HTML response, so a normal HTTP request is enough.

curl -L "https://example.com/products/123"

If the page is SSR, you might see the product data directly in the HTML:

<html>
  <head><title>Product 123</title></head>
  <body>
    <h1>Running Shoes</h1>
    <div class="price">$89</div>
  </body>
</html>

In Python, scraping it is straightforward:

import requests
from bs4 import BeautifulSoup

html = requests.get("https://example.com/products/123").text
soup = BeautifulSoup(html, "html.parser")
name = soup.select_one("h1").get_text(strip=True)
price = soup.select_one(".price").get_text(strip=True)

print({"name": name, "price": price})

If you are using ScrapeRouter, SSR targets are the cheap cases because you often do not need browser rendering at all:

curl "https://www.scraperouter.com/api/v1/scrape/?url=https://example.com/products/123" \
  -H "Authorization: Api-Key $api_key"

Practical tips

  • Check the raw HTML first. If the data is already there, do not reach for Playwright, Selenium, or any browser tool yet.
  • View page source, not just the live DOM in devtools. SSR content is in the original response; CSR content often is not.
  • Look for framework hints: Next.js, Nuxt, Remix, and similar stacks often ship SSR or hybrid pages.
  • Be careful with modern apps because many are hybrid, not purely SSR or purely CSR: initial HTML on the server, more data loaded later with API calls.
  • SSR is easier to scrape, but it does not mean easy in production: rate limits, bot checks, geo issues, and inconsistent markup still show up.
  • If you can get the data with a plain request, do that. Browser automation is slower, more expensive, and one more thing to keep alive.
  • A quick check in Python:
import requests

url = "https://example.com/products/123"
html = requests.get(url, timeout=30).text

for needle in ["Running Shoes", "$89"]:
    print(needle, needle in html)

If the important text is in html, start with HTTP scraping, not browser rendering.

Use cases

  • Product pages where title, price, availability, and metadata are already rendered into the response HTML.
  • Article pages where the headline, author, publish date, and body arrive fully rendered from the server.
  • SEO-heavy sites that render key content server-side so search engines and social previews can read it immediately.
  • Monitoring jobs where you want the cheapest stable path: plain requests against SSR pages instead of running a browser fleet.
  • Mixed rendering sites where SSR gets you the main record and a follow-up API call gets reviews, inventory, or other dynamic pieces.

Related terms

CSR Rendering Headless Browser HTML Parsing DOM JavaScript Rendering Static Site Generation Web Scraping