# Industrial Hardware & Components Catalog Scraper (`muhammadafzal/industrial-hardware-components-catalog-scraper`) Actor

Extract public industrial catalog products with SKUs, MPNs, specifications, prices, availability, images, and categories.

- **URL**: https://apify.com/muhammadafzal/industrial-hardware-components-catalog-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 catalog product extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Industrial Hardware & Components Catalog Scraper

Extract normalized product data from public manufacturer and industrial distributor catalog pages. This actor is designed for procurement research, parts-market intelligence, catalog migrations, and building a searchable inventory index from data that is publicly displayed on the source site.

It returns one dataset record per product, with the product name, seller SKU, manufacturer part number (MPN), manufacturer, category, description, price, stock text, images, visible specifications, breadcrumbs, source URL, and scrape timestamp.

### When to use it

Use this actor when you have public catalog or direct product URLs for industrial hardware, fasteners, tools, electrical components, automation parts, bearings, fittings, valves, safety equipment, or similar B2B inventory.

Do not use it for login-only supplier portals, RFQ or negotiated prices, shopping-cart inventory, CAD file downloads, or sites where access is prohibited. It does not bypass authentication, challenges, or source-site terms.

### Input

`startUrls` accepts public catalog/listing pages or direct product pages. Catalog pages are inspected for same-site product links; direct product pages are extracted immediately. For a small validation run, set `maxProducts` to `10` and `maxCatalogPages` to `3`.

```json
{
  "startUrls": [{ "url": "https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2" }],
  "maxProducts": 25,
  "maxCatalogPages": 3,
  "followPagination": true,
  "sameDomainOnly": true,
  "maxConcurrency": 5
}
```

`sameDomainOnly` is enabled by default to prevent the crawl from following affiliate, marketplace, or unrelated links. Disable it only when you know the catalog's product pages live on another hostname.

### Output

Each record has a stable, flat product shape. Missing optional source data is returned as `null`; an unavailable field is never guessed.

| Field | Meaning |
| --- | --- |
| `name` | Published product name |
| `sku` / `mpn` | Seller catalog number and manufacturer part number, when available |
| `manufacturer` | Published brand or manufacturer |
| `price`, `currency`, `availability` | Public offer information, not cart or contract pricing |
| `specifications` | Visible key/value specs, such as dimensions, material, voltage, or thread size |
| `productUrl`, `sourceUrl` | Canonical product URL and fetched page URL |

Example result:

```json
{
  "productUrl": "https://supplier.example/products/stainless-steel-hex-bolt",
  "sourceUrl": "https://supplier.example/products/stainless-steel-hex-bolt",
  "name": "18-8 Stainless Steel Hex Bolt",
  "sku": "91251A540",
  "mpn": null,
  "manufacturer": "Example Industrial",
  "category": "Fasteners > Bolts",
  "description": "Corrosion-resistant hex bolt for general fastening.",
  "price": 12.5,
  "currency": "USD",
  "availability": "In stock",
  "imageUrl": "https://supplier.example/images/bolt.jpg",
  "images": ["https://supplier.example/images/bolt.jpg"],
  "specifications": { "Thread Size": "1/4 in.-20", "Length": "1 in." },
  "breadcrumbs": ["Fasteners", "Bolts"],
  "scrapedAt": "2026-08-09T09:00:00.000Z"
}
```

### Extraction approach and limits

The actor uses static HTTP crawling and prioritizes JSON-LD Product data, schema.org microdata, meta tags, visible specification tables, definition lists, and common catalog link patterns. It is fastest and most reliable on publicly server-rendered catalog pages.

JavaScript-only storefronts, bot-protected sources, nonstandard product links, and quote-only catalogs may return no products. A successful zero-result run writes a `SUMMARY` record that explains the observed extraction issue. When every request fails, the run fails honestly rather than presenting a misleading empty dataset.

### Pricing and compliance

The actor uses Apify pay per event pricing: **$0.003 per unique product record** written to the default dataset, plus Apify's **$0.00005 actor-start event**. `maxProducts` is also the result-charge cap: a run with `maxProducts: 25` can charge at most $0.075 for product records, plus the actor-start event. Platform usage is not passed through separately.

Only scrape data you are authorized to collect and use, and honor the source's terms, robots policies, rate limits, and applicable law.

# Actor input Schema

## `startUrls` (type: `array`):

Use this to scrape public industrial distributor or manufacturer catalog pages. Enter a category page or direct product page, for example https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2. This actor does not access sign-in-only, quote-only, or cart data.

## `maxProducts` (type: `integer`):

Maximum unique products to return across all input URLs. Default 100; use 10 for a quick sample. This cap also bounds product-page requests.

## `maxCatalogPages` (type: `integer`):

Maximum category, search, or listing pages to inspect for product links. Direct product URLs do not count toward this limit. Default 10.

## `followPagination` (type: `boolean`):

When enabled, follows same-site next-page links on catalog listings. Disable it when each supplied URL is already a complete list. Default true.

## `sameDomainOnly` (type: `boolean`):

When enabled, follows product and pagination links only on the same hostname as their input URL. Keep enabled unless a catalog deliberately uses a separate product hostname. Default true.

## `maxConcurrency` (type: `integer`):

Parallel HTTP requests. Default 5 is a conservative setting for public catalogs; lower it for sensitive sources.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy configuration for public pages that rate-limit cloud IPs. This setting does not bypass logins, access controls, or site terms.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2"
    }
  ],
  "maxProducts": 25,
  "maxCatalogPages": 3,
  "followPagination": true,
  "sameDomainOnly": true,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Link to the extracted industrial hardware and component product records.

## `summary` (type: `string`):

Link to product counts, visited pages, and non-fatal extraction warnings.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2"
        }
    ],
    "maxProducts": 25,
    "maxCatalogPages": 3,
    "followPagination": true,
    "sameDomainOnly": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/industrial-hardware-components-catalog-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2" }],
    "maxProducts": 25,
    "maxCatalogPages": 3,
    "followPagination": True,
    "sameDomainOnly": True,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/industrial-hardware-components-catalog-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.uline.com/Product/Detail/H-150/Hand-Held-Tape-Dispensers/Uline-Industrial-Side-Loader-Tape-Dispenser-2"
    }
  ],
  "maxProducts": 25,
  "maxCatalogPages": 3,
  "followPagination": true,
  "sameDomainOnly": true
}' |
apify call muhammadafzal/industrial-hardware-components-catalog-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/industrial-hardware-components-catalog-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8WCTQhPhaZMApeKZh/builds/f3CSZTyPBFEGq8snZ/openapi.json
