Як автоматично отримати інформацію про деталі з Digi-Key


15

Як автоматично отримати дані за номером деталі Digi-Key, такі як Виробник, Номер деталі виробника, Опис тощо. Можливо, розбираючи GET http у відповідь на:

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

(дякую сердитому за правильні параметри)

Де DK_PART_NUMBER - номер частини Digikey.

Хтось знає, чи є у них веб-сервіс чи просто кращий інтерфейс для цього?


Задавши це запитання, я вирішив продовжити і написати щось, що зробило базовий підбір з 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

Захоплюється лише перший рядок даних таблиці [ціна на розрив / ціна одиниці / розширена ціна].


4
Digikey тепер має веб-сервіси пошуку та замовлення, і має для цього зразок коду: services.digikey.com
apalopohapa

3
BeautifulSoup - це, мабуть, найкращий HTML-аналізатор для python. Набагато приємніше, ніж вбудовані речі.
Вонор Коннор

Відповіді:


8

Ви б хотіли скористатися опцією докладно замість ключового слова. Подобається це:

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

Це повертає HTML-сторінку, це текст, який можна розібрати. Це все у форматі таблиці, щоб ви могли створити список термінів, які вас цікавлять, і проаналізувати значення. Я бачу сценарій списку деталей, який містить список частин та значень, які ви хочете отримати (тобто напруга, макс. Струм або, як Digikey перераховує його), а потім зробити якийсь Python, щоб прочитати номер деталі, захопити сторінку, розібрати інформацію та вставити її у файл CSV, базу даних чи HTML-файл. Я думав про щось подібне, і це не здається занадто важким. Що ж, досить важко, щоб уникнути того, щоб я його все-таки збивав :)


7

Можливо, ви могли це зробити через API Octopart ?


1
На їхній сторінці документації виглядає, що ви можете фільтрувати постачальника (DigiKey, в даному випадку), хоча я просто шукав кілька частин на веб-сайті DigiKey, і Octopart не згадував DigiKey в результатах.
Flyguy

1
Мабуть, Дігікі спеціально попросив їх не включати їх у свій пошук.
апалопохапа

1
Це змінилося з тих пір, як Digikey включений до результатів. Очевидно, навіть цього року Octopart не показав результати пошуку з Digi-key. Здається, вони щось розробили з Digi-Key, і зараз Octopart відображає результати Digi-Key
Кортук,

1
Я запускаю власний скрипт python безпосередньо проти Digikey і запитую API Octopart, і я отримую різні результати. Крім того, кодування безпосередньо проти digikey я можу переходити до альтернативних посилань упаковки для тієї ж частини, я не думаю, що Octopart відображає це належним чином.
kert

4

Поточна найкраща відповідь - https://services.digikey.com/ як " Веб-сервіс пошуку Digi-Key (SWS) та веб-сервіс замовлення (OWS) надають клієнтам доступ у режимі реального часу до великої бази даних продуктів Digi-Key та замовлення. система. '.

Те, що ви робите, - це "вишкрібання екрана", яке вразливе до злому, коли DigiKey оновлює свій веб-сайт.


1
Так. Це було задано у 2010 році, коли ці служби ще не існували. "вишкрібання екрана" було найкращим рішенням тоді. Звичайно, будь-яка техніка вразлива до злому, коли системи / інтерфейси / API оновлюються.
апалопохапа


2

Якщо ви зберігаєте BOM як електронну таблицю MS Excel, ви можете перетягнути ціни безпосередньо на робочий аркуш за допомогою Data-> Get External Data-> From Web. Я використовую Excel 2010. Ось макрос, який я створив за допомогою макрореєстратора.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.