Como recuperar informações da peça da Digi-Key automaticamente

15

Como recuperar automaticamente, com base no número de peça da Digi-Key, informações como Fabricante, Número de peça do fabricante, Descrição etc. Talvez a análise do http GET se refira a:

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

(obrigado a angryee pelos parâmetros corretos)

Onde DK_PART_NUMBER é o número da peça do Digikey.

Alguém sabe se eles têm um serviço web ou simplesmente uma interface melhor para isso?


Depois de fazer essa pergunta, decidi ir em frente e escrever algo que fiz algumas buscas básicas no 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

Somente a primeira linha de dados da tabela [intervalo de preço / preço unitário / preço estendido] é capturada.

apalopohapa
fonte
4
Digikey agora tem serviços web para pesquisar e encomendar, e tem um código de exemplo para isso: services.digikey.com
apalopohapa
3
BeautifulSoup é provavelmente o melhor analisador de HTML para python. É MUITO melhor, então o material embutido.
Connor Wolf

Respostas:

8

Você deseja usar a opção de detalhes em vez da palavra-chave. Como isso:

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

Isso retorna uma página HTML, que é um texto que pode ser analisado. Está tudo no formato de tabela, para que você possa criar uma lista de termos de seu interesse e analisar os valores. Consigo ver um script da lista de peças que contém uma lista de peças e os valores que você deseja recuperar (por exemplo, tensão, corrente máxima ou como o Digikey o lista) e, em seguida, cria um Python para ler o número da peça, acessar a página, analisar as informações e colá-las em um arquivo CSV, banco de dados ou HTML. Eu estive pensando em algo semelhante e não parece muito difícil. Bem, difícil o suficiente para me impedir de sacar agora mesmo assim :)

AngryEE
fonte
7

Talvez você possa fazer isso através da API da Octopart ?

pingswept
fonte
1
Na página de documentação , parece que você pode filtrar o fornecedor (DigiKey, neste caso), embora eu tenha apenas pesquisado algumas peças no site da DigiKey e a Octopart não tenha mencionado a DigiKey nos resultados.
Flyguy
1
Aparentemente, Digikey pediu especificamente que não os incluíssem em suas buscas.
Apalopohapa 27/09/10
1
Desde então, o Digikey foi incluído nos resultados. Anteriormente, mesmo este ano, o Octopart não mostrou resultados de pesquisa da Digi-key. Parece que eles têm trabalhado em algo com Digi-Key e agora Octopart exibe os resultados da Digi-Key
Kortuk
1
Estou executando meu próprio script python diretamente no Digikey e consultando a Octopart API e estou obtendo resultados diferentes. Além disso, codificando diretamente no digikey, eu posso seguir links de empacotamento alternativos para a mesma parte, não acho que o Octopart mapeie isso corretamente.
kert
4

A melhor resposta atual é https://services.digikey.com/ como ' O Serviço da Web de Pesquisa Digi-Key (SWS) e o Serviço da Web de Pedidos (OWS) fornecem aos clientes acesso em tempo real ao vasto banco de dados e pedidos de produtos da Digi-Key sistema. '

O que você está fazendo é "raspagem de tela", vulnerável à quebra quando o DigiKey atualiza seu site.

Bryce
fonte
1
Sim. Isso foi perguntado em 2010 quando os serviços ainda não existiam. "raspagem de tela" era a melhor solução naquela época. Obviamente, qualquer técnica é vulnerável a falhas quando os sistemas / interfaces / API são atualizados.
Apalopohapa
2

Se você mantiver sua lista técnica como uma planilha do MS Excel, poderá puxar os preços diretamente para uma planilha via Dados-> Obter dados externos-> Da Web. Estou usando o Excel 2010. Aqui está uma macro que eu criei usando o gravador de 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
imjosh
fonte