# Fisher Scientific Product Scraper (`muhammadafzal/fisher-scientific-product-scraper`) Actor

Extract public Fisher Scientific catalog products for procurement research and lab supply comparison. Supports product pages, browse/category pages, and keyword search URLs. Returns SKU specifications, images, public prices, availability, claims, and source metadata without sign-in.

- **URL**: https://apify.com/muhammadafzal/fisher-scientific-product-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Automation, E-commerce
- **Stats:** 3 total users, 2 monthly users, 89.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 product results

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

## Fisher Scientific Product Scraper

Extract public product catalog data from [Fisher Scientific](https://www.fishersci.com/) for procurement research, laboratory supply comparison, supplier catalog monitoring, and product database pipelines.

The actor supports direct Fisher Scientific product pages, browse/category pages, and public catalog search URLs. It returns one structured dataset record per catalog SKU or variant, including specifications, features, images, public list price when shown, availability indicators, product claims, and source metadata.

It does not sign in, place orders, submit forms, retrieve private account data, or request account-specific contract pricing.

### What it collects

- Fisher catalog number, manufacturer part number, supplier ID, family ID, and variant differentiator
- Product name, description, features, warranty, and key/value technical specifications
- Product image URLs and public catalog breadcrumbs
- Public list price, displayed price, currency, unit, availability, and available quantity when the page exposes them
- Discontinued, returnable, buyable, and viewable flags from Fisher's public product data
- Public catalog keywords, claims, badges, source URL, and ISO 8601 scrape timestamp

The source website often represents several package sizes or capacities as variants on one product-family page. The actor preserves those variants as separate rows keyed by their Fisher catalog number.

### Input

Use direct product URLs for selected products, Fisher browse/category URLs for catalog collection, or a search keyword for public Fisher catalog search.

```json
{
  "startUrls": [
    { "url": "https://www.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000" }
  ],
  "maxResults": 25,
  "includeSpecifications": true,
  "includePriceAndAvailability": true,
  "maxConcurrency": 2,
  "maxRequestsPerMinute": 30
}
```

For a category page:

```json
{
  "startUrls": [
    { "url": "https://www.fishersci.com/us/en/browse/90094065/beakers" }
  ],
  "maxResults": 100
}
```

For keyword search, set `searchKeyword` to values such as `pipettes`, `beakers`, `antibodies`, or a catalog number. Fisher may apply Akamai protection to search pages; if a search run receives access-denied responses, provide an Apify Proxy configuration with a residential group and keep concurrency modest.

### Output example

```json
{
  "product_name": "Fisherbrand™ Elite™ Adjustable-Volume Pipettes",
  "product_url": "https://www.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000",
  "catalog_number": "FBE01000",
  "manufacturer_part_number": "4680070",
  "variant": "100 to 1000 µL",
  "description": "Extremely low plunger forces work longer without fatigue and reduce the risk of RSI.",
  "specifications": { "Autoclavable": "Autoclavable", "Volume (Metric)": "100 to 1000 µL" },
  "price": 490,
  "price_display": "$490.00",
  "currency": "USD",
  "availability": "N/A",
  "discontinued": false,
  "categories": ["Manual Single Channel Pipettes"],
  "claims": ["GSA_VA", "GREENER_CHOICE"],
  "source_url": "https://www.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000",
  "scraped_at": "2026-08-11T12:00:00.000Z"
}
```

### Pricing

This actor uses PAY\_PER\_EVENT pricing at **$0.005 per unique product/SKU record**. The actor-start event is configured separately by Apify. Use `maxResults` to cap result-event charges.

- 10 products → $0.05 in result events
- 100 products → $0.50 in result events
- 1,000 products → $5.00 in result events

Normal Apify compute, storage, and proxy usage may also apply. The actor charges only after a unique product record has been saved to the dataset.

### Responsible use

Only collect public pages and follow Fisher Scientific's terms, robots guidance, and applicable law. Keep concurrency and request rate appropriate for the source website. Product price and availability are public storefront values and may change; account-specific pricing is intentionally not collected.

The final run summary is written to the `OUTPUT` key-value record with status, counts, estimated result charges, and warnings. A blocked or markup-changed page is reported as a partial or empty run whenever the actor can do so without discarding products already saved.

# Actor input Schema

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

Use this when scraping one or more public Fisher Scientific product, browse/category, or catalog search URLs. Product URLs return SKU/variant records; browse URLs follow product links and pagination. Leave empty to use the default public product page.

## `searchKeyword` (type: `string`):

Use this when you want Fisher Scientific search results for a keyword such as pipettes, beakers, antibodies, or a catalog number. The actor converts the keyword to Fisher Scientific's public catalog search URL. Direct URLs are more reliable for repeatable collection.

## `maxResults` (type: `integer`):

Use this to cap unique Fisher Scientific catalog SKU or variant records saved across all inputs. Each saved product is one product-result event at $0.005; result charges cannot exceed maxResults × $0.005.

## `includeSpecifications` (type: `boolean`):

Use this when technical specifications, product features, and warranty text are needed. Defaults to true; turn it off for smaller catalog records.

## `includePriceAndAvailability` (type: `boolean`):

Use this when publicly displayed list price, unit, stock indicator, and available quantity are needed. Account-specific contract prices are not available without signing in and are never requested.

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

Use this to control simultaneous Fisher Scientific page requests. Defaults to 2 to limit load on the source website; range 1–8.

## `maxRequestsPerMinute` (type: `integer`):

Use this to rate-limit public Fisher Scientific requests. Defaults to 30; lower it for gentle collection or raise it only when your proxy capacity supports it.

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

Use this when Fisher Scientific search or high-volume collection returns Akamai access denials. Apify Proxy with a residential group is recommended for those cases. Leave empty for direct product-page tests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000"
    }
  ],
  "searchKeyword": "",
  "maxResults": 10,
  "includeSpecifications": true,
  "includePriceAndAvailability": true,
  "maxConcurrency": 2,
  "maxRequestsPerMinute": 30,
  "proxyConfiguration": {}
}
```

# Actor output Schema

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

Structured public Fisher Scientific product and SKU records.

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

Status, counts, event-charge estimate, and crawl 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.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000"
        }
    ],
    "maxResults": 10,
    "includeSpecifications": true,
    "includePriceAndAvailability": true,
    "maxConcurrency": 2,
    "maxRequestsPerMinute": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/fisher-scientific-product-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.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000" }],
    "maxResults": 10,
    "includeSpecifications": True,
    "includePriceAndAvailability": True,
    "maxConcurrency": 2,
    "maxRequestsPerMinute": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/fisher-scientific-product-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.fishersci.com/shop/products/fisherbrand-elite-adjustable-volume-pipetters-13/FBE01000"
    }
  ],
  "maxResults": 10,
  "includeSpecifications": true,
  "includePriceAndAvailability": true,
  "maxConcurrency": 2,
  "maxRequestsPerMinute": 30
}' |
apify call muhammadafzal/fisher-scientific-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/fisher-scientific-product-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/ZdpAGv7cQT8QbJJl2/builds/jU5S8oOHbAx9OOQhn/openapi.json
