Come recuperare automaticamente le informazioni sulla parte da Digi-Key


15

Come recuperare automaticamente, dato un numero di parte Digi-Key, informazioni come Produttore, Numero di parte del produttore, Descrizione, ecc. Forse analizzando il GET http rispetto a:

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

(grazie a angryee per i parametri corretti)

Dove DK_PART_NUMBER è il numero di parte Digikey.

Qualcuno sa se hanno un servizio web o semplicemente un'interfaccia migliore per questo?


Dopo aver fatto questa domanda ho deciso di andare avanti e scrivere qualcosa che ha fatto un po 'di recupero da 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

Viene acquisita solo la prima riga di dati della tabella [interruzione di prezzo / prezzo unitario / prezzo esteso].


4
Digikey ora ha servizi Web per la ricerca e l'ordinazione e ha alcuni esempi di codice per questo: services.digikey.com
apalopohapa,

3
BeautifulSoup è probabilmente il miglior parser HTML per Python. È MOLTO più bello di quello incorporato.
Connor Wolf,

Risposte:


8

Si desidera utilizzare l'opzione di dettaglio anziché la parola chiave. Come questo:

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

Ciò restituisce una pagina HTML che è un testo che può essere analizzato. È tutto in formato tabella in modo da poter creare un elenco di termini che ti interessano e analizzare i valori. Riesco a vedere uno script dell'elenco delle parti che contiene un elenco di parti e i valori che desideri recuperare (ad es. Voltaggio, Corrente massima o comunque Digikey lo elenca) e quindi creare un Python per leggere il numero di parte, prendere la pagina, analizzare le informazioni e incollarle in un file CSV, database o HTML. Ho pensato a qualcosa di simile e non sembra troppo difficile. Bene, abbastanza difficile da impedirmi di tirarlo fuori adesso comunque :)


7

Forse potresti farlo tramite l'API di Octopart ?


1
Dalla loro pagina di documentazione , sembra che sia possibile filtrare il fornitore (DigiKey, in questo caso), anche se ho appena cercato una manciata di parti sul sito Web di DigiKey e Octopart non ha menzionato DigiKey nei risultati.
Flyguy

1
Apparentemente Digikey ha specificamente chiesto loro di non escluderli nella loro ricerca.
apalopohapa,

1
Da allora è cambiato, Digikey è stato incluso nei risultati. In precedenza, anche quest'anno, Octopart non ha mostrato i risultati di ricerca di Digi-key. Sembra che abbiano funzionato con Digi-Key e ora Octopart mostra i risultati di Digi-key
Kortuk,

1
Sto eseguendo il mio script Python direttamente contro Digikey e sto interrogando Octopart API e sto ottenendo risultati diversi. Inoltre, codificando direttamente contro digikey posso seguire collegamenti di packaging alternativi per la stessa parte, non credo che Octopart lo mappi correttamente.
kert,

4

La migliore risposta attuale è https://services.digikey.com/ come ' Il servizio Web di ricerca Digi-Key (SWS) e il servizio Web di ordinazione (OWS) forniscono ai clienti un accesso in tempo reale al vasto database di prodotti e ordini di Digi-Key sistema. '.

Quello che stai facendo è "screen scraping", che è vulnerabile alla rottura mentre DigiKey aggiorna il loro sito web.


1
Sì. Questo è stato chiesto nel 2010 quando quei servizi non esistevano ancora. "screen scraping" era la soluzione migliore allora. Naturalmente, qualsiasi tecnica è vulnerabile alla rottura quando i sistemi / interfacce / API vengono aggiornati.
apalopohapa,


2

Se mantieni la tua DBA come foglio di calcolo di MS Excel, puoi inserire i prezzi direttamente in un foglio di lavoro tramite Dati-> Ottieni dati esterni-> Dal Web. Sto usando Excel 2010. Ecco una macro che ho realizzato usando il registratore di macro.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.