2008-09-08 29 views
8

Tôi đang cố gắng để có được một webservice và chạy mà thực sự đòi hỏi phải kiểm tra cơ sở dữ liệu whois. Những gì tôi đang làm bây giờ là xấu xí và tôi muốn tránh nó nhiều như tôi có thể: Tôi gọi lệnh gwhois và phân tích đầu ra của nó. Xấu xí.Bạn sẽ đề xuất cách nào để kiểm tra bản ghi cơ sở dữ liệu whois?

Tôi đã thực hiện một số tìm kiếm để cố gắng tìm một cách thức nhiệt tình để thực hiện tác vụ này. Nói chung tôi đã nhận được khá nhiều không có gì - this old discussion list link có một cách để kiểm tra xem tên miền tồn tại. Hoàn toàn không phải những gì tôi đang tìm kiếm ... Nhưng vẫn còn, đó là điều tốt nhất mà Google đã trao cho tôi - mọi thứ khác chỉ là một loạt các câu hỏi chưa được trả lời.

Bất kỳ người nào trong số các bạn đã thành công trong việc thiết lập và chạy một số phương pháp? Tôi rất muốn đánh giá cao một số lời khuyên, hoặc tôi nên làm điều đó theo cách mở, tự mình ngồi xuống và tự viết mã? :)

Trả lời

5

Không có gì sai khi sử dụng tiện ích dòng lệnh để thực hiện những gì bạn muốn. Nếu bạn đặt một wrapper đẹp xung quanh dịch vụ, bạn có thể thực hiện các internals tuy nhiên bạn muốn! Ví dụ:

class Whois(object): 
    _whois_by_query_cache = {} 

    def __init__(self, query): 
     """Initializes the instance variables to defaults. See :meth:`lookup` 
     for details on how to submit the query.""" 
     self.query = query 
     self.domain = None 
     # ... other fields. 

    def lookup(self): 
     """Submits the `whois` query and stores results internally.""" 
     # ... implementation 

Bây giờ, hay không, bạn cuộn của bạn sử dụng urllib riêng, quấn quanh một tiện ích dòng lệnh (như bạn đang làm), hoặc nhập một thư viện của bên thứ ba và sử dụng (như you're saying), giao diện này vẫn giữ nguyên.

Cách tiếp cận này thường không được xem là xấu xí - đôi khi các tiện ích lệnh thực hiện những gì bạn muốn và bạn có thể tận dụng chúng. Nếu tốc độ kết thúc là một nút cổ chai, sự trừu tượng của bạn sẽ làm cho quá trình chuyển sang việc triển khai Python gốc trong suốt tới mã khách hàng của bạn.

Practicality beats purity - đó là những gì Pythonic. :)

+0

Vâng, tôi biết.Tuy nhiên, việc sử dụng quá nhiều công cụ hệ thống và trình bao bọc xung quanh chúng khiến cho việc chuyển ứng dụng sang hệ thống khác khó khăn hơn, nhưng tôi đoán tôi sẽ liên kết với những gì tôi có ngay bây giờ, nếu nó hoạt động;) – kender

+3

Với rào cản trừu tượng tốt, bạn có thể thực hiện nó bất cứ khi nào nó thuận tiện! "Bây giờ là tốt hơn không bao giờ, Mặc dù không bao giờ thường tốt hơn * ngay bây giờ *." :) – cdleary

+1

@kender: nó làm cho nó dễ dàng hơn! Bạn chỉ cần chuyển đổi nội bộ từ gwhois sang Xwhois. Nếu bạn cũng muốn tiếp tục triển khai cũ, bạn có thể mở rộng lớp cũ và chỉ ghi đè lên ví dụ như phương pháp tra cứu. – hopla

0

Một cách khác để làm điều đó là sử dụng mô-đun urllib2 để phân tích cú pháp dịch vụ whois của một số trang khác (nhiều trang web như vậy tồn tại). Nhưng điều đó có vẻ như thậm chí còn nhiều hơn một hack rằng những gì bạn làm bây giờ, và sẽ cung cấp cho bạn một sự phụ thuộc vào bất cứ trang web whois bạn đã chọn, đó là xấu.

Tôi ghét phải nói điều đó, nhưng trừ khi bạn muốn triển khai lại whois trong chương trình của bạn (sẽ phát minh lại bánh xe), chạy whois trên hệ điều hành và phân tích cú pháp đầu ra (tức là bạn đang làm gì bây giờ) có vẻ như đúng cách để làm điều đó.

+0

Không, bạn không nên chạy lệnh whois từ chương trình của mình . Whois là một giao thức rất đơn giản để thực hiện, chỉ cần mở một cổng TCP đến cổng 43 và đọc RFC3912. –

0

Phân tích một trang web khác woulnd't thể là xấu (giả sử html họ woulnd't thể rất xấu), nhưng nó thực sự sẽ buộc tôi với họ - nếu họ đang xuống, tôi xuống :)

Trên thực tế tôi đã tìm thấy một số dự án cũ trên sourceforge: rwhois.py. Điều khiến tôi sợ một chút là bản cập nhật cuối cùng của họ là từ năm 2003. Nhưng, nó có vẻ là một nơi tốt để bắt đầu thực hiện lại những gì tôi làm ngay bây giờ ... Vâng, tôi cảm thấy bắt buộc phải đăng liên kết đến dự án này, để tham khảo thêm.

+0

Vâng, những gì đã thực sự thay đổi về whois trong 5 năm qua. Tôi sẽ mạo hiểm để đoán "không nhiều". Tôi vẫn nghĩ rằng bạn đang tái phát minh ra bánh xe. Câu trả lời lý tưởng của tôi là: sử dụng những gì đang làm việc cho bạn ngay bây giờ trừ khi bạn cảm nhận được một vấn đề thực sự với nó. –

1

Tôi không biết liệu gwhois có làm gì đó đặc biệt với đầu ra máy chủ hay không; tuy nhiên, bạn có thể kết nối rõ ràng với máy chủ whois trên cổng whois (43), gửi truy vấn của bạn, đọc tất cả dữ liệu trong thư trả lời và phân tích cú pháp chúng. Để làm cho cuộc sống dễ dàng hơn một chút, bạn có thể sử dụng lớp telnetlib.Telnet (ngay cả khi giao thức whois đơn giản hơn nhiều so với giao thức telnet) thay vì các ổ cắm đơn giản.

Các bộ phận phức tạp:

  • mà whois máy chủ, bạn sẽ yêu cầu?RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO vv LACNIC có thể là một dự phòng hữu ích, vì chúng có xu hướng trả lời với dữ liệu hữu ích cho các yêu cầu bên ngoài miền của họ.
  • các tùy chọn và đối số chính xác cho mỗi máy chủ whois là gì? một số cung cấp trợ giúp, những người khác thì không. Nói chung, tên miền đơn giản hoạt động mà không có bất kỳ tùy chọn đặc biệt nào.
+0

vấn đề thực sự không phải là trong truy vấn của máy chủ, nhưng phân tích cú pháp kết quả đầu ra của họ. thật đáng buồn, những gì họ trả về định dạng thay đổi rất nhiều giữa các máy chủ. Một trong các dòng, thời gian hết hạn, có thể trông giống như: Ngày hết hạn: 05-Sep-2009 15:24:49 UTC hoặc Hết hạn vào: 26-Dec-14 hoặc, một số máy chủ không cho phép điều đó. – kender

+0

Cả hai đều là một phần của vấn đề. Trong trường hợp của tôi, nó là khó khăn, đủ để tìm máy chủ whois chính xác (có thẩm quyền) trong mọi trường hợp. Phân tích cú pháp dữ liệu không khó, vì chúng tôi quan tâm về cơ bản trong mạng con phụ huynh, do đó, với một chút thử nghiệm và lỗi chúng tôi đã thực hiện. Không thể cung cấp mã, mặc dù, xin lỗi. – tzot

0
import socket 
socket.gethostbyname_ex('url.com') 

nếu nó trả về một gaierror bạn biết biết nó không phải đăng ký với bất kỳ DNS

+1

-1 = Thực hiện truy vấn DNS không giống với truy vấn whois –

0

đây là một giải pháp sẵn sàng để sử dụng làm việc cho tôi; được viết cho Python 3.1 (khi quay trở lại Py2.x, hãy đặc biệt quan tâm đến sự phân biệt văn bản byte/Unicode). điểm truy cập duy nhất của bạn là phương thức DRWHO.whois(), dự kiến ​​một tên miền sẽ được chuyển vào; sau đó nó sẽ cố gắng giải quyết tên bằng cách sử dụng nhà cung cấp được cấu hình là DRWHO.whois_providers[ '*' ] (một giải pháp hoàn chỉnh hơn có thể phân biệt các nhà cung cấp theo tên miền cấp cao nhất). DRWHO.whois() sẽ trả lại một từ điển có một mục nhập text, chứa văn bản phản hồi được máy chủ WHOIS gửi lại. Một lần nữa, một giải pháp hoàn chỉnh hơn sẽ thử và phân tích cú pháp văn bản (phải được thực hiện riêng cho từng nhà cung cấp, vì không có định dạng chuẩn) và trả lại định dạng có cấu trúc hơn (ví dụ: đặt cờ available. trông có sẵn). chúc vui vẻ!

########################################################################## 
import asyncore as         _sys_asyncore 
from asyncore import loop as       _sys_asyncore_loop 
import socket as          _sys_socket 



########################################################################## 
class _Whois_request(_sys_asyncore.dispatcher_with_send, object): 
    # simple whois requester 
    # original code by Frederik Lundh 

    #----------------------------------------------------------------------- 
    whoisPort = 43 

    #----------------------------------------------------------------------- 
    def __init__(self, consumer, host, provider): 
    _sys_asyncore.dispatcher_with_send.__init__(self) 
    self.consumer = consumer 
    self.query = host 
    self.create_socket(_sys_socket.AF_INET, _sys_socket.SOCK_STREAM) 
    self.connect((provider, self.whoisPort,)) 

    #----------------------------------------------------------------------- 
    def handle_connect(self): 
    self.send(bytes('%s\r\n' % (self.query,), 'utf-8')) 

    #----------------------------------------------------------------------- 
    def handle_expt(self): 
    self.close() # connection failed, shutdown 
    self.consumer.abort() 

    #----------------------------------------------------------------------- 
    def handle_read(self): 
    # get data from server 
    self.consumer.feed(self.recv(2048)) 

    #----------------------------------------------------------------------- 
    def handle_close(self): 
    self.close() 
    self.consumer.close() 


########################################################################## 
class _Whois_consumer(object): 
    # original code by Frederik Lundh 

    #----------------------------------------------------------------------- 
    def __init__(self, host, provider, result): 
    self.texts_as_bytes = [] 
    self.host   = host 
    self.provider  = provider 
    self.result   = result 

    #----------------------------------------------------------------------- 
    def feed(self, text): 
    self.texts_as_bytes.append(text.strip()) 

    #----------------------------------------------------------------------- 
    def abort(self): 
    del self.texts_as_bytes[:] 
    self.finalize() 

    #----------------------------------------------------------------------- 
    def close(self): 
    self.finalize() 

    #----------------------------------------------------------------------- 
    def finalize(self): 
    # join bytestrings and decode them (witha a guessed encoding): 
    text_as_bytes   = b'\n'.join(self.texts_as_bytes) 
    self.result[ 'text' ] = text_as_bytes.decode('utf-8') 


########################################################################## 
class DRWHO: 

    #----------------------------------------------------------------------- 
    whois_providers = { 
    '~isa': 'DRWHO/whois-providers', 
    '*':  'whois.opensrs.net', } 

    #----------------------------------------------------------------------- 
    def whois(self, domain): 
    R   = {} 
    provider = self._get_whois_provider('*') 
    self._fetch_whois(provider, domain, R) 
    return R 

    #----------------------------------------------------------------------- 
    def _get_whois_provider(self, top_level_domain): 
    providers = self.whois_providers 
    R   = providers.get(top_level_domain, None) 
    if R is None: 
     R = providers[ '*' ] 
    return R 

    #----------------------------------------------------------------------- 
    def _fetch_whois(self, provider, domain, pod): 
    #..................................................................... 
    consumer = _Whois_consumer(   domain, provider, pod) 
    request = _Whois_request( consumer, domain, provider) 
    #..................................................................... 
    _sys_asyncore_loop() # loops until requests have been processed 


#========================================================================= 
DRWHO = DRWHO() 


domain = 'example.com' 
whois  = DRWHO.whois(domain) 
print(whois[ 'text' ]) 
8

Nhìn này: http://code.google.com/p/pywhois/

pywhois - mô-đun Python để lấy thông tin WHOIS của domain

Mục tiêu: - Tạo một mô-đun Python có thể nhập cảng đơn giản mà sẽ sản xuất phân tích dữ liệu WHOIS cho một định miền. - Có khả năng trích xuất dữ liệu cho tất cả các TLD phổ biến (com, org, net, ...) - Truy vấn trực tiếp máy chủ WHOIS thay vì thực hiện dịch vụ web trung gian như nhiều dịch vụ khác. - Làm việc với Python 2.4+ và không phụ thuộc bên ngoài

Ví dụ:

>>> import pywhois 
>>> w = pywhois.whois('google.com') 
>>> w.expiration_date 
['14-sep-2011'] 
>>> w.emails 
['[email protected]', 
'[email protected]', 
'[email protected]', 
'[email protected]'] 
>>> print w 
... 
+0

Điều này có thể được cài đặt bằng pip không? Có một gói 0,1 pywhois nhưng điều đó có vẻ không giống nhau. – samwize

+0

@samwize (và những người khác muốn biết điều này) xem: http://stackoverflow.com/questions/11578943/error-when-using-pywhois –

6

Tìm thấy câu hỏi này trong quá trình của riêng tôi tìm kiếm thư viện whothon python.

Không biết rằng tôi đồng ý với câu trả lời của cdleary rằng sử dụng thư viện bao bọc lệnh luôn là cách tốt nhất để đi - nhưng tôi có thể thấy lý do tại sao anh ấy nói điều này.

Pro: cmd-line whois xử lý tất cả công việc khó khăn (cuộc gọi socket, phân tích cú pháp, v.v.)

Con: không di động; mô-đun có thể không hoạt động tùy thuộc vào lệnh whois cơ bản. Chậm hơn, vì chạy lệnh và rất có thể là shell ngoài lệnh whois. Bị ảnh hưởng nếu không phải UNIX (Windows), UNIX khác, UNIX cũ hơn hoặc lệnh whois cũ hơn

Tôi đang tìm kiếm một mô-đun whois có thể xử lý tra cứu IP whois và tôi không quan tâm đến việc mã hóa ứng dụng whois của riêng tôi.

Sau đây là các module I (nhẹ) đã cố gắng ra ngoài và biết thêm thông tin về nó:

pywhoisapi:

  • Trang chủ: http://code.google.com/p/pywhoisapi/
  • Thiết kế: REST của khách hàng truy cập vào ARIN whois dịch vụ REST
  • Ưu điểm: Có thể xử lý tra cứu địa chỉ IP
  • Nhược điểm: Có thể lấy thông tin từ máy chủ whois của các RIR khác?

BulkWhois

  • Trang chủ: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • Thiết kế: telnet client truy cập vào giao diện truy vấn telnet whois từ RIR
  • Ưu điểm (?): Có khả năng xử lý tra cứu địa chỉ IP
  • Nhược điểm: Có thể để lấy thông tin từ máy chủ whois của các RIR khác?

pywhois:

  • Trang chủ: http://code.google.com/p/pywhois/
  • Thiết kế: khách hàng REST của việc tiếp cận các dịch vụ whois RRID
  • Ưu điểm: Accessses nhiều RRIDs; có python 3.x chi nhánh
  • Nhược điểm: dường như không để xử lý tra cứu địa chỉ IP

python-whois:

whoisclient - ngã ​​ba của python-whois

  • Trang chủ: http://gitorious.org/python-whois
  • Thiết kế: kết thúc tốt đẹp "whois" lệnh
  • Phụ thuộc vào: IPy.py
  • Nhược điểm: dường như không để xử lý tra cứu địa chỉ IP

Cập nhật: Tôi đã kết thúc bằng cách sử dụng pywhoisapi cho các tra cứu IP ngược lại mà tôi đang thực hiện

Các vấn đề liên quan