pyspeedinsights


Namepyspeedinsights JSON
Version 0.5.1 PyPI version JSON
download
home_pagehttps://github.com/wjh18/pyspeedinsights
SummaryMeasure your site speed, performance, accessibility and SEO in bulk from the command line with Python and the PageSpeed Insights API.
upload_time2023-08-11 23:06:43
maintainer
docs_urlNone
authorWill J. Holmes
requires_python>=3.9
license
keywords google google-apis psi-api page-speed-insights page-speed-insights-api pagespeedinsightsapi python cli
VCS
bugtrack_url
requirements aiodns aiohttp aiosignal async-timeout attrs bandit black brotli certifi cffi cfgv charset-normalizer click coverage defusedxml distlib exceptiongroup filelock flake8 frozenlist gitdb gitpython identify idna importlib-metadata iniconfig isort jaraco-classes keyring markdown-it-py mccabe mdurl more-itertools multidict mypy mypy-extensions nodeenv packaging pathspec pbr platformdirs pluggy pre-commit pycares pycodestyle pycparser pyflakes pygments pytest pytest-cov pytest-datadir pyyaml requests rich smmap stevedore tomli types-requests types-urllib3 typing-extensions urllib3 virtualenv xlsxwriter yarl zipp
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pyspeedinsights

**Warning: Archived on 08/11/2023 due to lack of interest. Please consider alternatives such as [Unlighthouse](https://unlighthouse.dev/).**

Measure your site speed, performance, accessibility and SEO in bulk from the command line with Python and the PageSpeed Insights API.

Support for sitemap parsing and asynchronous requests with aiohttp. Outputs to JSON or a color-coded Excel sheet for further analysis.

![A screenshot of the tool's Excel output](https://raw.githubusercontent.com/wjh18/pyspeedinsights/master/images/screenshot.png)

## What is pyspeedinsights?

A simple Python cli that parses your sitemap, sends async requests to the PageSpeed Insights API and writes color-coded Lighthouse results to Excel.

## Why pyspeedinsights?

Manually running each page of your website through Google's Lighthouse or PageSpeed Insights can be extremely time consuming, especially if it has a large number of pages.

This makes it difficult to analyze its overall performance from a 10,000-foot view without manually testing many similar types of pages.

That's what this package attempts to solve. While there are similar tools out there, pyspeedinsights is the first Python implementation built to support analysis in bulk via async requests.

Its user-friendly cli gives you the ability to analyze your entire site's speed, SEO, and accessibility results quickly and uncover bottlenecks by reviewing color-coded audit results and metrics for each page in Excel.

## Format Options

The pyspeedinsights cli supports 3 overarching formats:

1. **Single page JSON (`-f json`)**: Output the raw JSON response from the API to your working directory. If you want to analyze a single page in JSON, use this.
2. **Single page Excel (`-f excel`)**: Write color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. If you want to analyze a single page in Excel, use this.
3. **Sitemap / Multi-page Excel (`-f sitemap`)**: Specify a sitemap file to parse and output your full site's color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. If you want to analyze your entire site in Excel, use this.

There are additional customizations available for request parameters and response processing via the cli as well.

Please reference the [commands](#command-line-arguments) section for further instructions on how to specify formats and customize other options from the cli.

## Installation

From a virtual environment:

```shell
pip install pyspeedinsights
```

From a system Python3 install on MacOS:

```shell
python3 -m pip install pyspeedinsights
```

From a system Python3 install on Windows:

```shell
py -m pip install pyspeedinsights
```

To run the package as a module without installing it from PyPI, clone or download it, `cd` into the `src` directory and run:

```shell
python -m pyspeedinsights
```

*Note that your PATH, OS or Python version may require that you modify these commands slightly. When in doubt, just install it like you would any other Python package.*

## Authorization

The PageSpeed Insights API requires users to generate an API key for anything beyond running basic test requests. Otherwise, you'll hit a rate limit rather quickly.

For this reason, a valid API key is currently required to use this package. Please see the [PageSpeed Insights API documentation](https://developers.google.com/speed/docs/insights/v5/get-started) for detailed instructions on how to generate a key.

### Keys & Quotas

The key itself is added to the GET request URL as a query parameter.

It's recommended to generate the key in *Google Cloud Console > Credentials* then restrict it to your host and the PageSpeed Insights API service. If you do go this route, make sure to enable the service in *Enabled APIs & Services*, as it may not be enabled by default.

The API has a daily and per-minute request quota of 25,000 and 240, respectively. To comply with this, the package automatically sleeps requests for 1 second between each call to avoid hitting the per minute quota or overloading the API and getting hit with 500 errors.

### Keyring

This package uses the `keyring` Python library to store API keys securely on your system's default keystore (e.g. MacOS Keychain for MacOS users).

*Note: If you're unable to use keyring for whatever reason, a fallback input will prompt you for your API key from the command line at the start of each run.*

The dependency is installed automatically when you `pip install pyspeedinsights`. If for whatever reason you're getting a `ImportError: No module named keyring` error, run `pip install keyring` before running any `keyring` operations.

Please see the [`keyring` documentation](https://github.com/jaraco/keyring#command-line-utility) if you require any additional help with the following commands.

### Saving Your API Key

To save your API key to your default keystore, run:

```shell
keyring set system psikey
```

The last argument has to be `psikey`. This is because `pyspeedinsights` looks for that username to read in your key during requests. `system` will instruct `keyring` to automatically detect your system's default keystore.

You'll then receive a prompt where you can enter your key to save it.

### Verifying Your API Key

To verify that your key can be read, run:

```shell
keyring get system psikey
```

Your key should be output to the command line.

### Removing Your API Key

To remove your API key from your default keystore, run:

```shell
keyring del system psikey
```

Then verify that it's no longer accessible with `keyring get system psikey`.

## Sitemap Support

Currently, only URLs to valid XML sitemaps are supported for reports that utilize sitemap format. Please see [sitemaps.org](https://sitemaps.org/protocol.html) for specification details. Gzipped sitemap (e.g. `sitemap.xml.gz`) support is on the near-term roadmap.

Your web server or sitemap plugin must also allow robots to crawl your sitemap. If you see any permission errors that would be the first thing to check. Certain security solutions like CloudFlare also block crawlers so whitelisting the server you're running the package from may also be preferrable.

Your sitemap URL should be passed in as the positional argument for `url` when running `psi` from the command line.

### Sitemap Index

Support for sitemap index detection is also supported. This requires no additional action on your part. Simply pass your sitemap index in as the `url` argument via the cli.

If a sitemap index is detected, the package will recursively gather the URLs listed in each sitemap in your sitemap index and include them in requests. If a standard sitemap file is passed, only the URLs in that sitemap will be processed.

## Command Line Arguments

If you've installed `pyspeedinsights` with `pip`, the default command to run cli commands is `psi`.

If you've simply cloned or downloaded the repo, you can run the cli as a module directly with `python -m pyspeedinsights`. Make sure to `cd` into the `src` directory first.

For help with the following commands, run `psi --help` or `psi -h`.

### Notable Defaults

- `category` - `performance`
- `strategy`- `desktop`
- `locale` - `en` (US English)

### Quickstart

To get you started quickly, here are a few example commands.

Example of requesting a desktop performance report for all the URLs in your sitemap:

- `psi https://example.com/sitemap.xml -f sitemap -c performance -s desktop -l en`
  - Equivalent to: `psi https://example.com/sitemap.xml -f sitemap`

Example of the same report but also specifying a UTM campaign name/source and captcha token:

- `psi https://example.com/sitemap.xml -f sitemap -uc my-campaign-name -us my-campaign-source -t my-captcha-token`

### Request / Sitemap URL: `url` (required)

The URL of the page you want to analyze *or* a path to a valid XML sitemap/index if sitemap format was selected.

This must be a fully qualified url with an optional path. URLs without a scheme default to `https`. URL fragments (`#`) and query parameters (`?`) will be removed automatically.

Some valid commands:

- `psi https://example.com`
- `psi https://www.example.com`
- `psi https://example.com/test`
- `psi example.com`
  - Modified URL: `https://example.com`
- `psi https://example.com#test`
  - Modified URL: `https://example.com`

Some invalid commands:

- `psi example`
  - Throws an error
- `psi example/path`
  - Throws an error

Sitemap example:

- `psi https://example.com/sitemap.xml -f sitemap`
  - Parses `sitemap.xml` and prepares requests for all `<loc>` elements.

Please see [sitemaps](#sitemap-support) for more info.

### Output Format: `-f` or `--format` (optional)

The format of the Lighthouse results output.

- `json` (default): Output the raw JSON response from the API to your working directory (single pages only). You can add a `-f json` argument explicitly or leave it out to simply default to JSON output.

- `excel`: Write color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet (analyze the single `url` only).

- `sitemap`: Specify a sitemap (or index) file to parse and output your full site's color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. When using this option, the `url` argument above needs to be a direct link to your XML sitemap/index. Please see [sitemaps](#sitemap-support) for more info.

Example:

- `psi https://example.com` - defaults to `json`
- `psi https://example.com -f json`
- `psi https://example.com -f excel`
- `psi https://example.com -f sitemap`

### Metrics: `-m` or `--metrics` (optional)

Deprecated in favor of automatically including CrUX metrics if they are available and `performance` category is selected. The previous metrics were debug metrics and subject to change by Google at any time, which made package maintenance difficult.

The new metrics include user-friendly scores instead of raw performance metrics to help give you a quick overview of core metrics like CLS, LCP, etc.

### Category: `-c` or `--category` (optional)

The Lighthouse category to run. Defaults to `performance`.

Other options include `accessibility`, `best-practices`, `pwa` and `seo`.

Metrics will only be included with the `performance` category.

Example:

- `psi https://example.com -c accessibility`

### Strategy: `-s` or `--strategy` (optional)

The Lighthouse analysis strategy to use. Defaults to `desktop`.

Other options include `mobile`.

Example:

- `psi https://example.com -s mobile`

### Locale: `-l` or `--locale` (optional)

The locale used to localize formatted results (language). Defaults to `en` (US).

Please see the PSI API docs for a [full list of locale options](https://developers.google.com/speed/docs/insights/languages).

Example:

- `psi https://example.com -l fr` - localize results to French

### UTM Campaign: `-uc` or `--campaign` (optional)

The UTM campaign name for analytics. Defaults to `None`.

This will add a query parameter to the request made by the PageSpeed Insights API (`?utm_campaign=audit`) so you can differentiate this traffic from real user traffic in Google Analytics.

Pass in the name of your campaign, `audit` is just an example.

Example:

- `psi https://example.com -uc audit`

### UTM Source: `-us` or `--source` (optional)

The UTM campaign source for analytics. Defaults to `None`.

This will add a query parameter to the request made by the PageSpeed Insights API (`?utm_source=psi`) so you can differentiate this traffic from real user traffic in Google Analytics.

Feel free to customize the name of the source, `psi` is just an example.

Example:

- `psi https://example.com -us psi`

### Captcha Token: `-t` or `--token` (optional)

The captcha token passed when filling out a captcha. Defaults to `None`.

This will add a query parameter to the request made by the PageSpeed Insights API (`?utm_source=psi`) containing your captcha token. If you have captcha protection enabled on your site, passing this token as an argument to bypass it will ensure that PSI can analyze your site.

Example:

- `psi https://example.com -t my-captcha-token`

## Help

Please open an issue on GitHub if you run into any issues or need assistance.

## Contributing

Contributors of all skill levels are welcome to help improve this package. Please see the [Contribution Guidelines](CONTRIBUTING.md) for details.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/wjh18/pyspeedinsights",
    "name": "pyspeedinsights",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "",
    "keywords": "google,google-apis,psi-api,page-speed-insights,page-speed-insights-api,pagespeedinsightsapi,python,cli",
    "author": "Will J. Holmes",
    "author_email": "will@wjholmes.com",
    "download_url": "https://files.pythonhosted.org/packages/23/d0/46dce0fd426e263bf788955767ac3e7529b29255b6877e75c78b334d4ea9/pyspeedinsights-0.5.1.tar.gz",
    "platform": null,
    "description": "# pyspeedinsights\n\n**Warning: Archived on 08/11/2023 due to lack of interest. Please consider alternatives such as [Unlighthouse](https://unlighthouse.dev/).**\n\nMeasure your site speed, performance, accessibility and SEO in bulk from the command line with Python and the PageSpeed Insights API.\n\nSupport for sitemap parsing and asynchronous requests with aiohttp. Outputs to JSON or a color-coded Excel sheet for further analysis.\n\n![A screenshot of the tool's Excel output](https://raw.githubusercontent.com/wjh18/pyspeedinsights/master/images/screenshot.png)\n\n## What is pyspeedinsights?\n\nA simple Python cli that parses your sitemap, sends async requests to the PageSpeed Insights API and writes color-coded Lighthouse results to Excel.\n\n## Why pyspeedinsights?\n\nManually running each page of your website through Google's Lighthouse or PageSpeed Insights can be extremely time consuming, especially if it has a large number of pages.\n\nThis makes it difficult to analyze its overall performance from a 10,000-foot view without manually testing many similar types of pages.\n\nThat's what this package attempts to solve. While there are similar tools out there, pyspeedinsights is the first Python implementation built to support analysis in bulk via async requests.\n\nIts user-friendly cli gives you the ability to analyze your entire site's speed, SEO, and accessibility results quickly and uncover bottlenecks by reviewing color-coded audit results and metrics for each page in Excel.\n\n## Format Options\n\nThe pyspeedinsights cli supports 3 overarching formats:\n\n1. **Single page JSON (`-f json`)**: Output the raw JSON response from the API to your working directory. If you want to analyze a single page in JSON, use this.\n2. **Single page Excel (`-f excel`)**: Write color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. If you want to analyze a single page in Excel, use this.\n3. **Sitemap / Multi-page Excel (`-f sitemap`)**: Specify a sitemap file to parse and output your full site's color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. If you want to analyze your entire site in Excel, use this.\n\nThere are additional customizations available for request parameters and response processing via the cli as well.\n\nPlease reference the [commands](#command-line-arguments) section for further instructions on how to specify formats and customize other options from the cli.\n\n## Installation\n\nFrom a virtual environment:\n\n```shell\npip install pyspeedinsights\n```\n\nFrom a system Python3 install on MacOS:\n\n```shell\npython3 -m pip install pyspeedinsights\n```\n\nFrom a system Python3 install on Windows:\n\n```shell\npy -m pip install pyspeedinsights\n```\n\nTo run the package as a module without installing it from PyPI, clone or download it, `cd` into the `src` directory and run:\n\n```shell\npython -m pyspeedinsights\n```\n\n*Note that your PATH, OS or Python version may require that you modify these commands slightly. When in doubt, just install it like you would any other Python package.*\n\n## Authorization\n\nThe PageSpeed Insights API requires users to generate an API key for anything beyond running basic test requests. Otherwise, you'll hit a rate limit rather quickly.\n\nFor this reason, a valid API key is currently required to use this package. Please see the [PageSpeed Insights API documentation](https://developers.google.com/speed/docs/insights/v5/get-started) for detailed instructions on how to generate a key.\n\n### Keys & Quotas\n\nThe key itself is added to the GET request URL as a query parameter.\n\nIt's recommended to generate the key in *Google Cloud Console > Credentials* then restrict it to your host and the PageSpeed Insights API service. If you do go this route, make sure to enable the service in *Enabled APIs & Services*, as it may not be enabled by default.\n\nThe API has a daily and per-minute request quota of 25,000 and 240, respectively. To comply with this, the package automatically sleeps requests for 1 second between each call to avoid hitting the per minute quota or overloading the API and getting hit with 500 errors.\n\n### Keyring\n\nThis package uses the `keyring` Python library to store API keys securely on your system's default keystore (e.g. MacOS Keychain for MacOS users).\n\n*Note: If you're unable to use keyring for whatever reason, a fallback input will prompt you for your API key from the command line at the start of each run.*\n\nThe dependency is installed automatically when you `pip install pyspeedinsights`. If for whatever reason you're getting a `ImportError: No module named keyring` error, run `pip install keyring` before running any `keyring` operations.\n\nPlease see the [`keyring` documentation](https://github.com/jaraco/keyring#command-line-utility) if you require any additional help with the following commands.\n\n### Saving Your API Key\n\nTo save your API key to your default keystore, run:\n\n```shell\nkeyring set system psikey\n```\n\nThe last argument has to be `psikey`. This is because `pyspeedinsights` looks for that username to read in your key during requests. `system` will instruct `keyring` to automatically detect your system's default keystore.\n\nYou'll then receive a prompt where you can enter your key to save it.\n\n### Verifying Your API Key\n\nTo verify that your key can be read, run:\n\n```shell\nkeyring get system psikey\n```\n\nYour key should be output to the command line.\n\n### Removing Your API Key\n\nTo remove your API key from your default keystore, run:\n\n```shell\nkeyring del system psikey\n```\n\nThen verify that it's no longer accessible with `keyring get system psikey`.\n\n## Sitemap Support\n\nCurrently, only URLs to valid XML sitemaps are supported for reports that utilize sitemap format. Please see [sitemaps.org](https://sitemaps.org/protocol.html) for specification details. Gzipped sitemap (e.g. `sitemap.xml.gz`) support is on the near-term roadmap.\n\nYour web server or sitemap plugin must also allow robots to crawl your sitemap. If you see any permission errors that would be the first thing to check. Certain security solutions like CloudFlare also block crawlers so whitelisting the server you're running the package from may also be preferrable.\n\nYour sitemap URL should be passed in as the positional argument for `url` when running `psi` from the command line.\n\n### Sitemap Index\n\nSupport for sitemap index detection is also supported. This requires no additional action on your part. Simply pass your sitemap index in as the `url` argument via the cli.\n\nIf a sitemap index is detected, the package will recursively gather the URLs listed in each sitemap in your sitemap index and include them in requests. If a standard sitemap file is passed, only the URLs in that sitemap will be processed.\n\n## Command Line Arguments\n\nIf you've installed `pyspeedinsights` with `pip`, the default command to run cli commands is `psi`.\n\nIf you've simply cloned or downloaded the repo, you can run the cli as a module directly with `python -m pyspeedinsights`. Make sure to `cd` into the `src` directory first.\n\nFor help with the following commands, run `psi --help` or `psi -h`.\n\n### Notable Defaults\n\n- `category` - `performance`\n- `strategy`- `desktop`\n- `locale` - `en` (US English)\n\n### Quickstart\n\nTo get you started quickly, here are a few example commands.\n\nExample of requesting a desktop performance report for all the URLs in your sitemap:\n\n- `psi https://example.com/sitemap.xml -f sitemap -c performance -s desktop -l en`\n  - Equivalent to: `psi https://example.com/sitemap.xml -f sitemap`\n\nExample of the same report but also specifying a UTM campaign name/source and captcha token:\n\n- `psi https://example.com/sitemap.xml -f sitemap -uc my-campaign-name -us my-campaign-source -t my-captcha-token`\n\n### Request / Sitemap URL: `url` (required)\n\nThe URL of the page you want to analyze *or* a path to a valid XML sitemap/index if sitemap format was selected.\n\nThis must be a fully qualified url with an optional path. URLs without a scheme default to `https`. URL fragments (`#`) and query parameters (`?`) will be removed automatically.\n\nSome valid commands:\n\n- `psi https://example.com`\n- `psi https://www.example.com`\n- `psi https://example.com/test`\n- `psi example.com`\n  - Modified URL: `https://example.com`\n- `psi https://example.com#test`\n  - Modified URL: `https://example.com`\n\nSome invalid commands:\n\n- `psi example`\n  - Throws an error\n- `psi example/path`\n  - Throws an error\n\nSitemap example:\n\n- `psi https://example.com/sitemap.xml -f sitemap`\n  - Parses `sitemap.xml` and prepares requests for all `<loc>` elements.\n\nPlease see [sitemaps](#sitemap-support) for more info.\n\n### Output Format: `-f` or `--format` (optional)\n\nThe format of the Lighthouse results output.\n\n- `json` (default): Output the raw JSON response from the API to your working directory (single pages only). You can add a `-f json` argument explicitly or leave it out to simply default to JSON output.\n\n- `excel`: Write color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet (analyze the single `url` only).\n\n- `sitemap`: Specify a sitemap (or index) file to parse and output your full site's color-coded Lighthouse audits (any category) and/or PageSpeed CrUX metrics (performance category only) to an Excel sheet. When using this option, the `url` argument above needs to be a direct link to your XML sitemap/index. Please see [sitemaps](#sitemap-support) for more info.\n\nExample:\n\n- `psi https://example.com` - defaults to `json`\n- `psi https://example.com -f json`\n- `psi https://example.com -f excel`\n- `psi https://example.com -f sitemap`\n\n### Metrics: `-m` or `--metrics` (optional)\n\nDeprecated in favor of automatically including CrUX metrics if they are available and `performance` category is selected. The previous metrics were debug metrics and subject to change by Google at any time, which made package maintenance difficult.\n\nThe new metrics include user-friendly scores instead of raw performance metrics to help give you a quick overview of core metrics like CLS, LCP, etc.\n\n### Category: `-c` or `--category` (optional)\n\nThe Lighthouse category to run. Defaults to `performance`.\n\nOther options include `accessibility`, `best-practices`, `pwa` and `seo`.\n\nMetrics will only be included with the `performance` category.\n\nExample:\n\n- `psi https://example.com -c accessibility`\n\n### Strategy: `-s` or `--strategy` (optional)\n\nThe Lighthouse analysis strategy to use. Defaults to `desktop`.\n\nOther options include `mobile`.\n\nExample:\n\n- `psi https://example.com -s mobile`\n\n### Locale: `-l` or `--locale` (optional)\n\nThe locale used to localize formatted results (language). Defaults to `en` (US).\n\nPlease see the PSI API docs for a [full list of locale options](https://developers.google.com/speed/docs/insights/languages).\n\nExample:\n\n- `psi https://example.com -l fr` - localize results to French\n\n### UTM Campaign: `-uc` or `--campaign` (optional)\n\nThe UTM campaign name for analytics. Defaults to `None`.\n\nThis will add a query parameter to the request made by the PageSpeed Insights API (`?utm_campaign=audit`) so you can differentiate this traffic from real user traffic in Google Analytics.\n\nPass in the name of your campaign, `audit` is just an example.\n\nExample:\n\n- `psi https://example.com -uc audit`\n\n### UTM Source: `-us` or `--source` (optional)\n\nThe UTM campaign source for analytics. Defaults to `None`.\n\nThis will add a query parameter to the request made by the PageSpeed Insights API (`?utm_source=psi`) so you can differentiate this traffic from real user traffic in Google Analytics.\n\nFeel free to customize the name of the source, `psi` is just an example.\n\nExample:\n\n- `psi https://example.com -us psi`\n\n### Captcha Token: `-t` or `--token` (optional)\n\nThe captcha token passed when filling out a captcha. Defaults to `None`.\n\nThis will add a query parameter to the request made by the PageSpeed Insights API (`?utm_source=psi`) containing your captcha token. If you have captcha protection enabled on your site, passing this token as an argument to bypass it will ensure that PSI can analyze your site.\n\nExample:\n\n- `psi https://example.com -t my-captcha-token`\n\n## Help\n\nPlease open an issue on GitHub if you run into any issues or need assistance.\n\n## Contributing\n\nContributors of all skill levels are welcome to help improve this package. Please see the [Contribution Guidelines](CONTRIBUTING.md) for details.\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Measure your site speed, performance, accessibility and SEO in bulk from the command line with Python and the PageSpeed Insights API.",
    "version": "0.5.1",
    "project_urls": {
        "Documentation": "https://github.com/wjh18/pyspeedinsights/blob/master/README.md",
        "Homepage": "https://github.com/wjh18/pyspeedinsights",
        "Source": "https://github.com/wjh18/pyspeedinsights",
        "Tracker": "https://github.com/wjh18/pyspeedinsights/issues"
    },
    "split_keywords": [
        "google",
        "google-apis",
        "psi-api",
        "page-speed-insights",
        "page-speed-insights-api",
        "pagespeedinsightsapi",
        "python",
        "cli"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9540e1e029caf34b40bacb8df8bc4e30cec17d26ee1818ce880cd0478369fc7d",
                "md5": "9e0eef8179d29d23ac7e36b621d2cb67",
                "sha256": "134ffad7c166bdcd1deb57098b8f727f435c91eb135bc000032175047582f579"
            },
            "downloads": -1,
            "filename": "pyspeedinsights-0.5.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9e0eef8179d29d23ac7e36b621d2cb67",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 23897,
            "upload_time": "2023-08-11T23:06:41",
            "upload_time_iso_8601": "2023-08-11T23:06:41.606293Z",
            "url": "https://files.pythonhosted.org/packages/95/40/e1e029caf34b40bacb8df8bc4e30cec17d26ee1818ce880cd0478369fc7d/pyspeedinsights-0.5.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "23d046dce0fd426e263bf788955767ac3e7529b29255b6877e75c78b334d4ea9",
                "md5": "77bb039bbc0cd0f3c5bffc40d7f42b12",
                "sha256": "5b694b7fe14df4e375b85f2b82cea9cc668a661929110d86c488316f3d3d4be0"
            },
            "downloads": -1,
            "filename": "pyspeedinsights-0.5.1.tar.gz",
            "has_sig": false,
            "md5_digest": "77bb039bbc0cd0f3c5bffc40d7f42b12",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 25037,
            "upload_time": "2023-08-11T23:06:43",
            "upload_time_iso_8601": "2023-08-11T23:06:43.724949Z",
            "url": "https://files.pythonhosted.org/packages/23/d0/46dce0fd426e263bf788955767ac3e7529b29255b6877e75c78b334d4ea9/pyspeedinsights-0.5.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-08-11 23:06:43",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "wjh18",
    "github_project": "pyspeedinsights",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "aiodns",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "aiohttp",
            "specs": [
                [
                    "==",
                    "3.8.4"
                ]
            ]
        },
        {
            "name": "aiosignal",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "async-timeout",
            "specs": [
                [
                    "==",
                    "4.0.2"
                ]
            ]
        },
        {
            "name": "attrs",
            "specs": [
                [
                    "==",
                    "23.1.0"
                ]
            ]
        },
        {
            "name": "bandit",
            "specs": [
                [
                    "==",
                    "1.7.5"
                ]
            ]
        },
        {
            "name": "black",
            "specs": [
                [
                    "==",
                    "23.3.0"
                ]
            ]
        },
        {
            "name": "brotli",
            "specs": [
                [
                    "==",
                    "1.0.9"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2023.5.7"
                ]
            ]
        },
        {
            "name": "cffi",
            "specs": [
                [
                    "==",
                    "1.15.1"
                ]
            ]
        },
        {
            "name": "cfgv",
            "specs": [
                [
                    "==",
                    "3.3.1"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.1.0"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.1.3"
                ]
            ]
        },
        {
            "name": "coverage",
            "specs": [
                [
                    "==",
                    "7.2.7"
                ]
            ]
        },
        {
            "name": "defusedxml",
            "specs": [
                [
                    "==",
                    "0.7.1"
                ]
            ]
        },
        {
            "name": "distlib",
            "specs": [
                [
                    "==",
                    "0.3.6"
                ]
            ]
        },
        {
            "name": "exceptiongroup",
            "specs": [
                [
                    "==",
                    "1.1.2"
                ]
            ]
        },
        {
            "name": "filelock",
            "specs": [
                [
                    "==",
                    "3.12.2"
                ]
            ]
        },
        {
            "name": "flake8",
            "specs": [
                [
                    "==",
                    "6.0.0"
                ]
            ]
        },
        {
            "name": "frozenlist",
            "specs": [
                [
                    "==",
                    "1.3.3"
                ]
            ]
        },
        {
            "name": "gitdb",
            "specs": [
                [
                    "==",
                    "4.0.10"
                ]
            ]
        },
        {
            "name": "gitpython",
            "specs": [
                [
                    "==",
                    "3.1.31"
                ]
            ]
        },
        {
            "name": "identify",
            "specs": [
                [
                    "==",
                    "2.5.24"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.4"
                ]
            ]
        },
        {
            "name": "importlib-metadata",
            "specs": [
                [
                    "==",
                    "6.7.0"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "isort",
            "specs": [
                [
                    "==",
                    "5.12.0"
                ]
            ]
        },
        {
            "name": "jaraco-classes",
            "specs": [
                [
                    "==",
                    "3.2.3"
                ]
            ]
        },
        {
            "name": "keyring",
            "specs": [
                [
                    "==",
                    "24.2.0"
                ]
            ]
        },
        {
            "name": "markdown-it-py",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "mccabe",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "mdurl",
            "specs": [
                [
                    "==",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "more-itertools",
            "specs": [
                [
                    "==",
                    "9.1.0"
                ]
            ]
        },
        {
            "name": "multidict",
            "specs": [
                [
                    "==",
                    "6.0.4"
                ]
            ]
        },
        {
            "name": "mypy",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "mypy-extensions",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "nodeenv",
            "specs": [
                [
                    "==",
                    "1.8.0"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "23.1"
                ]
            ]
        },
        {
            "name": "pathspec",
            "specs": [
                [
                    "==",
                    "0.11.1"
                ]
            ]
        },
        {
            "name": "pbr",
            "specs": [
                [
                    "==",
                    "5.11.1"
                ]
            ]
        },
        {
            "name": "platformdirs",
            "specs": [
                [
                    "==",
                    "3.8.0"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "pre-commit",
            "specs": [
                [
                    "==",
                    "3.3.3"
                ]
            ]
        },
        {
            "name": "pycares",
            "specs": [
                [
                    "==",
                    "4.3.0"
                ]
            ]
        },
        {
            "name": "pycodestyle",
            "specs": [
                [
                    "==",
                    "2.10.0"
                ]
            ]
        },
        {
            "name": "pycparser",
            "specs": [
                [
                    "==",
                    "2.21"
                ]
            ]
        },
        {
            "name": "pyflakes",
            "specs": [
                [
                    "==",
                    "3.0.1"
                ]
            ]
        },
        {
            "name": "pygments",
            "specs": [
                [
                    "==",
                    "2.15.1"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "7.4.0"
                ]
            ]
        },
        {
            "name": "pytest-cov",
            "specs": [
                [
                    "==",
                    "4.1.0"
                ]
            ]
        },
        {
            "name": "pytest-datadir",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "pyyaml",
            "specs": [
                [
                    "==",
                    "6.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.31.0"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    "==",
                    "13.4.2"
                ]
            ]
        },
        {
            "name": "smmap",
            "specs": [
                [
                    "==",
                    "5.0.0"
                ]
            ]
        },
        {
            "name": "stevedore",
            "specs": [
                [
                    "==",
                    "5.1.0"
                ]
            ]
        },
        {
            "name": "tomli",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": "types-requests",
            "specs": [
                [
                    "==",
                    "2.31.0.1"
                ]
            ]
        },
        {
            "name": "types-urllib3",
            "specs": [
                [
                    "==",
                    "1.26.25.13"
                ]
            ]
        },
        {
            "name": "typing-extensions",
            "specs": [
                [
                    "==",
                    "4.7.1"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.0.3"
                ]
            ]
        },
        {
            "name": "virtualenv",
            "specs": [
                [
                    "==",
                    "20.23.1"
                ]
            ]
        },
        {
            "name": "xlsxwriter",
            "specs": [
                [
                    "==",
                    "3.1.2"
                ]
            ]
        },
        {
            "name": "yarl",
            "specs": [
                [
                    "==",
                    "1.9.2"
                ]
            ]
        },
        {
            "name": "zipp",
            "specs": [
                [
                    "==",
                    "3.15.0"
                ]
            ]
        }
    ],
    "lcname": "pyspeedinsights"
}
        
Elapsed time: 0.09910s