pypartpicker


Namepypartpicker JSON
Version 2.0.5 PyPI version JSON
download
home_pagehttps://github.com/thefakequake/pypartpicker
SummaryA PCPartPicker data extractor for Python.
upload_time2024-12-28 18:28:29
maintainerNone
docs_urlNone
authorQuaKe
requires_python<4.0,>=3.10
licenseNone
keywords pcpartpicker pcpp scraping
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pypartpicker

A PCPartPicker data extractor for Python.

### Features:

- Fetch product information, specs, pricing and reviews
- Fetch part lists
- Utilise PCPartPicker's built in search functionality
- Scraping countermeasures out of the box via [requests-html](https://github.com/psf/requests-html>)
- Support for all regions
- Customisable scraping

# Table of Contents

- [Installation](#installation)
- [Examples](#examples)
- [Documentation](#documentation)
  - [Client](#client)
  - [Part](#part)
  - [PartList](#part-list)
  - [PartSearchResult](#part-search-result)
  - [PartReviewsResult](#part-reviews-result)
  - [Price](#price)
  - [Vendor](#vendor)
  - [Rating](#rating)
  - [Review](#review)
  - [User](#user)
  - [Supported Regions](#regions)
  - [Supported Product Types](#types)
- [FAQs](#faqs)

# Installation

```bash
$ pip install pypartpicker
```

# Note

Due to [pyppeteer](https://github.com/pyppeteer/pyppeteer) your first use of the library may install a chromium browser for JS rendering.

This is only done once. If you would like to disable this feature entirely, use the `no_js=True` option in the Client constructor.

# Examples

Fetch a product:

```py
import pypartpicker

pcpp = pypartpicker.Client()
part = pcpp.get_part("https://pcpartpicker.com/product/fN88TW")

for spec, value in part.specs.items():
    print(f"{spec}: {value}")

print(part.cheapest_price)
```

Search parts with pagination:

```py
import pypartpicker

pcpp = pypartpicker.Client()
page = 1

while True:
    result = pcpp.get_part_search("ryzen 5", region="uk", page=page)

    for part in result.parts:
        print(part.name)

    page += 1
    if page > result.total_pages:
        break
```

Fetch a product (async):

```py
import pypartpicker
import asyncio


async def get_parts():
    async with pypartpicker.AsyncClient() as pcpp:
        part = await pcpp.get_part("https://pcpartpicker.com/product/fN88TW")

    for spec, value in part.specs.items():
        print(f"{spec}: {value}")


asyncio.run(get_parts())
```

Proxy rotation w/ response_retriever override:

```py
import pypartpicker
import requests_html
from itertools import cycle

# replace with own list of proxies
list_proxy = [
    "socks5://Username:Password@IP1:20000",
    "socks5://Username:Password@IP2:20000",
    "socks5://Username:Password@IP3:20000",
    "socks5://Username:Password@IP4:20000",
]

proxy_cycle = cycle(list_proxy)
session = requests_html.HTMLSession()


def response_retriever(url):
    proxy = next(proxy_cycle)
    return session.get(url, proxies={"http": proxy, "https": proxy})


client = pypartpicker.Client(response_retriever=response_retriever)

res = client.get_part_search("cpu")
for result in res.parts:
    part = client.get_part(result.url)
    print(part.specs)
```

# Documentation

<h2 id="client">Client</h2>

Represents a client for interacting with parts-related data and making HTTP requests.

### Options

- **`max_retries`**: `int` – The maximum number of retries for requests. Default is `3`.
- **`retry_delay`**: `int` – The delay between retries in seconds. Default is `0`.
- **`cookies`**: `Optional[dict]` – Cookies to include in requests.
- **`response_retriever`**: `Optional[Callable]` – A custom function to perform a request, overriding the default one.
  Can be used to implement proxy rotation and custom scraping measures.
- **`no_js`**: `bool` – Disables pyppeteer JS rendering. Default is `False`.

---

### Methods

#### `get_part(id_url: str, region: str = None) -> Part`

Fetches a single part by its URL/ID and region.

- **Parameters**:

  - **`id_url`**: `str` – The part ID or URL of the part to retrieve.
  - **`region`**: `Optional[str]` – The region for the part data.

- **Returns**: [`Part`](#part) – The part details.

---

#### `get_part_list(id_url: str, region: str = None) -> PartList`

Fetches a part list by its URL/ID and region.

- **Parameters**:

  - **`id_url`**: `str` – The part list ID or URL of the part list to retrieve.
  - **`region`**: `Optional[str]` – The region for the part list data.

- **Returns**: [`PartList`](#part-list) – The part list details.

---

#### `get_part_search(query: str, page: int = 1, region: Optional[str] = None) -> PartSearchResult`

Searches for parts using PCPartPicker's search functionality.

- **Parameters**:

  - **`query`**: `str` – The search query string.
  - **`page`**: `int` – The page number to fetch. Default is `1`.
  - **`region`**: `Optional[str]` – The region for the search results.

- **Returns**: [`PartSearchResult`](#part-search-result) – The search results for parts.

---

#### `get_part_reviews(id_url: str, page: int = 1, rating: Optional[int] = None) -> PartReviewsResult`

Fetches reviews for a specific part.

- **Parameters**:

  - **`id_url`**: `str` – The part ID or URL of the part to retrieve reviews for.
  - **`page`**: `int` – The page number to fetch. Default is `1`.
  - **`rating`**: `Optional[int]` – Filter reviews by a specific star rating.

- **Returns**: [`PartReviewsResult`](#part-reviews-result) – The reviews for the specified part.

---

<!--
#### `get_parts(product_path: str, page: int = 1, region: Optional[str] = None, compatible_with: Optional[str] = None) -> PartSearchResult`

Fetches parts of a specific product type.

- **Parameters**:

  - **`product_path`**: `str` – The [product path](#product-path) to retrieve parts for.
  - **`page`**: `int` – The page number to fetch. Default is `1`.
  - **`region`**: `Optional[str]` – The region for the part data.
  - **`compatible_with`**: `Optional[str]` – Filter by compatibility with a specific part URL/ID.

- **Returns**: [`PartSearchResult`](#part-search-result) – The parts matching the query. -->

### Exceptions

- **`CloudflareException`** – Raised when the request fails due to Cloudflare protection after the maximum retries.
- **`RateLimitException`** – Raised when the request encounters a PCPartPicker rate limit issue.

---

<h2 id="client">AsyncClient</h2>

Same methods and options as Client except called with `await`.

## Types

<h3 id="price">Price</h3>

Represents the pricing details of a product.

- **`base`**: `Optional[float]` – The base price of the item.
- **`discounts`**: `Optional[float]` – Any discounts applied to the item.
- **`shipping`**: `Optional[float]` – Shipping costs associated with the item.
- **`tax`**: `Optional[float]` – Taxes applied to the item.
- **`total`**: `Optional[float]` – The total price after applying all factors.
- **`currency`**: `Optional[str]` – The currency of the price.

---

<h3 id="vendor">Vendor</h3>

Represents a vendor offering a product.

- **`name`**: `str` – The name of the vendor.
- **`logo_url`**: `str` – The URL to the vendor's logo image.
- **`in_stock`**: `bool` – Whether the product is in stock.
- **`price`**: [`Price`](#price) – The price details for the product.
- **`buy_url`**: `str` – The URL to purchase the product from the vendor.

---

<h3 id="rating">Rating</h3>

Represents the rating of a product.

- **`stars`**: `int` – The number of stars given by reviewers.
- **`count`**: `int` – The total number of ratings received.
- **`average`**: `float` – The average rating value.

---

<h3 id="user">User</h3>

Represents a user who interacts with reviews.

- **`username`**: `str` – The username of the user.
- **`avatar_url`**: `str` – The URL to the user's avatar image.
- **`profile_url`**: `str` – The URL to the user's profile.

---

<h3 id="review">Review</h3>

Represents a review for a product.

- **`author`**: [`User`](#user) – The user who wrote the review.
- **`points`**: `int` – The number of points given to the review.
- **`stars`**: `int` – The star rating given in the review.
- **`created_at`**: `str` – The timestamp when the review was created.
- **`content`**: `str` – The textual content of the review.
- **`build_name`**: `Optional[str]` – The name of the build associated with the review.
- **`build_url`**: `Optional[str]` – The URL to the build associated with the review.

---

<h3 id="part-reviews-result">PartReviewsResult</h3>

Represents the result of a paginated query for part reviews.

- **`reviews`**: `list` of [`Review`](#review) – A list of reviews for a product.
- **`page`**: `int` – The current page of results.
- **`total_pages`**: `int` – The total number of pages available.

---

<h3 id="part">Part</h3>

Represents an individual part of a system or build.

- **`name`**: `str` – The name of the part.
- **`type`**: `str` – The type or category of the part.
- **`image_urls`**: `Optional[list[str]]` – A list of URLs to images of the part.
- **`url`**: `Optional[str]` – The URL for more details about the part.
- **`cheapest_price`**: `Optional` of [`Price`](#price) – The cheapest price for the part.
- **`in_stock`**: `Optional[bool]` – Whether the part is currently in stock.
- **`vendors`**: `Optional[list` of [`Vendor`](#vendor)`]` – A list of vendors offering the part.
- **`rating`**: `Optional` of [`Rating`](#rating) – The rating details for the part.
- **`specs`**: `Optional[dict[str, str]]` – A dictionary of specifications for the part.
- **`reviews`**: `Optional[list` of [`Review`](#review)`]` – A list of reviews for the part.

---

<h3 id="part-list">PartList</h3>

Represents a list of parts for a system or build.

- **`parts`**: `list` of [`Part`](#part) – A list of parts in the build.
- **`url`**: `str` – The URL for the part list.
- **`estimated_wattage`**: `float` – The power consumption of the build, measured in watts.
- **`total_price`**: `float` – The total price of the build.
- **`currency`**: `str` – The currency used for pricing.

---

<h3 id="part-search-result">PartSearchResult</h3>

Represents the result of a paginated query for parts.

- **`parts`**: `list` of [`Part`](#part) – A list of parts matching the search query.
- **`page`**: `int` – The current page of results.
- **`total_pages`**: `int` – The total number of pages available.

<h2 id="regions">Supported Regions</h2>

- **Australia**: `au`
- **Austria**: `at`
- **Belgium**: `be`
- **Canada**: `ca`
- **Czech Republic**: `cz`
- **Denmark**: `dk`
- **Finland**: `fi`
- **France**: `fr`
- **Germany**: `de`
- **Hungary**: `hu`
- **Ireland**: `ie`
- **Italy**: `it`
- **Netherlands**: `nl`
- **New Zealand**: `nz`
- **Norway**: `no`
- **Portugal**: `pt`
- **Romania**: `ro`
- **Saudi Arabia**: `sa`
- **Slovakia**: `sk`
- **Spain**: `es`
- **Sweden**: `se`
- **United Kingdom**: `uk`
- **United States**: `us`

<h2 id="product-path">Supported Product Types</h2>

```py
PRODUCT_KEYBOARD_PATH = "keyboard"
PRODUCT_SPEAKERS_PATH = "speakers"
PRODUCT_MONITOR_PATH = "monitor"
PRODUCT_THERMAL_PASTE_PATH = "thermal-paste"
PRODUCT_VIDEO_CARD_PATH = "video-card"
PRODUCT_CASE_FAN_PATH = "case-fan"
PRODUCT_OS_PATH = "os"
PRODUCT_CPU_COOLER_PATH = "cpu-cooler"
PRODUCT_FAN_CONTROLLER_PATH = "fan-controller"
PRODUCT_UPS_PATH = "ups"
PRODUCT_WIRED_NETWORK_CARD_PATH = "wired-network-card"
PRODUCT_MEMORY_PATH = "memory"
PRODUCT_HEADPHONES_PATH = "headphones"
PRODUCT_SOUND_CARD_PATH = "sound-card"
PRODUCT_INTERNAL_HARD_DRIVE_PATH = "internal-hard-drive"
PRODUCT_MOUSE_PATH = "mouse"
PRODUCT_WIRELESS_NETWORK_CARD_PATH = "wireless-network-card"
PRODUCT_POWER_SUPPLY_PATH = "power-supply"
PRODUCT_WEBCAM_PATH = "webcam"
PRODUCT_MOTHERBOARD_PATH = "motherboard"
PRODUCT_EXTERNAL_HARD_DRIVE_PATH = "external-hard-drive"
PRODUCT_OPTICAL_DRIVE_PATH = "optical-drive"
PRODUCT_CASE_PATH = "case"
PRODUCT_CPU_PATH = "cpu"
```
<h2 id="faqs">FAQs</h2>

**Chromium Errors**

If `[INFO]: Downloading Chromium` errors are encountered, find your `__init__.py` file located in `C:\Users\yourusername\AppData\Local\Programs\Python\Python3XX\Lib\site-packages\pyppeteer`, and edit line 20 from `__chromium_revision__ = '1181205'` to `__chromium_revision__ = '1263111'`

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/thefakequake/pypartpicker",
    "name": "pypartpicker",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.10",
    "maintainer_email": null,
    "keywords": "pcpartpicker, pcpp, scraping",
    "author": "QuaKe",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/53/cc/6f459cb48534601babfa757d9179b3e6402f81b7ad6fa4477505667670ba/pypartpicker-2.0.5.tar.gz",
    "platform": null,
    "description": "# pypartpicker\n\nA PCPartPicker data extractor for Python.\n\n### Features:\n\n- Fetch product information, specs, pricing and reviews\n- Fetch part lists\n- Utilise PCPartPicker's built in search functionality\n- Scraping countermeasures out of the box via [requests-html](https://github.com/psf/requests-html>)\n- Support for all regions\n- Customisable scraping\n\n# Table of Contents\n\n- [Installation](#installation)\n- [Examples](#examples)\n- [Documentation](#documentation)\n  - [Client](#client)\n  - [Part](#part)\n  - [PartList](#part-list)\n  - [PartSearchResult](#part-search-result)\n  - [PartReviewsResult](#part-reviews-result)\n  - [Price](#price)\n  - [Vendor](#vendor)\n  - [Rating](#rating)\n  - [Review](#review)\n  - [User](#user)\n  - [Supported Regions](#regions)\n  - [Supported Product Types](#types)\n- [FAQs](#faqs)\n\n# Installation\n\n```bash\n$ pip install pypartpicker\n```\n\n# Note\n\nDue to [pyppeteer](https://github.com/pyppeteer/pyppeteer) your first use of the library may install a chromium browser for JS rendering.\n\nThis is only done once. If you would like to disable this feature entirely, use the `no_js=True` option in the Client constructor.\n\n# Examples\n\nFetch a product:\n\n```py\nimport pypartpicker\n\npcpp = pypartpicker.Client()\npart = pcpp.get_part(\"https://pcpartpicker.com/product/fN88TW\")\n\nfor spec, value in part.specs.items():\n    print(f\"{spec}: {value}\")\n\nprint(part.cheapest_price)\n```\n\nSearch parts with pagination:\n\n```py\nimport pypartpicker\n\npcpp = pypartpicker.Client()\npage = 1\n\nwhile True:\n    result = pcpp.get_part_search(\"ryzen 5\", region=\"uk\", page=page)\n\n    for part in result.parts:\n        print(part.name)\n\n    page += 1\n    if page > result.total_pages:\n        break\n```\n\nFetch a product (async):\n\n```py\nimport pypartpicker\nimport asyncio\n\n\nasync def get_parts():\n    async with pypartpicker.AsyncClient() as pcpp:\n        part = await pcpp.get_part(\"https://pcpartpicker.com/product/fN88TW\")\n\n    for spec, value in part.specs.items():\n        print(f\"{spec}: {value}\")\n\n\nasyncio.run(get_parts())\n```\n\nProxy rotation w/ response_retriever override:\n\n```py\nimport pypartpicker\nimport requests_html\nfrom itertools import cycle\n\n# replace with own list of proxies\nlist_proxy = [\n    \"socks5://Username:Password@IP1:20000\",\n    \"socks5://Username:Password@IP2:20000\",\n    \"socks5://Username:Password@IP3:20000\",\n    \"socks5://Username:Password@IP4:20000\",\n]\n\nproxy_cycle = cycle(list_proxy)\nsession = requests_html.HTMLSession()\n\n\ndef response_retriever(url):\n    proxy = next(proxy_cycle)\n    return session.get(url, proxies={\"http\": proxy, \"https\": proxy})\n\n\nclient = pypartpicker.Client(response_retriever=response_retriever)\n\nres = client.get_part_search(\"cpu\")\nfor result in res.parts:\n    part = client.get_part(result.url)\n    print(part.specs)\n```\n\n# Documentation\n\n<h2 id=\"client\">Client</h2>\n\nRepresents a client for interacting with parts-related data and making HTTP requests.\n\n### Options\n\n- **`max_retries`**: `int` \u2013 The maximum number of retries for requests. Default is `3`.\n- **`retry_delay`**: `int` \u2013 The delay between retries in seconds. Default is `0`.\n- **`cookies`**: `Optional[dict]` \u2013 Cookies to include in requests.\n- **`response_retriever`**: `Optional[Callable]` \u2013 A custom function to perform a request, overriding the default one.\n  Can be used to implement proxy rotation and custom scraping measures.\n- **`no_js`**: `bool` \u2013 Disables pyppeteer JS rendering. Default is `False`.\n\n---\n\n### Methods\n\n#### `get_part(id_url: str, region: str = None) -> Part`\n\nFetches a single part by its URL/ID and region.\n\n- **Parameters**:\n\n  - **`id_url`**: `str` \u2013 The part ID or URL of the part to retrieve.\n  - **`region`**: `Optional[str]` \u2013 The region for the part data.\n\n- **Returns**: [`Part`](#part) \u2013 The part details.\n\n---\n\n#### `get_part_list(id_url: str, region: str = None) -> PartList`\n\nFetches a part list by its URL/ID and region.\n\n- **Parameters**:\n\n  - **`id_url`**: `str` \u2013 The part list ID or URL of the part list to retrieve.\n  - **`region`**: `Optional[str]` \u2013 The region for the part list data.\n\n- **Returns**: [`PartList`](#part-list) \u2013 The part list details.\n\n---\n\n#### `get_part_search(query: str, page: int = 1, region: Optional[str] = None) -> PartSearchResult`\n\nSearches for parts using PCPartPicker's search functionality.\n\n- **Parameters**:\n\n  - **`query`**: `str` \u2013 The search query string.\n  - **`page`**: `int` \u2013 The page number to fetch. Default is `1`.\n  - **`region`**: `Optional[str]` \u2013 The region for the search results.\n\n- **Returns**: [`PartSearchResult`](#part-search-result) \u2013 The search results for parts.\n\n---\n\n#### `get_part_reviews(id_url: str, page: int = 1, rating: Optional[int] = None) -> PartReviewsResult`\n\nFetches reviews for a specific part.\n\n- **Parameters**:\n\n  - **`id_url`**: `str` \u2013 The part ID or URL of the part to retrieve reviews for.\n  - **`page`**: `int` \u2013 The page number to fetch. Default is `1`.\n  - **`rating`**: `Optional[int]` \u2013 Filter reviews by a specific star rating.\n\n- **Returns**: [`PartReviewsResult`](#part-reviews-result) \u2013 The reviews for the specified part.\n\n---\n\n<!--\n#### `get_parts(product_path: str, page: int = 1, region: Optional[str] = None, compatible_with: Optional[str] = None) -> PartSearchResult`\n\nFetches parts of a specific product type.\n\n- **Parameters**:\n\n  - **`product_path`**: `str` \u2013 The [product path](#product-path) to retrieve parts for.\n  - **`page`**: `int` \u2013 The page number to fetch. Default is `1`.\n  - **`region`**: `Optional[str]` \u2013 The region for the part data.\n  - **`compatible_with`**: `Optional[str]` \u2013 Filter by compatibility with a specific part URL/ID.\n\n- **Returns**: [`PartSearchResult`](#part-search-result) \u2013 The parts matching the query. -->\n\n### Exceptions\n\n- **`CloudflareException`** \u2013 Raised when the request fails due to Cloudflare protection after the maximum retries.\n- **`RateLimitException`** \u2013 Raised when the request encounters a PCPartPicker rate limit issue.\n\n---\n\n<h2 id=\"client\">AsyncClient</h2>\n\nSame methods and options as Client except called with `await`.\n\n## Types\n\n<h3 id=\"price\">Price</h3>\n\nRepresents the pricing details of a product.\n\n- **`base`**: `Optional[float]` \u2013 The base price of the item.\n- **`discounts`**: `Optional[float]` \u2013 Any discounts applied to the item.\n- **`shipping`**: `Optional[float]` \u2013 Shipping costs associated with the item.\n- **`tax`**: `Optional[float]` \u2013 Taxes applied to the item.\n- **`total`**: `Optional[float]` \u2013 The total price after applying all factors.\n- **`currency`**: `Optional[str]` \u2013 The currency of the price.\n\n---\n\n<h3 id=\"vendor\">Vendor</h3>\n\nRepresents a vendor offering a product.\n\n- **`name`**: `str` \u2013 The name of the vendor.\n- **`logo_url`**: `str` \u2013 The URL to the vendor's logo image.\n- **`in_stock`**: `bool` \u2013 Whether the product is in stock.\n- **`price`**: [`Price`](#price) \u2013 The price details for the product.\n- **`buy_url`**: `str` \u2013 The URL to purchase the product from the vendor.\n\n---\n\n<h3 id=\"rating\">Rating</h3>\n\nRepresents the rating of a product.\n\n- **`stars`**: `int` \u2013 The number of stars given by reviewers.\n- **`count`**: `int` \u2013 The total number of ratings received.\n- **`average`**: `float` \u2013 The average rating value.\n\n---\n\n<h3 id=\"user\">User</h3>\n\nRepresents a user who interacts with reviews.\n\n- **`username`**: `str` \u2013 The username of the user.\n- **`avatar_url`**: `str` \u2013 The URL to the user's avatar image.\n- **`profile_url`**: `str` \u2013 The URL to the user's profile.\n\n---\n\n<h3 id=\"review\">Review</h3>\n\nRepresents a review for a product.\n\n- **`author`**: [`User`](#user) \u2013 The user who wrote the review.\n- **`points`**: `int` \u2013 The number of points given to the review.\n- **`stars`**: `int` \u2013 The star rating given in the review.\n- **`created_at`**: `str` \u2013 The timestamp when the review was created.\n- **`content`**: `str` \u2013 The textual content of the review.\n- **`build_name`**: `Optional[str]` \u2013 The name of the build associated with the review.\n- **`build_url`**: `Optional[str]` \u2013 The URL to the build associated with the review.\n\n---\n\n<h3 id=\"part-reviews-result\">PartReviewsResult</h3>\n\nRepresents the result of a paginated query for part reviews.\n\n- **`reviews`**: `list` of [`Review`](#review) \u2013 A list of reviews for a product.\n- **`page`**: `int` \u2013 The current page of results.\n- **`total_pages`**: `int` \u2013 The total number of pages available.\n\n---\n\n<h3 id=\"part\">Part</h3>\n\nRepresents an individual part of a system or build.\n\n- **`name`**: `str` \u2013 The name of the part.\n- **`type`**: `str` \u2013 The type or category of the part.\n- **`image_urls`**: `Optional[list[str]]` \u2013 A list of URLs to images of the part.\n- **`url`**: `Optional[str]` \u2013 The URL for more details about the part.\n- **`cheapest_price`**: `Optional` of [`Price`](#price) \u2013 The cheapest price for the part.\n- **`in_stock`**: `Optional[bool]` \u2013 Whether the part is currently in stock.\n- **`vendors`**: `Optional[list` of [`Vendor`](#vendor)`]` \u2013 A list of vendors offering the part.\n- **`rating`**: `Optional` of [`Rating`](#rating) \u2013 The rating details for the part.\n- **`specs`**: `Optional[dict[str, str]]` \u2013 A dictionary of specifications for the part.\n- **`reviews`**: `Optional[list` of [`Review`](#review)`]` \u2013 A list of reviews for the part.\n\n---\n\n<h3 id=\"part-list\">PartList</h3>\n\nRepresents a list of parts for a system or build.\n\n- **`parts`**: `list` of [`Part`](#part) \u2013 A list of parts in the build.\n- **`url`**: `str` \u2013 The URL for the part list.\n- **`estimated_wattage`**: `float` \u2013 The power consumption of the build, measured in watts.\n- **`total_price`**: `float` \u2013 The total price of the build.\n- **`currency`**: `str` \u2013 The currency used for pricing.\n\n---\n\n<h3 id=\"part-search-result\">PartSearchResult</h3>\n\nRepresents the result of a paginated query for parts.\n\n- **`parts`**: `list` of [`Part`](#part) \u2013 A list of parts matching the search query.\n- **`page`**: `int` \u2013 The current page of results.\n- **`total_pages`**: `int` \u2013 The total number of pages available.\n\n<h2 id=\"regions\">Supported Regions</h2>\n\n- **Australia**: `au`\n- **Austria**: `at`\n- **Belgium**: `be`\n- **Canada**: `ca`\n- **Czech Republic**: `cz`\n- **Denmark**: `dk`\n- **Finland**: `fi`\n- **France**: `fr`\n- **Germany**: `de`\n- **Hungary**: `hu`\n- **Ireland**: `ie`\n- **Italy**: `it`\n- **Netherlands**: `nl`\n- **New Zealand**: `nz`\n- **Norway**: `no`\n- **Portugal**: `pt`\n- **Romania**: `ro`\n- **Saudi Arabia**: `sa`\n- **Slovakia**: `sk`\n- **Spain**: `es`\n- **Sweden**: `se`\n- **United Kingdom**: `uk`\n- **United States**: `us`\n\n<h2 id=\"product-path\">Supported Product Types</h2>\n\n```py\nPRODUCT_KEYBOARD_PATH = \"keyboard\"\nPRODUCT_SPEAKERS_PATH = \"speakers\"\nPRODUCT_MONITOR_PATH = \"monitor\"\nPRODUCT_THERMAL_PASTE_PATH = \"thermal-paste\"\nPRODUCT_VIDEO_CARD_PATH = \"video-card\"\nPRODUCT_CASE_FAN_PATH = \"case-fan\"\nPRODUCT_OS_PATH = \"os\"\nPRODUCT_CPU_COOLER_PATH = \"cpu-cooler\"\nPRODUCT_FAN_CONTROLLER_PATH = \"fan-controller\"\nPRODUCT_UPS_PATH = \"ups\"\nPRODUCT_WIRED_NETWORK_CARD_PATH = \"wired-network-card\"\nPRODUCT_MEMORY_PATH = \"memory\"\nPRODUCT_HEADPHONES_PATH = \"headphones\"\nPRODUCT_SOUND_CARD_PATH = \"sound-card\"\nPRODUCT_INTERNAL_HARD_DRIVE_PATH = \"internal-hard-drive\"\nPRODUCT_MOUSE_PATH = \"mouse\"\nPRODUCT_WIRELESS_NETWORK_CARD_PATH = \"wireless-network-card\"\nPRODUCT_POWER_SUPPLY_PATH = \"power-supply\"\nPRODUCT_WEBCAM_PATH = \"webcam\"\nPRODUCT_MOTHERBOARD_PATH = \"motherboard\"\nPRODUCT_EXTERNAL_HARD_DRIVE_PATH = \"external-hard-drive\"\nPRODUCT_OPTICAL_DRIVE_PATH = \"optical-drive\"\nPRODUCT_CASE_PATH = \"case\"\nPRODUCT_CPU_PATH = \"cpu\"\n```\n<h2 id=\"faqs\">FAQs</h2>\n\n**Chromium Errors**\n\nIf `[INFO]: Downloading Chromium` errors are encountered, find your `__init__.py` file located in `C:\\Users\\yourusername\\AppData\\Local\\Programs\\Python\\Python3XX\\Lib\\site-packages\\pyppeteer`, and edit line 20 from `__chromium_revision__ = '1181205'` to `__chromium_revision__ = '1263111'`\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A PCPartPicker data extractor for Python.",
    "version": "2.0.5",
    "project_urls": {
        "Homepage": "https://github.com/thefakequake/pypartpicker",
        "Repository": "https://github.com/thefakequake/pypartpicker"
    },
    "split_keywords": [
        "pcpartpicker",
        " pcpp",
        " scraping"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "061ce0e2a251bebc426014180b67350bdae4f0c1e673a711387668e55c7b70fb",
                "md5": "5ab8800f8450160e9500d34346da108b",
                "sha256": "738fbec9f0dc1226fd6926694b8f189f20bd794d2473765aa4205e7f6015b2c3"
            },
            "downloads": -1,
            "filename": "pypartpicker-2.0.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5ab8800f8450160e9500d34346da108b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.10",
            "size": 13922,
            "upload_time": "2024-12-28T18:28:28",
            "upload_time_iso_8601": "2024-12-28T18:28:28.858823Z",
            "url": "https://files.pythonhosted.org/packages/06/1c/e0e2a251bebc426014180b67350bdae4f0c1e673a711387668e55c7b70fb/pypartpicker-2.0.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "53cc6f459cb48534601babfa757d9179b3e6402f81b7ad6fa4477505667670ba",
                "md5": "02f9879034127380196b587f884a27cc",
                "sha256": "27c30e50d0f581bdef82c3966901ae9cacc15c9f0748a480dc70a56feb936bde"
            },
            "downloads": -1,
            "filename": "pypartpicker-2.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "02f9879034127380196b587f884a27cc",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.10",
            "size": 12614,
            "upload_time": "2024-12-28T18:28:29",
            "upload_time_iso_8601": "2024-12-28T18:28:29.896920Z",
            "url": "https://files.pythonhosted.org/packages/53/cc/6f459cb48534601babfa757d9179b3e6402f81b7ad6fa4477505667670ba/pypartpicker-2.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-28 18:28:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "thefakequake",
    "github_project": "pypartpicker",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "pypartpicker"
}
        
Elapsed time: 0.37821s