2011-08-22 9 views
5

मैं इस सूत्र पहले से ही देखा है - How can I unshorten a URL?मैं पायथन का उपयोग कर यूआरएल को कैसे छोटा कर सकता हूं?

संकल्प लिया जवाब के साथ मेरी समस्या (कि unshort.me एपीआई का उपयोग किया जाता है) कि मैं यूट्यूब लिंक unshortening पर ध्यान केंद्रित कर रहा हूँ। चूंकि unshort.me को आसानी से उपयोग किया जाता है, यह कैप्चास के साथ लगभग 9 0% परिणाम देता है जिसे मैं हल करने में असमर्थ हूं।

अब तक मैं उपयोग करने के साथ अटक कर रहा हूँ:

def unshorten_url(url): 
    resolvedURL = urllib2.urlopen(url) 
    print resolvedURL.url 

    #t = Test() 
    #c = pycurl.Curl() 
    #c.setopt(c.URL, 'http://api.unshort.me/?r=%s&t=xml' % (url)) 
    #c.setopt(c.WRITEFUNCTION, t.body_callback) 
    #c.perform() 
    #c.close() 
    #dom = xml.dom.minidom.parseString(t.contents) 
    #resolvedURL = dom.getElementsByTagName("resolvedURL")[0].firstChild.nodeValue 
    return resolvedURL.url 

नोट: टिप्पणी में सब कुछ मैं जब unshort.me सेवा है जो कैप्चा लिंक लौट रहा था का उपयोग कर करने की कोशिश की क्या है।

क्या किसी को भी इस ऑपरेशन को खोलने के बिना पूरा करने के लिए एक अधिक कुशल तरीका पता है (क्योंकि यह बैंडविड्थ का अपशिष्ट है)?

+0

क्या यूआरएल shortener आप के साथ परेशानी हो रही है? आप unshort.me का उपयोग क्यों कर रहे हैं? आपका कोड पहले से ही काम करना चाहिए, वास्तविक यूआरएल को पुनर्निर्देशन का पालन करके इसे यूआरएल को अनछुआ करना चाहिए। – zeekay

+0

मुझे समझ में नहीं आता कि "खुले बिना उपयोग किए" का क्या मतलब है। एक छोटा लिंक किसी और के डेटाबेस में एक कुंजी है; आप डेटाबेस से पूछे बिना लिंक का विस्तार नहीं कर सकते हैं। –

+0

जब मैं उस पोस्ट को पढ़ रहा था जिसे मैंने संदर्भित किया था (http://stackoverflow.com/questions/4201062/how-can-i-unshorten-a-url-using-python) यह उस आदेश की तरह दिखता है urlopen पूरे पृष्ठ का अनुरोध करें तो बैंडविड्थ का अपशिष्ट है जब मैं जो खोज रहा हूं वह लिंक है। सुझाई गई विधि मेरे लिए काम नहीं कर रही थी (unshort.me) इसलिए मैंने यह देखने का फैसला किया कि क्या कोई अन्य विकल्प हैं या नहीं। – brandonmat

उत्तर

14

सबसे अच्छा मूल्यांकन वाला उत्तर (नहीं स्वीकार किए जाते हैं जवाब) है कि प्रश्न में उपयोग करें:

# This is for Py2k. For Py3k, use http.client and urllib.parse instead, and 
# use // instead of/for the division 
import httplib 
import urlparse 

def unshorten_url(url): 
    parsed = urlparse.urlparse(url) 
    h = httplib.HTTPConnection(parsed.netloc) 
    resource = parsed.path 
    if parsed.query != "": 
     resource += "?" + parsed.query 
    h.request('HEAD', resource) 
    response = h.getresponse() 
    if response.status/100 == 3 and response.getheader('Location'): 
     return unshorten_url(response.getheader('Location')) # changed to process chains of short urls 
    else: 
     return url 
+0

एक आकर्षण की तरह काम किया - मैंने कल इसका कोई फायदा नहीं लिया क्योंकि मुझे रिटर्न के 70% पर त्रुटियां मिल रही थीं। हो सकता है कि सिर्फ एक ही चीज हो और इसलिए मैंने इसे खारिज कर दिया। आपके उत्तर के लिए धन्यवाद और मेरे अनावश्यक प्रश्न के लिए खेद है। – brandonmat

+2

फॉलो-अप के रूप में, मुझे बस याद है कि इस तरह मेरे लिए क्यों काम नहीं किया। मैं एक ट्विटर आवेदन पर काम कर रहा हूं और ऐसे मामले हैं जहां एक यूआरएल दो बार छोटा होता है (जो कि कई बार होता है)। उदाहरण के लिए यह इस वीडियो [u't.co/lszdhNP '] प्राप्त करेगा और इस url etsy.me/r6JBGq को वापस कर देगा - जहां मुझे वास्तव में अंतिम यूट्यूब पता चाहिए जो इस लिंक से है। क्या आप इस बारे में जानने के किसी भी तरीके से जानते हैं? – brandonmat

+2

मेरे उत्तर में एक सरल परिवर्तन किया गया –

2

आपको इसे खोलना है, अन्यथा आपको नहीं पता होगा कि यह किस URL पर रीडायरेक्ट करेगा। जैसा कि ग्रेग ने कहा:

एक छोटा लिंक किसी और के डेटाबेस में एक कुंजी है; आप डेटाबेस

पर प्रश्न पूछे बिना लिंक का विस्तार नहीं कर सकते हैं।

किसी को भी खुला का उपयोग कर (क्योंकि यह बैंडविड्थ की बर्बादी है) के बिना इस आपरेशन पूरा करने के लिए एक अधिक कुशल तरीका है पता है?

HTTP के Connection: keep-alive का उपयोग करके कनेक्शन को बंद न करने का अधिक प्रभावी तरीका है, पृष्ठभूमि में इसे खोलें। के बजाय

> telnet unshorten.me 80 
Trying 64.202.189.170... 
Connected to unshorten.me. 
Escape character is '^]'. 
HEAD http://unshort.me/index.php?r=http%3A%2F%2Fbit.ly%2FcXEInp HTTP/1.1 
Host: unshorten.me 

HTTP/1.1 301 Moved Permanently 
Date: Mon, 22 Aug 2011 20:42:46 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Location: http://resolves.me/index.php?r=http%3A%2F%2Fbit.ly%2FcXEInp 
Cache-Control: private 
Content-Length: 0 

तो अगर आप HEAD HTTP विधि का उपयोग करें, GETआप:

एक छोटे से परीक्षण के बाद, unshorten.me खाते में HEAD विधि लेने के लिए और खुद के लिए एक रीडायरेक्ट कर रहा है वास्तव में एक ही काम को दो बार करने के लिए समाप्त होता है।

इसके बजाय, आप कनेक्शन जिंदा रखना होगा, जिनमें आप केवल एक छोटे से बैंडविड्थ की बचत होगी, लेकिन क्या यह निश्चित रूप से बचत होगी विलंबता एक नया कनेक्शन हर बार की स्थापना की है। एक टीसीपी/आईपी कनेक्शन स्थापित करना महंगा है।

आपको अपनी सेवा प्राप्त करने वाले समवर्ती कनेक्शन की संख्या के बराबर अनजान सेवा के लिए कई जीवित कनेक्शनों से दूर रहना चाहिए।

आप इन कनेक्शनों को पूल में प्रबंधित कर सकते हैं। यह सबसे नज़दीकी है जो आप प्राप्त कर सकते हैं। tweaking your kernel के टीसीपी/आईपी स्टैक के बगल में।

+0

जानकारी के लिए बहुत बढ़िया धन्यवाद। मैं वर्तमान में पेड्रो लोरेरो उत्तर का उपयोग करने जा रहा हूं क्योंकि यह समय के लिए काम कर रहा है। लेकिन अगर मैं किसी भी समस्या में भाग लेता हूं तो मैं इसे वापस देखूंगा। बहुत सराहना की। – brandonmat

0

मैं इसे यहाँ दोहराने सकता है, लेकिन यह शायद बेहतर गोता में अजगर से एक पृष्ठ पर बात करने के लिए, के बारे में handling redirects सब , जो वही है जो आप यहां करना चाहते हैं।

10

अनुरोध पुस्तकालय और हाँ का उपयोग करके एक पंक्ति कार्य, यह रिकर्सन का समर्थन करता है।

def unshorten_url(url): 
    return requests.head(url, allow_redirects=True).url 
+0

के साथ काम करता है मुझे लगता है कि यह उत्तर सबसे अधिक वोट किए गए उत्तर से भी बेहतर है। Fb.net से urls के साथ प्रयास करें और यह सही यूआरएल देता है जबकि दूसरा कुछ भी नहीं करता है। – lenhhoxung

+0

यह एक लाइनर है और पूरी तरह से काम करता है। शायद सबसे अच्छा जवाब। – Aventinus

1

यहाँ एक स्रोत कोड है कि उपयोगी कोने मामलों की लगभग ध्यान में रखता है:

  • एक कस्टम समय समाप्त निर्धारित किया है।
  • एक कस्टम उपयोगकर्ता एजेंट सेट करें।
  • जांचें कि हमें http या https कनेक्शन का उपयोग करना है या नहीं।
  • इनपुट यूआरएल को दोबारा हल करें और लूप के भीतर समाप्त होने से रोकें।

src कोड GitHub @https://github.com/amirkrifa/UnShortenUrl

टिप्पणियों का स्वागत है पर है ...

import logging 
logging.basicConfig(level=logging.DEBUG) 

TIMEOUT = 10 
class UnShortenUrl: 
    def process(self, url, previous_url=None): 
     logging.info('Init url: %s'%url) 
     import urlparse 
     import httplib 
     try: 
      parsed = urlparse.urlparse(url) 
      if parsed.scheme == 'https': 
       h = httplib.HTTPSConnection(parsed.netloc, timeout=TIMEOUT) 
      else: 
       h = httplib.HTTPConnection(parsed.netloc, timeout=TIMEOUT) 
      resource = parsed.path 
      if parsed.query != "": 
       resource += "?" + parsed.query 
      try: 
       h.request('HEAD', 
          resource, 
          headers={'User-Agent': 'curl/7.38.0'} 

         ) 
       response = h.getresponse() 
      except: 
       import traceback 
       traceback.print_exec() 
       return url 
      logging.info('Response status: %d'%response.status) 
      if response.status/100 == 3 and response.getheader('Location'): 
       red_url = response.getheader('Location') 
       logging.info('Red, previous: %s, %s'%(red_url, previous_url)) 
       if red_url == previous_url: 
        return red_url 
       return self.process(red_url, previous_url=url) 
      else: 
       return url 
     except: 
      import traceback 
      traceback.print_exc() 
      return None 
संबंधित मुद्दे

 संबंधित मुद्दे