No-Code CSS Selector Web Scraper — URL + Field Map to JSON
Pricing
from $1.00 / 1,000 results
No-Code CSS Selector Web Scraper — URL + Field Map to JSON
No-code web scraper with CSS selectors: give start URLs and a field map (CSS or XPath, attribute, regex, type) and get structured rows with pagination and detail pages. Export JSON, CSV, Excel. From $1 per 1,000 results.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Alexandre Manguis
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
No Code Web Scraper CSS Selector — URL + Field Map to JSON
What does this Actor do?
This no code web scraper CSS selector tool turns any public, server-rendered web page into structured data. You give it start URLs and a field map (a field name → a CSS or XPath selector, plus optional attribute, regex and type). It returns one clean JSON row per item, and can follow "next page" links or a page-URL pattern, and open each item's detail page for extra fields. No code and no custom page function to write. Results can be exported as JSON, CSV, Excel, XML or HTML from the Apify dataset.
Use cases
- Marketers and analysts who need a product, listing or directory table from a site without writing a scraper.
- Developers who want a quick, declarative extractor they can call from an API or an automation tool.
- Price monitoring, catalogue extraction, quote/article lists, job or event listings, directory pages.
- Prototyping selectors on a single page before building something bigger.
Features
What you can configure
- Field map: CSS selectors (or XPath when the selector starts with
/), extracttext,htmlor an attribute. - Cleaning: optional regex (first capture group) and type conversion:
string,number,integer,boolean,url(made absolute). - Multiple values:
all: truereturns a list (for example all tags of an item). - Pagination: a "next page" CSS selector, or a URL pattern containing
{page}, limited bymaxPages. - Detail pages: follow a link inside each item and read extra fields from the detail page.
- Missing-field report: each row lists
missingFields; aSELECTOR_REPORTrecord gives hints when a selector matches nothing. - Polite by default: configurable delay between requests,
maxResultscap, optional Apify Proxy. - Public pages only:
CookieandAuthorizationheaders and private/local hosts are refused.
Limitations
- It reads the HTML the server sends. Pages that build their content with JavaScript are not supported.
Input
Input fields
| Field | Required | Description |
|---|---|---|
startUrls | yes | Public http(s) pages to scrape. |
fields | yes | List of {name, selector, extract, attribute, regex, type, all, selectorType}. Evaluated inside each item. |
itemSelector | no | CSS selector of each repeated item. Empty = each page is one item. |
nextPageSelector | no | CSS selector of the "next page" link. |
pageUrlPattern | no | URL with {page}, used from page 2; stops at the first empty page. |
maxPages | no | Pages per start URL (default 5). |
detailLinkSelector | no | Link inside each item to open as a detail page. Needs detailFields. |
detailFields | no | Fields read on the detail page (names must differ from fields). |
maxResults | no | Stop after this many rows (default 100). Also caps your spending. |
requestDelayMs | no | Delay between requests to the same site (default 300). |
headers | no | Extra HTTP headers (for example Accept-Language). |
proxyConfiguration | no | Only needed if the site blocks direct requests (403/429). |
Input example
List page with pagination and detail pages:
{"startUrls": [{ "url": "https://books.toscrape.com/catalogue/category/books/travel_2/index.html" }],"itemSelector": "article.product_pod","fields": [{ "name": "title", "selector": "h3 a", "extract": "attr", "attribute": "title" },{ "name": "price", "selector": ".price_color", "regex": "([0-9.]+)", "type": "number" },{ "name": "url", "selector": "h3 a", "extract": "attr", "attribute": "href", "type": "url" }],"nextPageSelector": "li.next a","maxPages": 3,"detailLinkSelector": "h3 a","detailFields": [{ "name": "upc", "selector": "//th[text()='UPC']/following-sibling::td", "selectorType": "xpath" },{ "name": "availability", "selector": "p.availability", "regex": "(\\d+) available", "type": "integer" },{ "name": "description", "selector": "#product_description ~ p" }],"maxResults": 45}
Output
Output example
Each row contains your own field names (list fields and detail fields), plus the metadata fields pageUrl, pageNumber, itemIndex, missingFields and scrapedAt (and detailUrl when detail pages are used). Short sample from the books.toscrape.com test site (values shortened):
{"title": "It's Only the Himalayas","price": 45.17,"url": "https://books.toscrape.com/catalogue/its-only-the-himalayas_981/index.html","upc": "<upc>","availability": 19,"description": "<description text>","detailUrl": "https://books.toscrape.com/catalogue/its-only-the-himalayas_981/index.html","pageUrl": "https://books.toscrape.com/catalogue/category/books/travel_2/index.html","pageNumber": 1,"itemIndex": 0,"missingFields": [],"scrapedAt": "2026-10-04T18:12:36.799Z"}
Output fields & fill rates
Measured on a 44-row test run (two category pages, pagination + detail pages) on books.toscrape.com. Fill rates depend on your selectors and on the target site.
| Field | Fill rate |
|---|---|
| title, price, url | 100% |
| upc, availability, description (detail page) | 100% |
| detailUrl | 100% |
| pageUrl, pageNumber, itemIndex, scrapedAt | 100% |
| missingFields (rows with at least one missing field) | 0% |
Other proof runs:
- URL pattern pagination (quotes.toscrape.com,
all: true): 35 rows;tagswas filled on 97.1% of rows (a quote without tags yields an empty list and is flagged inmissingFields). - Single page, no
itemSelector: 2 start URLs gave 2 rows; a selector that matches nothing returnsnulland is listed inmissingFields. - Selector that matches nothing: the run succeeds with 0 rows and writes a
SELECTOR_REPORTrecord with hints. - Empty input: rejected with an "input is not valid" error (
startUrlsis required).
Configuration
- Selectors: CSS by default; a selector starting with
/(orselectorType: "xpath") is XPath. Selectors infieldsrun inside each item; selectors indetailFieldsrun on the whole detail page. - Pagination: use either
nextPageSelectororpageUrlPattern(with{page}), bounded bymaxPages. - Cost control:
maxResults(default 100) stops the run after that many rows. - Politeness / blocking:
requestDelayMs(default 300 ms); enableproxyConfigurationonly if the site answers 403/429. - Headers:
headersfor things likeAccept-Language;CookieandAuthorizationare refused.
How to use via API
Replace YOUR_API_TOKEN and ACTOR_ID (find it on the Actor page).
curl
curl -X POST "https://api.apify.com/v2/acts/ACTOR_ID/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://quotes.toscrape.com/"}],"itemSelector": "div.quote","fields": [{"name": "text", "selector": "span.text"},{"name": "author", "selector": "small.author"},{"name": "tags", "selector": "a.tag", "all": true}],"pageUrlPattern": "https://quotes.toscrape.com/page/{page}/","maxPages": 4,"maxResults": 35}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('ACTOR_ID').call({startUrls: [{ url: 'https://quotes.toscrape.com/' }],itemSelector: 'div.quote',fields: [{ name: 'text', selector: 'span.text' },{ name: 'author', selector: 'small.author' },{ name: 'tags', selector: 'a.tag', all: true },],pageUrlPattern: 'https://quotes.toscrape.com/page/{page}/',maxPages: 4,maxResults: 35,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("ACTOR_ID").call(run_input={"startUrls": [{"url": "https://quotes.toscrape.com/"}],"itemSelector": "div.quote","fields": [{"name": "text", "selector": "span.text"},{"name": "author", "selector": "small.author"},{"name": "tags", "selector": "a.tag", "all": True},],"pageUrlPattern": "https://quotes.toscrape.com/page/{page}/","maxPages": 4,"maxResults": 35,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(len(items))
Pricing
Pay per result (pay-per-event): you are charged for each row written to the dataset. Price per 1,000 results depends on your Apify plan:
| Plan | Per 1,000 results |
|---|---|
| Free | $1.50 |
| Bronze | $1.30 |
| Silver | $1.15 |
| Gold and above | $1.00 |
Platform usage (compute) is billed by Apify separately; in the test runs it was small (the 44-row run used about $0.017 of platform usage). Set maxResults to cap your spending.
Troubleshooting
- 0 results: open the
SELECTOR_REPORTrecord in the run's key-value store. Check thatitemSelectorand the field selectors match the HTML the server sends (view-source, not the browser inspector). - Fields are
null: the selector matched nothing inside the item; seemissingFields. Remember selectors are evaluated inside each item. - Page needs JavaScript: not supported; this Actor reads server-rendered HTML only.
- HTTP 403/429: enable Apify Proxy in
proxyConfigurationand raiserequestDelayMs. - Input error: a field needs
nameandselector;extract: "attr"needsattribute;detailFieldsanddetailLinkSelectorgo together; field names must be unique and not reserved.
FAQ
Do I need to code?
No. You write selectors in JSON; no page function.
Can I use XPath?
Yes: a selector starting with / is treated as XPath, or set selectorType: "xpath".
Can I scrape pages behind a login?
No. Public pages only; Cookie and Authorization headers are refused.
Is scraping legal?
Scrape only public data you are allowed to use, respect the site's terms and robots.txt, and handle any personal data in line with GDPR.
Keywords
no code web scraper, css selector scraper, web scraper css selector, xpath scraper, html to json, website to json, extract data from website, pagination scraper, scrape product listings, structured data extraction, no-code data extraction
Hashtags
#webscraping #nocode #cssselector #xpath #htmltojson #dataextraction #scraper #automation #apify

