Cómo recuperar información de piezas de Digi-Key automáticamente

15

Cómo recuperar automáticamente, dado un número de pieza de Digi-Key, información como el fabricante, número de pieza del fabricante, descripción, etc. Quizás analizando el GET http respose a:

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

(gracias a angryee por los parámetros correctos)

Donde DK_PART_NUMBER es el número de pieza de Digikey.

¿Alguien sabe si tienen un servicio web o simplemente una mejor interfaz para esto?


Después de hacer esta pregunta, decidí seguir adelante y escribir algo que hiciera algunas búsquedas básicas de 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

Solo se captura la primera línea de datos de la tabla [ruptura de precio / precio unitario / precio extendido].

apalopohapa
fuente
44
Digikey ahora tiene servicios web para buscar y ordenar, y tiene algunos códigos de muestra para esto: services.digikey.com
apalopohapa
3
BeautifulSoup es probablemente el mejor analizador HTML para python. Es MUCHO mejor que las cosas integradas.
Connor Wolf

Respuestas:

8

Desea utilizar la opción de detalle en lugar de la palabra clave. Me gusta esto:

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

Eso devuelve una página HTML que es texto que se puede analizar. Todo está en formato de tabla para que pueda crear una lista de términos que le interesen y analizar los valores. Puedo ver una secuencia de comandos de la lista de partes que toma una lista de partes y los valores que desea recuperar (es decir, Voltaje, Corriente máxima o, sin embargo, Digikey lo enumera) y luego hacer un poco de Python para leer el número de parte, tomar la página, analizar la información y pegarla en un archivo CSV, base de datos o HTML. He estado pensando en algo similar y no parece demasiado difícil. Bueno, lo suficientemente difícil como para evitar que lo saque ahora mismo de todos modos :)

AngryEE
fuente
7

¿Quizás podrías hacerlo a través de la API de Octopart ?

pingswept
fuente
1
Desde su página de documentación , parece que puede filtrar por proveedor (DigiKey, en este caso), aunque acabo de buscar un puñado de partes en el sitio web de DigiKey y Octopart no mencionó a DigiKey en los resultados.
Flyguy
1
Al parecer, Digikey les ha pedido específicamente que no los incluyan en su búsqueda.
apalopohapa
1
Eso ha cambiado desde entonces, Digikey está incluido en los resultados. Anteriormente, incluso este año, Octopart no mostró resultados de búsqueda de Digi-key. Parece que han resuelto algo con Digi-Key y ahora Octopart muestra los resultados de Digi-key
Kortuk
1
Estoy ejecutando mi propio script de Python directamente contra Digikey y consultando la API de Octopart y obtengo resultados diferentes. Además, al codificar directamente contra digikey, puedo seguir enlaces de paquetes alternativos para la misma parte, no creo que Octopart asigne esto correctamente.
kert
4

La mejor respuesta actual es https://services.digikey.com/ como ' El servicio web de búsqueda de Digi-Key (SWS) y el servicio web de pedidos (OWS) proporcionan a los clientes acceso en tiempo real a la amplia base de datos de productos y pedidos de Digi-Key sistema. '.

Lo que está haciendo es "raspar la pantalla", que es vulnerable a romperse cuando DigiKey actualiza su sitio web.

Bryce
fuente
1
Si. Esto se solicitó en 2010 cuando esos servicios aún no existían. "Screen scraping" fue la mejor solución en aquel entonces. Por supuesto, cualquier técnica es vulnerable a la ruptura cuando se actualizan los sistemas / interfaces / API.
apalopohapa
2

Si mantiene su BOM como una hoja de cálculo de MS Excel, puede extraer los precios directamente en una hoja de trabajo a través de Datos-> Obtener datos externos-> De la web. Estoy usando Excel 2010. Aquí hay una macro que hice usando la grabadora de macros.

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
fuente