Cara mengambil informasi bagian dari Digi-Key secara otomatis

15

Cara mengambil secara otomatis, mengingat nomor komponen Digi-Key, informasi seperti Pabrikan, Nomor Komponen Pabrikan, Deskripsi, dll. Mungkin menguraikan GET http terkait dengan:

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

(terima kasih kepada angryee untuk parameter yang benar)

Di mana DK_PART_NUMBER adalah nomor bagian Digikey.

Apakah ada yang tahu jika mereka memiliki layanan web atau hanya antarmuka yang lebih baik untuk ini?


Setelah mengajukan pertanyaan ini, saya memutuskan untuk melanjutkan dan menulis sesuatu yang diambil dari 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

Hanya baris data pertama dari tabel [harga break / harga satuan / harga perpanjangan] yang ditangkap.

apalopohapa
sumber
4
Digikey sekarang memiliki layanan web untuk mencari dan memesan, dan memiliki beberapa kode contoh untuk ini: services.digikey.com
apalopohapa
3
BeautifulSoup mungkin adalah parser HTML terbaik untuk python. Jauh lebih bagus daripada barang bawaan.
Connor Wolf

Jawaban:

8

Anda ingin menggunakan opsi detail daripada kata kunci. Seperti ini:

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

Itu mengembalikan halaman HTML yang merupakan teks yang dapat diuraikan. Semuanya dalam format tabel sehingga Anda dapat membuat daftar istilah yang Anda minati dan parsing nilai-nilainya. Saya dapat melihat skrip daftar bagian yang memuat daftar bagian dan nilai yang ingin Anda ambil (yaitu, Voltage, Max Current, atau bagaimanapun Digikey mencantumkannya) dan kemudian membuat beberapa Python untuk membaca nomor bagian, ambil halaman, parsing info dan tempel dalam file CSV, database atau HTML. Saya telah memikirkan sesuatu yang serupa dan sepertinya tidak terlalu sulit. Yah, cukup sulit untuk menghentikan saya dari mencambuknya sekarang juga :)

AngryEE
sumber
7

Mungkin Anda bisa melakukannya melalui API Octopart ?

pingswept
sumber
1
Dari halaman dokumentasi mereka , sepertinya Anda dapat memfilter pada pemasok (DigiKey, dalam hal ini), walaupun saya hanya mencari beberapa bagian di situs web DigiKey dan Octopart tidak menyebut DigiKey dalam hasilnya.
Flyguy
1
Rupanya Digikey secara khusus meminta mereka untuk tidak memasukkan mereka dalam pencarian mereka.
apalopohapa
1
Sejak itu telah berubah, Digikey termasuk dalam hasil. Sebelumnya, bahkan tahun ini, Octopart tidak menampilkan hasil pencarian dari Digi-key. Tampaknya mereka telah melakukan sesuatu dengan Digi-Key dan sekarang Octopart menampilkan hasil dari Digi-key
Kortuk
1
Saya menjalankan skrip python saya sendiri secara langsung terhadap Digikey dan meminta Octopart API dan saya mendapatkan hasil yang berbeda. Juga, pengkodean langsung terhadap digikey saya dapat mengikuti tautan pengemasan alternatif untuk bagian yang sama, saya tidak berpikir Octopart memetakan ini dengan benar.
kert
4

Jawaban terbaik saat ini adalah https://services.digikey.com/ sebagai ' Layanan Web Pencarian Digi-Key (SWS) dan Layanan Web Pemesanan (OWS) memberi klien akses real-time ke basis data dan pemesanan produk Digi-Key yang luas. sistem. '

Apa yang Anda lakukan adalah "pengikisan layar", yang rentan pecah saat DigiKey memperbarui situs web mereka.

Bryce
sumber
1
Iya. Ini ditanyakan pada 2010 ketika layanan tersebut belum ada. "Scraping layar" adalah solusi terbaik saat itu. Tentu saja, teknik apa pun rentan terhadap kerusakan ketika sistem / antarmuka / API diperbarui.
apalopohapa
2

Jika Anda menyimpan BOM sebagai spreadsheet MS Excel, Anda dapat menarik harga langsung ke lembar kerja melalui Data-> Dapatkan Data Eksternal-> Dari Web. Saya menggunakan Excel 2010. Ini adalah makro yang saya buat menggunakan perekam makro.

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
sumber