Flooring Scraper & GoHighLevel Uploader

Job ID: 39816444

Budget: $30 – $250 USD

I need a script that starts at the six category pages listed below, works its way through every flooring SKU, captures the full specification table, all product images, and any linked PDFs or other related documents, then sends everything straight into a custom object inside my GoHighLevel (GHL) account.

Pages to crawl
https://www.msisurfaces.com/flooring-tile/
https://www.msisurfaces.com/luxury-vinyl-flooring/
https://www.msisurfaces.com/waterproof-hybrid-rigid-core/
https://www.msisurfaces.com/w-luxury-genuine-hardwood/
https://www.armstrongflooring.com/residential/en-us/hardwood.html?size=24
https://www.armstrongflooring.com/residential/en-us/rigid-core.html?size=24

Key requirements
• Scrape product specs and any related documents; customer reviews are not required.
• Download every product image you find, upload each one to the GHL file endpoint, and store the returned URL in the custom object. Do the same for PDFs and warranty sheets.
• Decide whether a record is new by comparing the incoming product name to names that already exist in the object; create when missing, otherwise update.
•Store all product specs into the GHL endpoints
• Run headless on an Ubuntu VPS. Python (requests, BeautifulSoup, Selenium, or Scrapy) is preferred, but Node with Cheerio/Puppeteer is fine. - Flexible here if you propose an approach.

Deliverables
• Clean, well-commented source code with variables for the start URLs and my GHL API key.
• README that shows how to install dependencies, run the scraper once, and schedule it via cron.
• Sample JSON payload that maps scraped fields to my custom object properties.
• Log from a first run that clearly lists how many products were created versus updated.

Acceptance criteria
Every SKU visible on the six pages appears in my GHL custom object with its specs and paginate through other pages, at least one image URL per product, and uploaded documents. A second run on the same data must complete without creating duplicates.
All data must be uploaded into a custom object in gohighlevel.

I would like to build this in a way to prove the concept that I can then provide more future vendors to be added to and handled to this script.