Cách tự động truy xuất thông tin một phần từ Digi-Key


15

Cách tự động truy xuất, được cung cấp số phần Digi-Key, thông tin, chẳng hạn như Nhà sản xuất, Số Phần của Nhà sản xuất, Mô tả, v.v. Có lẽ phân tích cú pháp GET http theo:

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

(cảm ơn tức giận vì các thông số chính xác)

Trong đó DK_PART_NUMBER là số phần của Digikey.

Có ai biết nếu họ có một dịch vụ web hoặc đơn giản là một giao diện tốt hơn cho việc này?


Sau khi hỏi câu hỏi này, tôi quyết định tiếp tục và viết một cái gì đó đã tìm nạp cơ bản từ 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

Chỉ có dòng dữ liệu đầu tiên của bảng [phá giá / đơn giá / giá mở rộng] được ghi lại.


4
Digikey hiện có các dịch vụ web để tìm kiếm và đặt hàng và có một số mã mẫu cho việc này: services.digikey.com
apalopohapa

3
BeautifulSoup có lẽ là trình phân tích cú pháp HTML tốt nhất cho python. Nó đẹp hơn nhiều so với các công cụ tích hợp.
Sói Connor

Câu trả lời:


8

Bạn muốn sử dụng tùy chọn chi tiết thay vì từ khóa. Như thế này:

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

Điều đó trả về một trang HTML là văn bản có thể được phân tích cú pháp. Tất cả đều ở định dạng bảng để bạn có thể tạo danh sách các thuật ngữ bạn quan tâm và phân tích các giá trị. Tôi có thể thấy tập lệnh danh sách các bộ phận lấy trong danh sách các bộ phận và các giá trị bạn muốn truy xuất (ví dụ: Điện áp, Dòng điện tối đa hoặc tuy nhiên Digikey liệt kê nó) và sau đó tạo một số Python để đọc số phần, lấy trang, phân tích thông tin và dán nó vào tệp CSV, cơ sở dữ liệu hoặc tệp HTML. Tôi đã nghĩ về một cái gì đó tương tự và nó dường như không quá khó. Chà, đủ khó để ngăn tôi từ bỏ nó ngay bây giờ :)


7

Có lẽ bạn có thể làm điều đó thông qua API của Octopart ?


1
Từ trang tài liệu của họ , có vẻ như bạn có thể lọc nhà cung cấp (DigiKey, trong trường hợp này), mặc dù tôi chỉ tìm kiếm một số phần trên trang web của DigiKey và Octopart không đề cập đến DigiKey trong kết quả.
Flyguy

1
Rõ ràng Digikey đã đặc biệt yêu cầu họ không bao gồm họ trong tìm kiếm của họ.
apalopohapa

1
Điều đó đã thay đổi, Digikey được đưa vào kết quả. Rõ ràng, ngay cả năm nay, Octopart cũng không hiển thị kết quả tìm kiếm từ Digi-key. Có vẻ như họ đã làm việc gì đó với Digi-Key và bây giờ Octopart hiển thị kết quả từ Digi-key
Kortuk

1
Tôi đang chạy tập lệnh python của riêng tôi trực tiếp chống lại Digikey và truy vấn API Octopart và tôi nhận được kết quả khác nhau. Ngoài ra, mã hóa trực tiếp chống lại digikey tôi có thể theo các liên kết đóng gói thay thế cho cùng một phần, tôi không nghĩ Octopart ánh xạ đúng cách này.
kert

4

Câu trả lời tốt nhất hiện tại là https://service.digikey.com/ là ' Dịch vụ web tìm kiếm Digi-Key (SWS) và Dịch vụ web đặt hàng (OWS) cung cấp cho khách hàng quyền truy cập thời gian thực vào cơ sở dữ liệu sản phẩm rộng lớn của Digi-Key và đặt hàng hệ thống. '.

Những gì bạn đang làm là "cào màn hình", dễ bị phá vỡ khi DigiKey cập nhật trang web của họ.


1
Đúng. Điều này đã được hỏi vào năm 2010 khi những dịch vụ này chưa tồn tại. "cào màn hình" là giải pháp tốt nhất hồi đó. Tất nhiên, bất kỳ kỹ thuật nào cũng dễ bị phá vỡ khi hệ thống / giao diện / API được cập nhật.
apalopohapa


2

Nếu bạn giữ BOM của mình dưới dạng bảng tính MS Excel, bạn có thể kéo giá trực tiếp vào bảng tính qua Dữ liệu-> Nhận Dữ liệu Ngoài-> Từ Web. Tôi đang sử dụng Excel 2010. Đây là một macro mà tôi đã tạo bằng trình ghi 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.