Jak automatycznie pobierać informacje o części z Digi-Key

15

Jak automatycznie pobierać, biorąc pod uwagę numer części Digi-Key, informacje, takie jak producent, numer części producenta, opis itp. Być może parsowanie GET http odpowiada:

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

(dzięki wściekłości za prawidłowe parametry)

Gdzie DK_PART_NUMBER jest numerem części Digikey.

Czy ktoś wie, czy ma usługę internetową, czy po prostu lepszy interfejs?


Po zadaniu tego pytania postanowiłem napisać coś, co wykonało podstawowe pobieranie z 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

Przechwytywany jest tylko pierwszy wiersz danych w tabeli [podział ceny / cena jednostkowa / cena rozszerzona].

apalopohapa
źródło
4
Digikey ma teraz usługi internetowe do wyszukiwania i zamawiania, a także przykładowy kod: services.digikey.com
apalopohapa
3
BeautifulSoup to prawdopodobnie najlepszy parser HTML dla Pythona. Jest DUŻO ładniejszy niż wbudowane elementy.
Connor Wolf,

Odpowiedzi:

8

Chcesz użyć opcji szczegółowej zamiast słowa kluczowego. Lubię to:

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

Zwraca stronę HTML, która jest tekstem, który można przeanalizować. Wszystko jest w formacie tabeli, dzięki czemu możesz utworzyć listę terminów, które Cię interesują, i przeanalizować wartości. Widzę skrypt listy części, który pobiera listę części i wartości, które chcesz odzyskać (tj. Napięcie, maksymalny prąd, lub jak Digikey je wymienia), a następnie sprawia, że ​​Python odczytuje numer części, chwyta stronę, przeanalizuj informacje i umieść je w pliku CSV, bazie danych lub pliku HTML. Myślałem o czymś podobnym i nie wydaje się to zbyt trudne. Cóż, wystarczająco mocno, żeby powstrzymać mnie przed wyciągnięciem tego teraz :)

AngryEE
źródło
7

Być może mógłbyś to zrobić poprzez API Octopart ?

pingswept
źródło
1
Na stronie z ich dokumentacją wygląda na to, że możesz filtrować według dostawcy (w tym przypadku DigiKey), chociaż właśnie szukałem garści części na stronie internetowej DigiKey i Octopart nie wspomniał o DigiKey w wynikach.
Flyguy,
1
Najwyraźniej Digikey specjalnie poprosił ich, aby nie włączali ich do swoich poszukiwań.
apalopohapa
1
Od tego czasu Digikey jest uwzględniony w wynikach. Wcześniej nawet w tym roku Octopart nie wyświetlał wyników wyszukiwania z Digi-key. Wygląda na to, że opracowali coś z Digi-Key, a teraz Octopart wyświetla wyniki z Digi-Key
Kortuk
1
Korzystam z własnego skryptu Python bezpośrednio na Digikey i sprawdzam API Octopart i otrzymuję różne wyniki. Ponadto, kodując bezpośrednio przeciwko digikey, mogę śledzić alternatywne łącza do pakowania dla tej samej części, nie sądzę, aby Octopart odwzorował to poprawnie.
kert
4

Obecna najlepsza odpowiedź to https://services.digikey.com/, ponieważ „ usługa wyszukiwania Digi-Key (SWS) i usługa zamawiania (OWS) zapewniają klientom dostęp w czasie rzeczywistym do ogromnej bazy danych produktów Digi-Key i zamawiania system. „.

To, co robisz, to „zgarnianie ekranu”, które jest podatne na uszkodzenie podczas aktualizacji witryny przez DigiKey.

Bryce
źródło
1
Tak. Zapytano o to w 2010 r., Kiedy usługi te jeszcze nie istniały. „skrobanie ekranu” było wówczas najlepszym rozwiązaniem. Oczywiście każda technika jest podatna na zerwanie, gdy systemy / interfejsy / API zostaną zaktualizowane.
apalopohapa,
2

Jeśli zachowasz BOM jako arkusz kalkulacyjny MS Excel, możesz wyciągnąć ceny bezpośrednio do arkusza roboczego poprzez Dane-> Pobierz dane zewnętrzne-> Z sieci. Korzystam z programu Excel 2010. Oto makro, które utworzyłem za pomocą rejestratora makr.

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
imjosh
źródło