Fixing the Google Maps Scraper: When Microsoft Shuts Down the Playwright CDN
**TL;DR:** Microsoft removed all old Playwright drivers from their Azure CDN in June 2026, breaking the `google-maps-scraper` project. This post documents the problem, failed solutions, and the working fix that patches the dependency chain.
---
## The Problem
After a routine update attempt, the Google Maps Scraper failed with cryptic 404 errors:
```
error: got non 200 status code: 404 (404 Not Found) from https://playwright.azureedge.net/builds/driver/playwright-1.57.0-linux.zip
error: got non 200 status code: 404 (404 Not Found) from https://playwright-akamai.azureedge.net/builds/driver/playwright-1.57.0-linux.zip
error: got non 200 status code: 404 (404 Not Found) from https://playwright-verizon.azureedge.net/builds/driver/playwright-1.57.0-linux.zip
```
### Root Cause Analysis
The dependency chain looked like this:
```
google-maps-scraper
└── scrapemate v1.2.1
└── playwright-community/playwright-go v0.5700.1
└── Playwright driver 1.57.0 (404 Not Found ❌)
```
**What happened:**
- Microsoft deprecated their Azure CDN for Playwright drivers in June 2026
- All driver versions before 1.61.x were removed
- The `playwright-community/playwright-go` fork (used by `scrapemate`) was abandoned
- Only `mxschmitt/playwright-go` (the official maintained fork) works with new CDN URLs
---
## Failed Solutions
### Attempt 1: Manual Driver Download
**Idea:** Download driver 1.57.0 from alternative sources.
**Result:** ❌ The driver simply doesn't exist anywhere anymore.
---
### Attempt 2: Use Newer Driver with Version Patching
**Idea:** Download driver 1.61.1 and patch its `package.json` to report version 1.57.0.
```bash
# Download working driver
go run github.com/mxschmitt/playwright-go/cmd/playwright@latest install
# Patch version metadata
sed -i 's/"version": "1.61.1"/"version": "1.57.0"/' \
~/.cache/ms-playwright-go/1.61.1/package/package.json
```
**Result:** ❌ Protocol incompatibility. The library and driver speak different protocols:
```
panic: Debugger
goroutine 52 [running]:
github.com/playwright-community/playwright-go.createObjectFactory(...)
/home/maw/go/pkg/mod/github.com/playwright-community/playwright-go@v0.5700.1/objectFactory.go:83
```
---
### Attempt 3: Update scrapemate Dependency
**Idea:** Update to the latest `scrapemate` version.
```bash
go get -u github.com/gosom/scrapemate@latest
go mod tidy
```
**Result:** ❌ `scrapemate v1.2.1` (latest as of July 2026) still uses the broken `playwright-community` fork.
---
### Attempt 4: Force Dependency Replacement
**Idea:** Use Go's `replace` directive to swap the playwright dependency.
```go
replace github.com/playwright-community/playwright-go => github.com/mxschmitt/playwright-go v0.6100.0
```
**Result:** ❌ Go module conflicts due to internal package usage.
---
## The Working Solution
Since upstream wasn't fixed, the only option was **local patching of scrapemate**.
### Step 1: Clone and Patch scrapemate
```bash
cd ~/google-maps-scraper
# Clone scrapemate locally
git clone https://github.com/gosom/scrapemate.git scrapemate-local
cd scrapemate-local
# Replace all playwright-community imports with mxschmitt
find . -name "*.go" -type f -exec sed -i \
's|github.com/playwright-community/playwright-go|github.com/mxschmitt/playwright-go|g' {} +
# Update go.mod
sed -i 's|github.com/playwright-community/playwright-go.*|github.com/mxschmitt/playwright-go v0.6100.0|' go.mod
# Tidy dependencies
go mod tidy
```
### Step 2: Use Local Patched Version
```bash
cd ~/google-maps-scraper
# Add replace directive to use local scrapemate
echo "" >> go.mod
echo "replace github.com/gosom/scrapemate => ./scrapemate-local" >> go.mod
# Tidy
go mod tidy
```
### Step 3: Run the Scraper
```bash
go run main.go -data-folder /path/to/output
```
**Result:** ✅ Success!
```
2026/07/18 16:17:34 INFO Downloading browsers...
2026/07/18 16:17:35 INFO Downloaded browsers successfully
{"level":"info","component":"scrapemate","message":"starting scrapemate"}
{"level":"info","component":"scrapemate","numOfJobsCompleted":204,"numOfJobsFailed":0,"speed":"22.67 jobs/min"}
```
---
## Why This Works
The patched solution fixes the entire dependency chain:
```
google-maps-scraper
└── scrapemate (local patched version)
└── mxschmitt/playwright-go v0.6100.0 ✅
└── Playwright driver 1.61.1 (downloads successfully ✅)
```
**Key differences:**
- `mxschmitt/playwright-go v0.6100.0` uses updated CDN URLs
- Driver 1.61.1 is available and downloads successfully
- Protocol compatibility between library and driver
- No external CDN dependencies on deprecated URLs
---
## Making It Portable: Docker Image
To preserve the working setup, I created a Docker image:
```dockerfile
FROM golang:1.26-bookworm
# Install Playwright dependencies
RUN apt-get update && apt-get install -y \
ca-certificates fonts-liberation libasound2 \
libatk-bridge2.0-0 libatk1.0-0 libatspi2.0-0 \
libcups2 libdbus-1-3 libdrm2 libgbm1 \
libgtk-3-0 libnspr4 libnss3 libwayland-client0 \
libxcomposite1 libxdamage1 libxfixes3 \
libxkbcommon0 libxrandr2 xdg-utils \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy working system (includes patched scrapemate-local)
COPY . .
# Copy working Playwright driver
RUN mkdir -p /root/.cache/ms-playwright-go && \
cp -r .playwright-cache/* /root/.cache/ms-playwright-go/
RUN mkdir -p /data
EXPOSE 8080
CMD ["go", "run", "main.go", "-data-folder", "/data"]
```
**Build and save:**
```bash
# Build image
sudo docker build -f Dockerfile.fixed -t google-maps-scraper:fixed .
# Save for backup/portability
sudo docker save google-maps-scraper:fixed | gzip > google-maps-scraper-fixed.tar.gz
# Use on any system
docker load < google-maps-scraper-fixed.tar.gz
docker run -d -p 8080:8080 -v ./output:/data google-maps-scraper:fixed
```
---
## Lessons Learned
### 1. **CDN Deprecation is a Real Risk**
Cloud providers can and will remove old files. Always have fallback strategies.
### 2. **Abandoned Forks Are Dangerous**
`playwright-community/playwright-go` was abandoned. Always check if dependencies are actively maintained.
### 3. **Protocol Compatibility Matters**
You can't just swap driver versions. The library and driver must speak the same protocol version.
### 4. **Local Patching Works**
When upstream is broken and unresponsive, local patches can save the day.
### 5. **Docker Preserves Working States**
Containerizing a working system ensures reproducibility across environments.
---
## Impact
This issue affects **all users** of `google-maps-scraper` since the CDN shutdown in June 2026. The fix has been:
- Tested with 200+ successful scraping jobs
- Packaged as a Docker image for portability
- Documented for the community
### GitHub Issue
I've opened an issue on the upstream repository to help others facing this problem:
- **Repository:** https://github.com/gosom/google-maps-scraper
- **Issue:** Playwright driver download fails - Azure CDN shutdown
---
## Conclusion
What started as a simple "driver not found" error turned into a deep dive through:
- Dependency chains
- Protocol compatibility
- CDN infrastructure changes
- Go module system intricacies
The solution required patching a dependency two levels deep in the chain, but the result is a stable, working scraper that will continue functioning regardless of upstream changes.
**Final Stats:**
- Time to debug: ~90 minutes
- Failed attempts: 4
- Working solution: Local dependency patching
- Success rate: 204/204 jobs (100%)
- Speed: 22.67 jobs/min
---
## Resources
- **Google Maps Scraper:** https://github.com/gosom/google-maps-scraper
- **Scrapemate:** https://github.com/gosom/scrapemate
- **Playwright-Go (Official):** https://github.com/mxschmitt/playwright-go
- **Playwright-Go (Abandoned):** https://github.com/playwright-community/playwright-go
---
*Published: July 18, 2026*
*Tags: #golang #playwright #webscraping #debugging #docker*