{"id":15711365,"url":"https://github.com/adamslack/chrome-web-store-scraper","last_synced_at":"2025-09-02T08:39:26.017Z","repository":{"id":57198494,"uuid":"144561701","full_name":"AdamSlack/chrome-web-store-scraper","owner":"AdamSlack","description":"A node js package for scraping the chrome web store. `npm i chrome-web-store-scraper`","archived":false,"fork":false,"pushed_at":"2021-07-23T17:48:21.000Z","size":4275,"stargazers_count":25,"open_issues_count":4,"forks_count":9,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-11T21:56:50.308Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/chrome-web-store-scraper","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AdamSlack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-13T10:02:34.000Z","updated_at":"2024-11-28T19:57:31.000Z","dependencies_parsed_at":"2022-09-16T14:10:23.766Z","dependency_job_id":null,"html_url":"https://github.com/AdamSlack/chrome-web-store-scraper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AdamSlack/chrome-web-store-scraper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdamSlack%2Fchrome-web-store-scraper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdamSlack%2Fchrome-web-store-scraper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdamSlack%2Fchrome-web-store-scraper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdamSlack%2Fchrome-web-store-scraper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AdamSlack","download_url":"https://codeload.github.com/AdamSlack/chrome-web-store-scraper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdamSlack%2Fchrome-web-store-scraper/sbom","scorecard":{"id":8556,"data":{"date":"2025-08-11","repo":{"name":"github.com/AdamSlack/chrome-web-store-scraper","commit":"323d2296db0e39558d8b7091de98dfc731d8bf55"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-p28h-cc7q-c4fg","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-jg8v-48h5-wgxg","Warn: Project is vulnerable to: GHSA-36fh-84j7-cv5h","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-g6ww-v8xp-vmwg","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-776f-qx25-q3cc"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-14T14:05:31.491Z","repository_id":57198494,"created_at":"2025-08-14T14:05:31.491Z","updated_at":"2025-08-14T14:05:31.491Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273257275,"owners_count":25073529,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-02T02:00:09.530Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-03T21:12:44.141Z","updated_at":"2025-09-02T08:39:25.945Z","avatar_url":"https://github.com/AdamSlack.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NOTICE\nIt has been a very long time since i looked at this repo. i would guess it no longer functions. It might not take too much effort to fix up though.\n\n----------\n[![CircleCI](https://circleci.com/gh/AdamSlack/chrome-web-store-scraper.svg?style=shield)](https://circleci.com/gh/AdamSlack/chrome-web-store-scraper)\n[![npm version](https://badge.fury.io/js/chrome-web-store-scraper.svg)](https://badge.fury.io/js/chrome-web-store-scraper)\n[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/Naereen/StrapDown.js/blob/master/LICENSE)\n[![sonarcloud](https://sonarcloud.io/api/project_badges/measure?project=AdamSlack_chrome-web-store-scraper\u0026metric=alert_status)](https://sonarcloud.io/api/project_badges/measure?project=AdamSlack_chrome-web-store-scraper\u0026metric=alert_status)\n# chrome-web-store-scraper\nA node js package for scraping the chrome web store.\n\n\n# Requirements\n\nThis project requires selenium, a Web Browser Automation tool. The latest version of the Selenium Standalone Server can be downloaded from [seleniumhq](https://www.seleniumhq.org/download/).\n\nSelenium Server must also be installed as `selenium` on the system PATH. For linux, a `selenium` bash script is included that can be paired with the `selenium.jar` for ease of use.\n\nThe [selenium-webdriver](https://www.npmjs.com/package/selenium-webdriver) npm package has some details on what is required.\n\n# Selenium Setup\n\nThe Selenium server must be on the system path as '`selenium`' the easiest way to set it up to work with the chrome web store scraper is to make the `selenium` bash script (that is included this project) an executable with `chmod +x selenium` and then copy that file, along with the selenium server `.jar` file to `/bin/` or somewhere similar.\n\nWhen copying the selenium server `.jar` make sure it is renamed from `selenium-server-standalone-3.14.0.jar` or whatever it is currently called, to just `selenium.jar`.\n\n## chromedriver\n\nAs well as selenium, you're going to need the latest [chromedriver](http://chromedriver.chromium.org/) installed.\n\n## chrome-browser-stable\n\nA chrome browser is also required. you can get the latest [chrome-broswer-stable](https://www.chromium.org/getting-involved/dev-channel) from chromium.\n\n# How To Use\n\nYou can use this to scrape search results for chrome extensions, or to scrape store information for a specific extension.\n\nTo include the scraper in your project:\n```js\nconst ChromeWebScraper = require('chrome-web-store-scraper');\nconst scraper = new ChromeWebScraper();\n```\n\n## Search\n\nThe most basic search just requires you to provide a search term.\n```js\n    scraper.search('some-search-term').then(\n        (res) =\u003e console.log(res),\n        (err) =\u003e console.log(err)\n    );\n```\n\nExample Response\n```json\n[\n  {\n    \"title\": \"Data Scraper - Easy Web Scraping\",\n    \"description\": \"Data Scraper extracts data out of HTML web pages and imports it into Microsoft Excel spreadsheets\",\n    \"author\": \"\",\n    \"category\": \"Productivity\",\n    \"rating\": 4.107231920199501,\n    \"numberOfRatings\": 401,\n    \"storeURL\": \"https://chrome.google.com/webstore/detail/data-scraper-easy-web-scr/nndknepjnldbdbepjfgmncbggmopgden\"\n  },\n  ...\n]\n```\n\nthere are additional options than can be used to perform a more directed search\n\n### Search categories\nYou can provide as a category which the scraper will then use when building a search request, only one category can be provided.\n\nValid Categories\n```json\nall\naccessibility\nblogging\nbyGoogle\ndeveloperTools\nfun\nnewsAndWeather\nphotos\nproductivity\nsearchTools\nshopping\nsocialAndCommunication\nsports\n```\n\nCategories can be provided in an options JSON object as demonstrated below:\n```js\nconst options =  {searchCategory : 'newsAndWeather'}\n\nscraper.search('searchString', options).then(\n    (res) =\u003e console.log(res),\n    (err) =\u003e console.log(err)\n);\n```\n\n### Search Features\n\nSearch features can be provided as a means of specifying select features that a chrome extension must have.\n\nPassed as an array of strings in an options JSON object, the features can be any combination of the following:\n```json\noffline\nbyGoogle\nfree\nandroid\ngoogleDrive\n```\n\n\nfeatures can be provided in an options JSON object as demonstrated below:\n```js\nconst options =  {\n    searchFeatures : ['free', 'offline','byGoogle']\n}\n\nscraper.search('searchString', options).then(\n    (res) =\u003e console.log(res),\n    (err) =\u003e console.log(err)\n);\n```\n\n### Features and Categories\n\nSearching can be performed with categories and features together in the same options JSON object.\n\n```js\nconst options =  {\n    searchCategory : 'newsAndWeather',\n    searchFeatures : ['free', 'byGoogle']\n}\n\nscraper.search('searchString', options).then(\n    (res) =\u003e console.log(res),\n    (err) =\u003e console.log(err)\n);\n\n```\n\n## Search Options\n\nAs well as the categories and feature filters, additional options in the form of `locale` and `scrollAttempts` can also be used.\n\nThe `scrollAttempts` option is used to specify how many attempts are made to retrieve additional search results, by scrolling down the page loaded by selenium. the larger the number, the more the page will be scrolled down. It is worth noting that each scroll attempt is paired with a 50ms wait, so a number excessively large will result in longer processing times.\n\nThe `locale` option can be set by passing a locale string as an option. The locale string is used as the `hl` url option by the chrome extension store, to scrape search results in french, danish, or italian, locale strings  `'fr'`, `'da'`, or `'it'` could be used.\n\n### Example Search with locale and scrollAttempts\n```js\nscraper.search('scraper',{scrollAttempts:200, locale:'da'}).then(\n    (res) =\u003e console.log(res[0]),\n    (err) =\u003e console.log(err)\n);\n```\n\n## Extension Scraping\n\nIn order to scrape the store page for a specific chrome extension, this scraper requires a direct url to that page. These urls are to be passed as a parameter to the `scrapeApp` function.\n\n```js\nscraper.scrapeApp('url-to-some-app').then(\n    (res) =\u003e console.log(res),\n    (err) =\u003e console.log(err)\n);\n```\n\nExample Response\n\n```json\n{\n    \"header\": {\n        \"title\": \"Autosave webpage\",\n        \"offeredBy\": \"offered by mtcutler1\",\n        \"userCount\": \"48\",\n        \"rating\": \"3.5\",\n        \"ratingCount\": 4,\n        \"imgURL\": \"https://lh3.googleusercontent.com/4jyS9mGYDUFs2KL52Xfg_I9EzkUIzlCboTp5Dvqv-vKrUWhoz9tNCWR4lPfNFneM2JFmgNrkCkc=w26-h26-e365\"\n    },\n    \"overview\": {\n        \"summary\": \"Save ... a scheduled…\",\n        \"description\": \"Save ... stay updated\",\n        \"version\": \"0.1\",\n        \"lastUpdatedDate\": \"January 24, 2018\",\n        \"size\": \"178KiB\",\n        \"language\": \"English (United States)\",\n        \"screenshotURLs\": [\n            \"https://lh3.googleusercontent.com/nBXzgn-La5s3HyynhHWmnJwAasC1KUMK8GfqCVnOqL-CEGhLOcVNGaNPYUQBv180-ypWPQN2xc8=w640-h400-e365\",\n            \"https://lh3.googleusercontent.com/nBXzgn-La5s3HyynhHWmnJwAasC1KUMK8GfqCVnOqL-CEGhLOcVNGaNPYUQBv180-ypWPQN2xc8=w640-h400-e365\",\n            \"https://lh3.googleusercontent.com/nBXzgn-La5s3HyynhHWmnJwAasC1KUMK8GfqCVnOqL-CEGhLOcVNGaNPYUQBv180-ypWPQN2xc8=w120-h90-e365\"\n        ],\n        \"additionalInfo\": []\n    },\n    \"reviews\": [\n    {\n        \"displayName\": \"Jeffrey\",\n        \"profileImageURL\": \"//www.gstatic.com/s2/contacts/images/NoPicture.gif\",\n        \"displayNameURL\": \"https://plus.google.com/110338040265199312388\",\n        \"timestamp\": \"Modified Mar 21, 2018\",\n        \"ratingString\": \"4 stars (Liked it)\",\n        \"rating\": 4,\n        \"comment\": \"Seemed to only work with one tab...would be perfect if it works on multiple tabs simultaneously\"\n    }\n    ]\n}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadamslack%2Fchrome-web-store-scraper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadamslack%2Fchrome-web-store-scraper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadamslack%2Fchrome-web-store-scraper/lists"}