วิธีการดึงข้อมูลชิ้นส่วนจาก Digi-Key โดยอัตโนมัติ


15

วิธีการดึงข้อมูลโดยอัตโนมัติเมื่อได้รับหมายเลขชิ้นส่วน Digi-Key ข้อมูลเช่นผู้ผลิตหมายเลขชิ้นส่วนของผู้ผลิตรายละเอียด ฯลฯ อาจแยกวิเคราะห์ GET http ที่เกี่ยวข้องกับ:

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

(ขอบคุณ Angry สำหรับพารามิเตอร์ที่ถูกต้อง)

ที่ 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 มีบริการบนเว็บสำหรับการค้นหาและสั่งซื้อและมีรหัสตัวอย่างบางส่วนสำหรับสิ่งนี้: services.digikey.com
apalopohapa

3
BeautifulSoupน่าจะเป็นตัวแยกวิเคราะห์ HTML ที่ดีที่สุดสำหรับหลาม มันก็ดีกว่าในตัว
Connor Wolf

คำตอบ:


8

คุณต้องการใช้ตัวเลือกรายละเอียดแทนคำหลัก แบบนี้:

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

ที่ส่งคืนหน้า HTML ซึ่งเป็นข้อความที่สามารถแยกวิเคราะห์ได้ ทั้งหมดอยู่ในรูปแบบตารางเพื่อให้คุณสามารถสร้างรายการคำศัพท์ที่คุณสนใจและแยกวิเคราะห์ค่าต่างๆ ฉันสามารถดูสคริปต์รายการชิ้นส่วนที่เกิดขึ้นในรายการชิ้นส่วนและค่าที่คุณต้องการดึงข้อมูล (เช่น Voltage, Max Current หรือ Digikey แสดงรายการ) จากนั้นให้ Python อ่านหมายเลขชิ้นส่วนคว้าหน้า แยกข้อมูลและติดในไฟล์ CSV ฐานข้อมูลหรือ HTML ฉันคิดถึงสิ่งที่คล้ายกันและดูเหมือนจะไม่ยากเกินไป ดีพอที่จะห้ามไม่ให้ฉันตีมันออกไปตอนนี้ :)


7

บางทีคุณสามารถทำได้ผ่านOctopart API ?


1
จากหน้าเอกสารของพวกเขาดูเหมือนว่าคุณสามารถกรองซัพพลายเออร์ (DigiKey ในกรณีนี้) แม้ว่าฉันจะค้นหาชิ้นส่วนจำนวนหนึ่งบนเว็บไซต์ของ DigiKey และ Octopart ไม่ได้พูดถึง DigiKey ในผลลัพธ์
Flyguy

1
เห็นได้ชัดว่า Digikey ได้ขอให้พวกเขาโดยเฉพาะที่จะไม่รวมพวกเขาในการค้นหา
apalopohapa

1
ที่มีการเปลี่ยนแปลงตั้งแต่ Digikey รวมอยู่ในผลลัพธ์ก่อนหน้านี้แม้ Octopart ไม่ได้แสดงผลการค้นหาจาก Digi-key ดูเหมือนว่าพวกเขาได้ทำงานกับ Digi-Key และตอนนี้ Octopart แสดงผลลัพธ์จาก Digi-key
Kortuk

1
ฉันกำลังเรียกใช้สคริปต์ python ของฉันโดยตรงกับ Digikey และสอบถาม Octopart API และฉันได้รับผลลัพธ์ที่แตกต่างกัน นอกจากนี้การเขียนโค้ดโดยตรงกับ digikey ฉันสามารถติดตามลิงค์สำรองสำหรับส่วนเดียวกันฉันไม่คิดว่าแผนที่ของ Octopart ถูกต้อง
kert

4

คำตอบที่ดีที่สุดในปัจจุบันคือhttps://services.digikey.com/ เนื่องจาก ' บริการค้นหาเว็บ Digi-Key (SWS) และการสั่งซื้อบริการเว็บ (OWS) ให้ลูกค้าเข้าถึงฐานข้อมูลผลิตภัณฑ์และสั่งซื้อของ Digi-Key ได้แบบเรียลไทม์ ระบบ. '

สิ่งที่คุณทำคือ "การคัดลอกหน้าจอ" ซึ่งเสี่ยงต่อการแตกเมื่อ DigiKey อัปเดตเว็บไซต์ของพวกเขา


1
ใช่. สิ่งนี้ถูกถามในปี 2010 เมื่อยังไม่มีบริการเหล่านั้น "การขูดหน้าจอ" เป็นวิธีแก้ปัญหาที่ดีที่สุดในตอนนั้น แน่นอนว่าเทคนิคใดก็ตามที่มีความเสี่ยงต่อการแตกหักเมื่อระบบ / อินเตอร์เฟส / API ได้รับการปรับปรุง
apalopohapa


2

หากคุณเก็บ BOM ของคุณไว้เป็นสเปรดชีต 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.