# 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"
}