Как автоматически получать информацию о детали из Digi-Key

15

Как автоматически получить, учитывая номер детали Digi-Key, такую ​​информацию, как «Производитель», «Номер детали производителя», «Описание» и т. Д. Возможно, при разборе GET http используется:

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

(спасибо angryee за правильные параметры)

Где 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

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

apalopohapa
источник
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. Я думал о чем-то подобном, и это не кажется слишком сложным. Ну, достаточно сильно, чтобы помешать мне все равно вытянуть прямо сейчас :)

AngryEE
источник
7

Возможно, вы могли бы сделать это через API Octopart ?

pingswept
источник
1
С их страницы документации , похоже, вы можете фильтровать по поставщику (в данном случае DigiKey), хотя я только что искал несколько деталей на сайте DigiKey, а Octopart не упомянул DigiKey в результатах.
Flyguy
1
Очевидно, что Digikey специально попросил их не включать их в свои поиски.
Апалопохапа
1
С тех пор ситуация изменилась, Digikey включен в результаты. Раньше даже в этом году Octopart не показывал результаты поиска из Digi-key. Кажется, они что-то сработали с Digi-Key, и теперь Octopart отображает результаты с Digi-Key
Кортук,
1
Я запускаю свой собственный скрипт на Python напрямую с Digikey и запрашиваю Octopart API, и я получаю разные результаты. Кроме того, кодируя непосредственно против digikey, я могу перейти по альтернативным ссылкам на упаковку для той же части, я не думаю, что Octopart отображает это должным образом.
Kert
4

Текущий лучший ответ - https://services.digikey.com/, поскольку « Веб-служба поиска Digi-Key (SWS) и веб-служба заказа (OWS) предоставляют клиентам доступ в реальном времени к обширной базе данных продуктов Digi-Key и заказам. система. ».

То, что вы делаете, это «очистка экрана», которая уязвима для взлома, когда DigiKey обновляет свой сайт.

Брайс
источник
1
Да. Об этом спросили в 2010 году, когда эти услуги еще не существовали. "скребок экрана" был тогда лучшим решением. Конечно, любая техника уязвима для взлома при обновлении систем / интерфейсов / API.
Апалопохапа
2

Если вы сохраните свою спецификацию в виде электронной таблицы MS Excel, вы можете перетащить цены непосредственно в рабочую таблицу через Данные-> Получить внешние данные-> Из Интернета. Я использую 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
imjosh
источник