Home < Extracting MRO Product Data from Grainger and Zoro Using Python and BeautifulSoup
Extracting MRO Product Data from Grainger and Zoro Using Python and BeautifulSoup
Posted on: May 11, 2025
Industrial suppliers like Grainger and Zoro are foundational to the MRO (Maintenance, Repair, and Operations) ecosystem. Their websites contain rich, structured product data—perfect for analysis, catalog building, and competitive research. In this guide, we’ll walk through how to extract product-level data from Zoro using Python and BeautifulSoup.
Whether you're a developer, data analyst, or product manager, this tutorial will give you a practical introduction to web scraping for industrial supply data.
⚠️ Disclaimer: This tutorial is for educational purposes only. Always check and comply with a website’s Terms of Service and robots.txt
before scraping.
Tools You’ll Need
Make sure the following libraries are installed:
pip install requests beautifulsoup4 pandas
Target Product Page
We'll use the following Zoro product as our sample target:
Python Code: Scraping Product Details
This script extracts the following fields from the page:
-
Product Title
-
Brand
-
Price
-
MPN (MFR #)
-
SKU (Zoro #)
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://www.zoro.com/suncast-horizontal-storage-shed-resin-70-cu-ft-vanillastoneyblack-bms4720/i/G9101057/"
headers = {
"User-Agent": "Mozilla/5.0"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# Extract brand
brand_tag = soup.find("a", {"data-za": "product-brand-name"})
brand = brand_tag.get_text(strip=True) if brand_tag else "N/A"
# Extract product title
title_tag = soup.find("h1", {"data-za": "product-name"})
title = title_tag.get_text(strip=True) if title_tag else "N/A"
# Extract MFR #
mfr_tag = soup.find("span", {"data-za": "PDPMfrNo"})
mfr_number = mfr_tag.get_text(strip=True) if mfr_tag else "N/A"
# Extract Zoro #
zoro_tag = soup.find("span", {"data-za": "PDPZoroNo"})
zoro_number = zoro_tag.get_text(strip=True) if zoro_tag else "N/A"
# Extract price
price_tag = soup.find("div", class_="price-main")
price = price_tag.get_text(strip=True).replace('\xa0', ' ') if price_tag else "N/A"
# Combine results
product_data = {
"Title": title,
"Brand": brand,
"Price": price,
"MPN (MFR #)": mfr_number,
"SKU (Zoro #)": zoro_number
}
print(product_data)
# Optionally save to CSV
df = pd.DataFrame([product_data])
df.to_csv("zoro_product_data.csv", index=False)
Example Output
{
"Title": "Horizontal Storage Shed, Resin, 70 cu ft, Vanilla/Stoney/Black",
"Brand": "Suncast",
"Price": "$469.00",
"MPN (MFR #)": "BMS4720",
"SKU (Zoro #)": "G9101057"
}
This structure is clean and ready for catalog import, analysis, or dashboard use.
Access Full Product Datasets
Want to skip scraping and access thousands of industrial product listings in clean CSV format? We offer commercial datasets collected from top B2B platforms like Grainger, Zoro
Final Thoughts
Scraping platforms like Zoro and Grainger can unlock insights into the vast industrial supply ecosystem. Whether you're building an internal tool or fueling a product database, Python + BeautifulSoup provides an accessible, flexible way to extract structured data.
If you prefer ready-made data or want to scale beyond single-page scraping, our premium datasets give you a massive head start.
Latest Posts
Find a right dataset that you are looking for from crawl feeds store.
Submit data request if not able to find right dataset.
Custom request