Digi-Keyから部品情報を自動的に取得する方法


15

Digi-Keyのパーツ番号を指定して、メーカー、メーカーのパーツ番号、説明などの情報を自動的に取得する方法。

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には、検索と注文のためのWebサービスがあり、このためのサンプルコードがあります
。services.digikey.com– apalopohapa

3
BeautifulSoupは、おそらくPythonに最適なHTMLパーサーです。それは組み込みのものよりもずっといいです。
コナーウルフ

回答:


8

キーワードの代わりに詳細オプションを使用する必要があります。このような:

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

これは、解析可能なテキストであるHTMLページを返します。すべて表形式であるため、関心のある用語のリストを作成し、値を解析できます。パーツのリストと取得する値(つまり、Voltage、Max Current、またはDigikeyがリストする値)を取得し、パーツ番号を読み取ってページを取得するPythonを作成するパーツリストスクリプトを見ることができます。情報を解析して、CSV、データベース、またはHTMLファイルに貼り付けます。私は似たようなことを考えてきましたが、それほど難しくはないようです。まあ、とにかく私がそれを打ち消すのを止めるのに十分なほど難しい:)


7

たぶん、OcpartのAPIを介してそれを行うことができますか?


1
ドキュメントページから、サプライヤ(この場合はDigiKey)でフィルタリングできるように見えますが、DigiKeyのWebサイトでいくつかの部品を検索しただけで、Octopartは結果にDigiKeyを記載していません。
フライガイ

1
どうやら、Digikeyは彼らを検索に含めないように具体的に依頼したようです。
アパロポハパ

1
それが変更されて以来、Digikeyは結果に含まれています。以前は、Octopartは今年もDigi-keyの検索結果を表示しませんでした。彼らはDigi-Keyで何か解決したようで、OctopartはDigi-keyの結果を表示します
Kortuk

1
Digikeyに対して直接独自のpythonスクリプトを実行し、Octopart APIを照会すると、異なる結果が得られます。また、digikey iを直接コーディングすると、同じパーツの代替パッケージリンクをたどることができます。Ocpartがこれを適切にマッピングするとは思いません。
ケルト14

4

現在のベストアンサーはhttps://services.digikey.com/ですDigi-Key Search Web Service(SWS)およびOrde​​ring Web Service(OWS)は、Digi-Keyの膨大な製品データベースと注文へのリアルタイムアクセスをクライアントに提供します。システム。'。

あなたがしているのは「スクリーンスクレイピング」で、これはDigiKeyがウェブサイトを更新する際に破損する脆弱性があります。


1
はい。これは、これらのサービスがまだ存在していなかった2010年に尋ねられました。当時は「スクリーンスクレイピング」が最善の解決策でした。もちろん、システム/インターフェース/ APIが更新された場合、どの手法も破損に対して脆弱です。
アパロポハパ


2

BOMをMS Excelスプレッドシートとして保持している場合、データ->外部データの取得-> 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.