Comment récupérer automatiquement les informations sur les pièces de Digi-Key


15

Comment récupérer automatiquement, en fonction d'un numéro de pièce Digi-Key, des informations telles que le fabricant, le numéro de pièce du fabricant, la description, etc. Peut-être en analysant la réponse http GET pour:

http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=DK_PART_NUMBER

(merci à angryee pour les bons paramètres)

Où DK_PART_NUMBER est le numéro de pièce Digikey.

Quelqu'un sait-il s'il a un service Web ou simplement une meilleure interface pour cela?


Après avoir posé cette question, j'ai décidé d'aller de l'avant et d'écrire quelque chose qui a fait une récupération de base de Digikey:

dk_pn = '587-1962-1-ND'

from urllib import urlopen
from sgmllib import SGMLParser

headers = ['Digi-Key Part Number',
           'Manufacturer',
           'Manufacturer Part Number',
           'Description',
           'Lead Free Status / RoHS Status',
           'Operating Temperature',
           'Standard Package',
           'Price Break',
           'Unit Price',
           'Extended Price']

class DK_Parser(SGMLParser):
    def reset(self):

        SGMLParser.reset(self)

        self.last_td = ''
        self.inside_th = False
        self.inside_td = False
        self.grab_data = False
        self.part_info = {}
        self.hdr_index = 0
        self.row_hdrs = []

    def start_tr(self, attrs): # row
        self.first_header_in_row = True

    def start_th(self, attrs): # header cell
        if self.first_header_in_row:
            self.first_header_in_row = False
            self.row_hdrs = []
            self.hdr_index = 0
        self.inside_th = True

    def end_th(self):
        self.inside_th = False

    def start_td(self, attrs): # data cell
        self.inside_td = True

    def end_td(self): 
        self.inside_td = False
        self.hdr_index = self.hdr_index+1

    def handle_data(self,text):
        text = text.strip()
        if self.inside_th:
            if text in headers:
                self.row_hdrs.append(text)
                self.last_td = ''
                self.grab_data = True
            else:
                self.grab_data = False
        elif self.inside_td and self.grab_data:
            if self.hdr_index:
                self.last_td = ''
            if self.hdr_index < len(self.row_hdrs):
                self.last_td = self.last_td + text
                self.part_info[self.row_hdrs[self.hdr_index]] = self.last_td

dk_url = 'http://search.digikey.com/scripts/DkSearch/dksus.dll'
dk_params = '?Detail&name='

sock = urlopen(dk_url + dk_params + dk_pn)

parser = DK_Parser()
parser.feed(sock.read())
sock.close()
parser.close()

for k,v in parser.part_info.items():
    print k,":",v

Seule la première ligne de données du tableau [prix cassé / prix unitaire / prix étendu] est saisie.


4
Digikey a maintenant des services Web pour la recherche et la commande, et a un exemple de code pour cela: services.digikey.com
apalopohapa

3
BeautifulSoup est probablement le meilleur analyseur HTML pour python. C'est BEAUCOUP plus agréable que les trucs intégrés.
Connor Wolf

Réponses:


8

Vous souhaitez utiliser l'option de détail au lieu du mot clé. Comme ça:

http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=458-1003-ND

Cela renvoie une page HTML qui est du texte qui peut être analysé. Tout est au format tableau afin que vous puissiez créer une liste de termes qui vous intéressent et analyser les valeurs. Je peux voir un script de liste de pièces qui contient une liste de pièces et les valeurs que vous souhaitez récupérer (c.-à-d. Tension, courant maximal ou Digikey le répertorie), puis créer du Python pour lire le numéro de pièce, saisir la page, analyser les informations et les coller dans un fichier CSV, base de données ou HTML. J'ai pensé à quelque chose de similaire et cela ne semble pas trop difficile. Eh bien, assez dur pour m'empêcher de le fouetter maintenant quand même :)


7

Peut-être pourriez-vous le faire via l'API Octopart ?


1
À partir de leur page de documentation , il semble que vous puissiez filtrer sur le fournisseur (DigiKey, dans ce cas), même si je viens de rechercher une poignée de pièces sur le site Web de DigiKey et Octopart n'a pas mentionné DigiKey dans les résultats.
Flyguy

1
Apparemment, Digikey leur a spécifiquement demandé de ne pas les inclure dans leur recherche.
apalopohapa

1
Cela a changé depuis, Digikey est inclus dans les résultats. Cette année encore, Octopart n'a pas montré les résultats de recherche de Digi-key. Il semble qu'ils aient travaillé avec Digi-Key et maintenant Octopart affiche les résultats de Digi-key
Kortuk

1
J'exécute mon propre script python directement contre Digikey et j'interroge l'API Octopart et j'obtiens des résultats différents. De plus, en codant directement contre digikey, je peux suivre des liens de conditionnement alternatifs pour la même partie, je ne pense pas qu'Octopart mappe cela correctement.
kert

4

La meilleure réponse actuelle est https://services.digikey.com/ comme `` Le service Web de recherche Digi-Key (SWS) et le service Web de commande (OWS) fournissent aux clients un accès en temps réel à la vaste base de données de produits et de commande de Digi-Key. système. ".

Ce que vous faites est un "grattage d'écran", qui est vulnérable à la rupture lorsque DigiKey met à jour son site Web.


1
Oui. Cela a été demandé en 2010 alors que ces services n'existaient pas encore. "grattage d'écran" était la meilleure solution à l'époque. Bien sûr, toute technique est vulnérable à la rupture lorsque les systèmes / interfaces / API sont mis à jour.
apalopohapa


2

Si vous conservez votre nomenclature sous forme de feuille de calcul MS Excel, vous pouvez extraire les prix directement dans une feuille de calcul via Données-> Obtenir des données externes-> À partir du Web. J'utilise Excel 2010. Voici une macro que j'ai créée à l'aide de l'enregistreur de macros.

Sub addDigikeyPriceExample()
    'http://www.digikey.com/product-detail/en/MANUFACTURERPARTNUM/DIGIKEYPARTNUM/PACKAGINGNUM ?
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.digikey.com/product-detail/en/SI4707-B20-GM/336-2147-ND/2686997" _
        , Destination:=Range("$A$1"))
        .Name = "2622997" 'make random number?
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = """pricing"""
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.