{"id":"453d9e18-2457-4a41-9485-4a06ce325a83","shortId":"wmTYt4","kind":"skill","title":"phone-specs-scraper","tagline":"Scrape phone specifications from GSM Arena, PhoneDB, and alternative sites. Use when: (1) Comparing smartphone specs, (2) Researching device features, or (3) Building phone comparison tools.","description":"# Phone Specifications Scraper\n\nExtract detailed smartphone specs from popular phone database websites for comparison and research.\n\n## When to use\n\n- User asks to compare phone specifications\n- Researching device features before purchase\n- Building phone comparison tools or databases\n- Finding detailed technical specifications\n\n## Required tools / APIs\n\n- No external API required\n- Web scraping tools: curl, wget, or Playwright/Puppeteer\n- HTML parsing: BeautifulSoup (Python), cheerio (Node.js), or grep/sed (bash)\n\n## Phone Spec Websites\n\n### Primary Sources\n\n**1. GSM Arena (gsmarena.com)**\n- Largest phone database with detailed specs\n- URL pattern: `https://www.gsmarena.com/[brand]_[model]-[id].php`\n- Example: `https://www.gsmarena.com/google_pixel_9-13242.php`\n\n**2. PhoneDB (phonedb.net)**\n- Detailed device specifications database\n- URL pattern: `https://phonedb.net/index.php?m=device&s=query&d=[device-name]`\n\n**3. PhoneArena (phonearena.com)**\n- Phone reviews and comparisons\n- URL pattern: `https://www.phonearena.com/phones/[brand]-[model]`\n\n**4. MK Mobile Arena (mkmobilearena.com)**\n- Side-by-side phone comparisons\n- URL pattern: `https://mkmobilearena.com/phone-compare/[phone1]-vs-[phone2]`\n\n**5. TechRadar (techradar.com)**\n- Phone reviews with spec comparisons\n- URL pattern: `https://www.techradar.com/phones/[brand]-[model]`\n\n**6. DeviceBeast (devicebeast.com)**\n- Comprehensive device specs\n- URL pattern: `https://devicebeast.com/phones/[brand]-[model]`\n\n**7. Comparigon (comparigon.com)**\n- Side-by-side comparisons\n- URL pattern: `https://comparigon.com/phones/[brand]-[model]`\n\n**8. SpecsBattle (specsbattle.com)**\n- Detailed phone comparisons\n- URL pattern: `https://specsbattle.com/phones/[brand]-[model]`\n\n## Skills\n\n### scrape_gsmarena_specs\n\nScrape phone specs from GSM Arena using curl and grep.\n\n```bash\n# Get phone specs from GSM Arena\nPHONE_URL=\"https://www.gsmarena.com/google_pixel_9-13242.php\"\n\n# Download page and extract key specs\ncurl -s \"$PHONE_URL\" | grep -oP '(?<=<td class=\"ttl\">)[^<]+' | head -20\n\n# Extract specifications table\ncurl -s \"$PHONE_URL\" | grep -A2 'class=\"specs-cp\"' | grep -oP '(?<=<td>)[^<]+'\n```\n\n**Node.js with cheerio:**\n\n```javascript\nconst cheerio = require('cheerio');\n\nasync function scrapeGSMArenaSpecs(url) {\n  const response = await fetch(url);\n  const html = await response.text();\n  const $ = cheerio.load(html);\n  \n  const specs = {};\n  \n  // Extract basic info\n  specs.name = $('h1.specs-phone-name').text().trim();\n  specs.released = $('.specs-cp .specs-cp-release').text().trim();\n  specs.weight = $('.specs-cp .specs-cp-weight').text().trim();\n  \n  // Extract all specification tables\n  $('.specs-cp table').each((i, table) => {\n    const category = $(table).find('th').text().trim();\n    specs[category] = {};\n    \n    $(table).find('tr').each((j, row) => {\n      const key = $(row).find('td.ttl').text().trim();\n      const value = $(row).find('td.nfo').text().trim();\n      if (key && value) {\n        specs[category][key] = value;\n      }\n    });\n  });\n  \n  return specs;\n}\n\n// Usage\n// scrapeGSMArenaSpecs('https://www.gsmarena.com/google_pixel_9-13242.php').then(console.log);\n```\n\n### search_phone_specs\n\nSearch for phone specs across multiple sources.\n\n```bash\n# Search using SearXNG for phone comparison pages\nQUERY=\"Google Pixel 9 vs Pixel 10 specs comparison\"\nINSTANCE=\"https://searx.party\"\n\ncurl -s \"${INSTANCE}/search?q=${QUERY}&format=json\" | jq -r '.results[] | select(.url | contains(\"gsmarena\\|phonedb\\|mkmobilearena\")) | {title, url}'\n```\n\n**Node.js:**\n\n```javascript\nasync function searchPhoneSpecs(phone1, phone2) {\n  const query = `${phone1} vs ${phone2} specs comparison`;\n  const searxInstances = [\n    'https://searx.party',\n    'https://searx.tiekoetter.com',\n    'https://searx.ninja'\n  ];\n  \n  for (const instance of searxInstances) {\n    try {\n      const params = new URLSearchParams({\n        q: query,\n        format: 'json',\n        language: 'en'\n      });\n      \n      const res = await fetch(`${instance}/search?${params}`, { timeout: 10000 });\n      const data = await res.json();\n      \n      // Filter for phone spec sites\n      const specSites = data.results.filter(r => \n        r.url.includes('gsmarena.com') ||\n        r.url.includes('mkmobilearena.com') ||\n        r.url.includes('techradar.com') ||\n        r.url.includes('phonedb.net')\n      );\n      \n      if (specSites.length > 0) {\n        return specSites;\n      }\n    } catch (err) {\n      console.warn(`Instance ${instance} failed: ${err.message}`);\n    }\n  }\n  \n  throw new Error('No working search instances found');\n}\n\n// Usage\n// searchPhoneSpecs('Google Pixel 9', 'Google Pixel 10').then(console.log);\n```\n\n### compare_two_phones\n\nCompare specifications between two phones with highlighted differences.\n\n```javascript\nasync function comparePhones(phone1Specs, phone2Specs) {\n  const comparison = {\n    matches: [],\n    differences: [],\n    upgrades: [],\n    downgrades: []\n  };\n  \n  // Compare key specs\n  const keyFields = [\n    'chipset', 'display', 'battery', 'mainCamera', \n    'ram', 'storage', 'weight', 'releaseDate'\n  ];\n  \n  for (const field of keyFields) {\n    const val1 = phone1Specs[field];\n    const val2 = phone2Specs[field];\n    \n    if (val1 === val2) {\n      comparison.matches.push({ field, value: val1 });\n    } else {\n      comparison.differences.push({\n        field,\n        phone1: val1,\n        phone2: val2\n      });\n      \n      // Detect upgrades (simplified logic)\n      if (field === 'battery' || field === 'ram' || field === 'storage') {\n        const num1 = parseInt(val1);\n        const num2 = parseInt(val2);\n        if (!isNaN(num1) && !isNaN(num2) && num2 > num1) {\n          comparison.upgrades.push({ field, from: val1, to: val2 });\n        }\n      }\n    }\n  }\n  \n  return comparison;\n}\n\n// Usage example with formatted output\nfunction formatComparison(comparison) {\n  let output = '## Phone Comparison\\n\\n';\n  \n  output += '### ✅ Same Specs\\n';\n  comparison.matches.forEach(m => {\n    output += `- ${m.field}: ${m.value}\\n`;\n  });\n  \n  output += '\\n### 🔄 Differences\\n';\n  comparison.differences.forEach(d => {\n    output += `- **${d.field}**:\\n`;\n    output += `  - Phone 1: ${d.phone1}\\n`;\n    output += `  - Phone 2: ${d.phone2}\\n`;\n  });\n  \n  output += '\\n### ⬆️ Upgrades\\n';\n  comparison.upgrades.forEach(u => {\n    output += `- ${u.field}: ${u.from} → ${u.to}\\n`;\n  });\n  \n  return output;\n}\n```\n\n### scrape_comparison_site\n\nScrape pre-formatted comparison from sites like MK Mobile Arena.\n\n```bash\n# Get comparison from MK Mobile Arena\nCOMPARISON_URL=\"https://mkmobilearena.com/phone-compare/google-pixel-9-vs-google-pixel-10\"\n\n# Extract comparison table\ncurl -s \"$COMPARISON_URL\" | grep -oP '(?<=<td[^>]*>)[^<]+' | head -50\n```\n\n**Node.js:**\n\n```javascript\nasync function scrapeComparisonSite(url) {\n  const response = await fetch(url);\n  const html = await response.text();\n  const $ = cheerio.load(html);\n  \n  const comparison = {\n    phone1: {},\n    phone2: {},\n    differences: []\n  };\n  \n  // Extract phone names\n  comparison.phone1.name = $('table tr:first-child td:nth-child(2) h3').text().trim();\n  comparison.phone2.name = $('table tr:first-child td:nth-child(3) h3').text().trim();\n  \n  // Extract specs row by row\n  $('table tr').each((i, row) => {\n    const specName = $(row).find('td:first-child').text().trim();\n    const phone1Value = $(row).find('td:nth-child(2)').text().trim();\n    const phone2Value = $(row).find('td:nth-child(3)').text().trim();\n    \n    if (specName && phone1Value && phone2Value) {\n      comparison.phone1[specName] = phone1Value;\n      comparison.phone2[specName] = phone2Value;\n      \n      if (phone1Value !== phone2Value) {\n        comparison.differences.push({\n          spec: specName,\n          phone1: phone1Value,\n          phone2: phone2Value\n        });\n      }\n    }\n  });\n  \n  return comparison;\n}\n```\n\n## Rate limits / Best practices\n\n- Respect robots.txt - check `/robots.txt` before scraping\n- Rate limit: 1 request per second maximum\n- Cache results for at least 1 hour to avoid redundant requests\n- Use rotating User-Agent strings\n- Handle JavaScript-rendered sites with Playwright/Puppeteer when needed\n- Some sites block scrapers - use fallback sources\n\n## Agent prompt\n\n```text\nYou can scrape phone specifications from GSM Arena and other sources. When a user asks to compare phones:\n\n1. First try MK Mobile Arena or similar comparison sites that show side-by-side specs\n2. If not available, scrape individual phone pages from GSM Arena\n3. Extract key specs: display, chipset, battery, cameras, RAM, storage, release date\n4. Highlight differences and upgrades between models\n5. Format output with clear sections: Same Specs, Differences, Upgrades\n\nAlways cite the source URL and respect site terms of service.\n```\n\n## Troubleshooting\n\n**Error: \"403 Forbidden\"**\n- Site is blocking scrapers\n- Solution: Try alternative sources (PhoneDB, PhoneArena, TechRadar)\n\n**Error: \"Empty results\"**\n- Page structure changed or phone not found\n- Solution: Verify phone name spelling and model number\n\n**Error: \"JavaScript required\"**\n- Site uses client-side rendering\n- Solution: Use Playwright/Puppeteer instead of curl\n\n**Rate limited**\n- Too many requests to the site\n- Solution: Add delays (sleep 2) between requests\n\n## See also\n\n- [using-web-scraping](../using-web-scraping/SKILL.md) — General web scraping techniques\n- [web-search-api](../web-search-api/SKILL.md) — Find phone comparison pages via search","tags":["phone","specs","scraper","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools"],"capabilities":["skill","source-besoeasy","skill-phone-specs-scraper","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/phone-specs-scraper","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (9,498 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:04.365Z","embedding":null,"createdAt":"2026-04-18T22:10:51.122Z","updatedAt":"2026-05-02T12:55:04.365Z","lastSeenAt":"2026-05-02T12:55:04.365Z","tsv":"'-20':245 '-50':704 '/[brand]_[model]-[id].php':113 '/google_pixel_9-13242.php':117,231 '/google_pixel_9-13242.php'').then(console.log);':370 '/index.php?m=device&s=query&d=[device-name]':129 '/phone-compare/[phone1]-vs-[phone2]':157 '/phone-compare/google-pixel-9-vs-google-pixel-10':692 '/phones/[brand]-[model]':141,170,181,194,205 '/robots.txt':830 '/search':403,459 '/using-web-scraping/skill.md':1031 '/web-search-api/skill.md':1040 '0':486 '1':17,99,646,835,845,894 '10':395,511 '10000':462 '2':21,118,651,741,787,911,1022 '3':26,130,755,798,922 '4':142,934 '403':964 '5':158,941 '6':171 '7':182 '8':195 '9':392,508 'a2':254 'across':378 'add':1019 'agent':855,873 'also':1026 'altern':13,972 'alway':951 'api':73,76,1039 'arena':10,101,145,215,226,680,687,883,899,921 'ask':51,890 'async':269,421,526,707 'avail':914 'avoid':848 'await':275,280,456,465,713,718 'bash':93,220,381,681 'basic':288 'batteri':544,583,928 'beautifulsoup':87 'best':825 'block':868,968 'build':27,61 'cach':840 'camera':929 'catch':489 'categori':329,336,361 'chang':982 'check':829 'cheerio':89,263,266,268 'cheerio.load':283,721 'child':736,740,750,754,776,786,797 'chipset':542,927 'cite':952 'class':255 'clear':945 'client':1001 'client-sid':1000 'compar':18,53,514,517,537,892 'comparephon':528 'comparigon':183 'comparigon.com':184,193 'comparigon.com/phones/[brand]-[model]':192 'comparison':29,44,63,136,152,165,189,200,387,397,432,532,610,618,622,668,674,683,688,694,698,724,822,902,1043 'comparison.differences.foreach':639 'comparison.differences.push':571,814 'comparison.matches.foreach':629 'comparison.matches.push':566 'comparison.phone1':805 'comparison.phone1.name':731 'comparison.phone2':808 'comparison.phone2.name':745 'comparison.upgrades.foreach':658 'comparison.upgrades.push':603 'comprehens':174 'console.log':513 'console.warn':491 'const':265,273,278,282,285,328,343,350,426,433,439,444,454,463,472,531,540,551,555,559,588,592,711,716,720,723,769,779,790 'contain':413 'cp':258,300,303,310,313,323 'curl':81,217,238,249,400,696,1009 'd':640 'd.field':642 'd.phone1':647 'd.phone2':652 'data':464 'data.results.filter':474 'databas':41,66,105,124 'date':933 'delay':1020 'detail':35,68,107,121,198 'detect':577 'devic':23,57,122,175 'devicebeast':172 'devicebeast.com':173,180 'devicebeast.com/phones/[brand]-[model]':179 'differ':524,534,637,727,936,949 'display':543,926 'downgrad':536 'download':232 'els':570 'empti':978 'en':453 'err':490 'err.message':495 'error':498,963,977,995 'exampl':114,612 'extern':75 'extract':34,235,246,287,317,693,728,759,923 'fail':494 'fallback':871 'featur':24,58 'fetch':276,457,714 'field':552,558,562,567,572,582,584,586,604 'filter':467 'find':67,331,338,346,353,772,782,793,1041 'first':735,749,775,895 'first-child':734,748,774 'forbidden':965 'format':406,450,614,673,942 'formatcomparison':617 'found':503,986 'function':270,422,527,616,708 'general':1032 'get':221,682 'googl':390,506,509 'grep':219,242,253,259,700 'grep/sed':92 'gsm':9,100,214,225,882,920 'gsmarena':208,414 'gsmarena.com':102,477 'h1.specs':291 'h3':742,756 'handl':857 'head':244,703 'highlight':523,935 'hour':846 'html':85,279,284,717,722 'individu':916 'info':289 'instanc':398,402,440,458,492,493,502 'instead':1007 'isnan':597,599 'j':341 'javascript':264,420,525,706,859,996 'javascript-rend':858 'jq':408 'json':407,451 'key':236,344,358,362,538,924 'keyfield':541,554 'languag':452 'largest':103 'least':844 'let':619 'like':677 'limit':824,834,1011 'logic':580 'm':630 'm.field':632 'm.value':633 'maincamera':545 'mani':1013 'match':533 'maximum':839 'mk':143,678,685,897 'mkmobilearena':416 'mkmobilearena.com':146,156,479,691 'mkmobilearena.com/phone-compare/[phone1]-vs-[phone2]':155 'mkmobilearena.com/phone-compare/google-pixel-9-vs-google-pixel-10':690 'mobil':144,679,686,898 'model':940,993 'multipl':379 'n':623,624,628,634,636,638,643,648,653,655,657,664 'name':294,730,990 'need':865 'new':446,497 'node.js':90,261,419,705 'nth':739,753,785,796 'nth-child':738,752,784,795 'num1':589,598,602 'num2':593,600,601 'number':994 'op':243,260,701 'output':615,620,625,631,635,641,644,649,654,660,666,943 'page':233,388,918,980,1044 'param':445,460 'pars':86 'parseint':590,594 'pattern':110,126,138,154,167,178,191,202 'per':837 'phone':2,6,28,31,40,54,62,94,104,133,151,161,199,211,222,227,240,251,293,372,376,386,469,516,521,621,645,650,729,879,893,917,984,989,1042 'phone-nam':292 'phone-specs-scrap':1 'phone1':424,428,573,725,817 'phone1specs':529,557 'phone1value':780,803,807,812,818 'phone2':425,430,575,726,819 'phone2specs':530,561 'phone2value':791,804,810,813,820 'phonearena':131,975 'phonearena.com':132 'phonedb':11,119,415,974 'phonedb.net':120,128,483 'phonedb.net/index.php?m=device&s=query&d=[device-name]':127 'pixel':391,394,507,510 'playwright/puppeteer':84,863,1006 'popular':39 'practic':826 'pre':672 'pre-format':671 'primari':97 'prompt':874 'purchas':60 'python':88 'q':404,448 'queri':389,405,427,449 'r':409,475 'r.url.includes':476,478,480,482 'ram':546,585,930 'rate':823,833,1010 'redund':849 'releas':304,932 'released':549 'render':860,1003 'request':836,850,1014,1024 'requir':71,77,267,997 'res':455 'res.json':466 'research':22,46,56 'respect':827,957 'respons':274,712 'response.text':281,719 'result':410,841,979 'return':364,487,609,665,821 'review':134,162 'robots.txt':828 'rotat':852 'row':342,345,352,761,763,768,771,781,792 'scrape':5,79,207,210,667,670,832,878,915,1030,1034 'scrapecomparisonsit':709 'scrapegsmarenaspec':271,367 'scraper':4,33,869,969 'search':371,374,382,501,1038,1046 'searchphonespec':423,505 'searx.ninja':437 'searx.party':399,435 'searx.tiekoetter.com':436 'searxinst':434,442 'searxng':384 'second':838 'section':946 'see':1025 'select':411 'servic':961 'show':905 'side':148,150,186,188,907,909,1002 'side-by-sid':147,185,906 'similar':901 'simplifi':579 'site':14,471,669,676,861,867,903,958,966,998,1017 'skill':206 'skill-phone-specs-scraper' 'sleep':1021 'smartphon':19,36 'solut':970,987,1004,1018 'sourc':98,380,872,886,954,973 'source-besoeasy' 'spec':3,20,37,95,108,164,176,209,212,223,237,257,286,299,302,309,312,322,335,360,365,373,377,396,431,470,539,627,760,815,910,925,948 'specif':7,32,55,70,123,247,319,518,880 'specnam':770,802,806,809,816 'specs-cp':256,298,308,321 'specs-cp-releas':301 'specs-cp-weight':311 'specs.name':290 'specs.released':297 'specs.weight':307 'specsbattl':196 'specsbattle.com':197,204 'specsbattle.com/phones/[brand]-[model]':203 'specsit':473,488 'specsites.length':485 'spell':991 'storag':547,587,931 'string':856 'structur':981 'tabl':248,320,324,327,330,337,695,732,746,764 'td':702,737,751,773,783,794 'td.nfo':354 'td.ttl':347 'technic':69 'techniqu':1035 'techradar':159,976 'techradar.com':160,481 'term':959 'text':295,305,315,333,348,355,743,757,777,788,799,875 'th':332 'throw':496 'timeout':461 'titl':417 'tool':30,64,72,80 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'tr':339,733,747,765 'tri':443,896,971 'trim':296,306,316,334,349,356,744,758,778,789,800 'troubleshoot':962 'two':515,520 'u':659 'u.field':661 'u.from':662 'u.to':663 'upgrad':535,578,656,938,950 'url':109,125,137,153,166,177,190,201,228,241,252,272,277,412,418,689,699,710,715,955 'urlsearchparam':447 'usag':366,504,611 'use':15,49,216,383,851,870,999,1005,1028 'user':50,854,889 'user-ag':853 'using-web-scrap':1027 'val1':556,564,569,574,591,606 'val2':560,565,576,595,608 'valu':351,359,363,568 'verifi':988 'via':1045 'vs':393,429 'web':78,1029,1033,1037 'web-search-api':1036 'websit':42,96 'weight':314,548 'wget':82 'work':500 'www.gsmarena.com':112,116,230,369 'www.gsmarena.com/[brand]_[model]-[id].php':111 'www.gsmarena.com/google_pixel_9-13242.php':115,229 'www.gsmarena.com/google_pixel_9-13242.php'').then(console.log);':368 'www.phonearena.com':140 'www.phonearena.com/phones/[brand]-[model]':139 'www.techradar.com':169 'www.techradar.com/phones/[brand]-[model]':168","prices":[{"id":"de8b8792-80e0-4fde-80c9-d7474fd00cb6","listingId":"453d9e18-2457-4a41-9485-4a06ce325a83","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:51.122Z"}],"sources":[{"listingId":"453d9e18-2457-4a41-9485-4a06ce325a83","source":"github","sourceId":"besoeasy/open-skills/phone-specs-scraper","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/phone-specs-scraper","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:51.122Z","lastSeenAt":"2026-05-02T12:55:04.365Z"}],"details":{"listingId":"453d9e18-2457-4a41-9485-4a06ce325a83","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"phone-specs-scraper","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"3b7b180c675dd9fd69c9d6292ec47c5988e9d268","skill_md_path":"skills/phone-specs-scraper/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/phone-specs-scraper"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"phone-specs-scraper","description":"Scrape phone specifications from GSM Arena, PhoneDB, and alternative sites. Use when: (1) Comparing smartphone specs, (2) Researching device features, or (3) Building phone comparison tools."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/phone-specs-scraper"},"updatedAt":"2026-05-02T12:55:04.365Z"}}