diff options
Diffstat (limited to 'src/ee/digikey/__init__.py')
-rw-r--r-- | src/ee/digikey/__init__.py | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/src/ee/digikey/__init__.py b/src/ee/digikey/__init__.py index 9815a8f..31d5c41 100644 --- a/src/ee/digikey/__init__.py +++ b/src/ee/digikey/__init__.py @@ -8,6 +8,7 @@ import urllib.parse from functools import total_ordering from pathlib import Path from typing import List, Optional +from urllib.parse import urlparse, parse_qs from lxml import html from selenium import webdriver @@ -59,6 +60,48 @@ def _first(collection, default=None): return next(iter(collection), default) +class DigikeyStore(object): + BASEURL = "http://purl.org/ee/supplier/digikey" + + def __init__(self, url, store, products_url): + self.url = url + self.store = store + self.products_url = products_url + + @staticmethod + def from_store_code(store_code): + url = "{}?store={}".format(DigikeyStore.BASEURL, store_code) + + products_url = "https://www.digikey.com/products/en" if store_code == "us" else \ + "https://www.digikey.{}/products/en".format(store_code) + + return DigikeyStore(url, store_code, products_url) + + @staticmethod + def from_url(store_url) -> Optional["DigikeyStore"]: + base = urlparse(DigikeyStore.BASEURL) + url = urlparse(store_url) + + if base.scheme != url.scheme or \ + base.netloc != url.netloc or \ + base.path != url.path: + return None + + q = parse_qs((url.query or "").strip()) + + store = q.get("store") + + if not store: + return None + + del q["store"] + + if len(q): + return None + + return DigikeyStore.from_store_code(store[0]) + + class Digikey(object): def __init__(self): self.attribute_types = {} @@ -230,7 +273,8 @@ class DigikeyClient(object): def __nop(self, message): pass - def __init__(self, cache_dir: Path = None, on_download=None): + def __init__(self, baseurl, cache_dir: Path = None, on_download=None): + self.baseurl = baseurl self.on_download = on_download or self.__nop self.cache = ee._utils.maybe_cache(cache_dir) self.driver: Optional[webdriver.Chrome] = None @@ -241,13 +285,11 @@ class DigikeyClient(object): def product_search(self, query: str, page_size=10) -> str: params = {'lang': 'en', 'site': 'us', 'keywords': query, 'pageSize': str(page_size)} cache_key = urllib.parse.quote(query) - page = self._req("https://www.digikey.com/products/en", cache_key=cache_key, params=params) + page = self._req(self.baseurl, cache_key=cache_key, params=params) return page def _req(self, url, cache_key, params=None): - if not url.startswith("http"): - url = "https://www.digikey.com" + url url = url + ("" if not params else "?" + urllib.parse.urlencode(params)) cached = self.cache.lookup(cache_key) |