Skip to main content
ClaudeWave
Skill128 repo starsupdated 2mo ago

phone-specs-scraper

phone-specs-scraper extracts detailed smartphone specifications from GSM Arena, PhoneDB, PhoneArena, and other phone database websites. Use this skill when comparing phone models, researching device features before purchase, building phone comparison tools, or gathering technical specifications from multiple sources for analysis and documentation.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/besoeasy/open-skills /tmp/phone-specs-scraper && cp -r /tmp/phone-specs-scraper/skills/phone-specs-scraper ~/.claude/skills/phone-specs-scraper
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# Phone Specifications Scraper

Extract detailed smartphone specs from popular phone database websites for comparison and research.

## When to use

- User asks to compare phone specifications
- Researching device features before purchase
- Building phone comparison tools or databases
- Finding detailed technical specifications

## Required tools / APIs

- No external API required
- Web scraping tools: curl, wget, or Playwright/Puppeteer
- HTML parsing: BeautifulSoup (Python), cheerio (Node.js), or grep/sed (bash)

## Phone Spec Websites

### Primary Sources

**1. GSM Arena (gsmarena.com)**
- Largest phone database with detailed specs
- URL pattern: `https://www.gsmarena.com/[brand]_[model]-[id].php`
- Example: `https://www.gsmarena.com/google_pixel_9-13242.php`

**2. PhoneDB (phonedb.net)**
- Detailed device specifications database
- URL pattern: `https://phonedb.net/index.php?m=device&s=query&d=[device-name]`

**3. PhoneArena (phonearena.com)**
- Phone reviews and comparisons
- URL pattern: `https://www.phonearena.com/phones/[brand]-[model]`

**4. MK Mobile Arena (mkmobilearena.com)**
- Side-by-side phone comparisons
- URL pattern: `https://mkmobilearena.com/phone-compare/[phone1]-vs-[phone2]`

**5. TechRadar (techradar.com)**
- Phone reviews with spec comparisons
- URL pattern: `https://www.techradar.com/phones/[brand]-[model]`

**6. DeviceBeast (devicebeast.com)**
- Comprehensive device specs
- URL pattern: `https://devicebeast.com/phones/[brand]-[model]`

**7. Comparigon (comparigon.com)**
- Side-by-side comparisons
- URL pattern: `https://comparigon.com/phones/[brand]-[model]`

**8. SpecsBattle (specsbattle.com)**
- Detailed phone comparisons
- URL pattern: `https://specsbattle.com/phones/[brand]-[model]`

## Skills

### scrape_gsmarena_specs

Scrape phone specs from GSM Arena using curl and grep.

```bash
# Get phone specs from GSM Arena
PHONE_URL="https://www.gsmarena.com/google_pixel_9-13242.php"

# Download page and extract key specs
curl -s "$PHONE_URL" | grep -oP '(?<=<td class="ttl">)[^<]+' | head -20

# Extract specifications table
curl -s "$PHONE_URL" | grep -A2 'class="specs-cp"' | grep -oP '(?<=<td>)[^<]+'
```

**Node.js with cheerio:**

```javascript
const cheerio = require('cheerio');

async function scrapeGSMArenaSpecs(url) {
  const response = await fetch(url);
  const html = await response.text();
  const $ = cheerio.load(html);
  
  const specs = {};
  
  // Extract basic info
  specs.name = $('h1.specs-phone-name').text().trim();
  specs.released = $('.specs-cp .specs-cp-release').text().trim();
  specs.weight = $('.specs-cp .specs-cp-weight').text().trim();
  
  // Extract all specification tables
  $('.specs-cp table').each((i, table) => {
    const category = $(table).find('th').text().trim();
    specs[category] = {};
    
    $(table).find('tr').each((j, row) => {
      const key = $(row).find('td.ttl').text().trim();
      const value = $(row).find('td.nfo').text().trim();
      if (key && value) {
        specs[category][key] = value;
      }
    });
  });
  
  return specs;
}

// Usage
// scrapeGSMArenaSpecs('https://www.gsmarena.com/google_pixel_9-13242.php').then(console.log);
```

### search_phone_specs

Search for phone specs across multiple sources.

```bash
# Search using SearXNG for phone comparison pages
QUERY="Google Pixel 9 vs Pixel 10 specs comparison"
INSTANCE="https://searx.party"

curl -s "${INSTANCE}/search?q=${QUERY}&format=json" | jq -r '.results[] | select(.url | contains("gsmarena\|phonedb\|mkmobilearena")) | {title, url}'
```

**Node.js:**

```javascript
async function searchPhoneSpecs(phone1, phone2) {
  const query = `${phone1} vs ${phone2} specs comparison`;
  const searxInstances = [
    'https://searx.party',
    'https://searx.tiekoetter.com',
    'https://searx.ninja'
  ];
  
  for (const instance of searxInstances) {
    try {
      const params = new URLSearchParams({
        q: query,
        format: 'json',
        language: 'en'
      });
      
      const res = await fetch(`${instance}/search?${params}`, { timeout: 10000 });
      const data = await res.json();
      
      // Filter for phone spec sites
      const specSites = data.results.filter(r => 
        r.url.includes('gsmarena.com') ||
        r.url.includes('mkmobilearena.com') ||
        r.url.includes('techradar.com') ||
        r.url.includes('phonedb.net')
      );
      
      if (specSites.length > 0) {
        return specSites;
      }
    } catch (err) {
      console.warn(`Instance ${instance} failed: ${err.message}`);
    }
  }
  
  throw new Error('No working search instances found');
}

// Usage
// searchPhoneSpecs('Google Pixel 9', 'Google Pixel 10').then(console.log);
```

### compare_two_phones

Compare specifications between two phones with highlighted differences.

```javascript
async function comparePhones(phone1Specs, phone2Specs) {
  const comparison = {
    matches: [],
    differences: [],
    upgrades: [],
    downgrades: []
  };
  
  // Compare key specs
  const keyFields = [
    'chipset', 'display', 'battery', 'mainCamera', 
    'ram', 'storage', 'weight', 'releaseDate'
  ];
  
  for (const field of keyFields) {
    const val1 = phone1Specs[field];
    const val2 = phone2Specs[field];
    
    if (val1 === val2) {
      comparison.matches.push({ field, value: val1 });
    } else {
      comparison.differences.push({
        field,
        phone1: val1,
        phone2: val2
      });
      
      // Detect upgrades (simplified logic)
      if (field === 'battery' || field === 'ram' || field === 'storage') {
        const num1 = parseInt(val1);
        const num2 = parseInt(val2);
        if (!isNaN(num1) && !isNaN(num2) && num2 > num1) {
          comparison.upgrades.push({ field, from: val1, to: val2 });
        }
      }
    }
  }
  
  return comparison;
}

// Usage example with formatted output
function formatComparison(comparison) {
  let output = '## Phone Comparison\n\n';
  
  output += '### ✅ Same Specs\n';
  comparison.matches.fo