2009-06-12 14 views
48

urllib.urlretrieve रिटर्न चुपचाप भले ही फ़ाइल दूरस्थ http सर्वर पर मौजूद नहीं है, यह सिर्फ नाम की फ़ाइल के लिए एक html पृष्ठ बचाता है। उदाहरण के लिए:कैसे पता चलेगा कि urllib.urlretrieve सफल होता है?

urllib.urlretrieve('http://google.com/abc.jpg', 'abc.jpg') 

बस चुपचाप देता है, भले ही abc.jpg google.com सर्वर पर मौजूद नहीं है, उत्पन्न abc.jpg एक वैध jpg फ़ाइल नहीं है, यह वास्तव में एक html पृष्ठ है। मैं वापस आए हेडर (एक httplib.HTTPMessage उदाहरण) वास्तव में है कि क्या पुनर्प्राप्ति सफलताओं या नहीं बताने के लिए इस्तेमाल किया जा सकता है लगता है, लेकिन मैं httplib.HTTPMessage के लिए किसी भी दस्तावेज़ को नहीं मिल रहा।

किसी को भी इस समस्या के बारे में कुछ जानकारी दे सकते हैं?

a, b=urllib.urlretrieve('http://google.com/abc.jpg', r'c:\abc.jpg') 

ख संदेश उदाहरण

के बाद से मुझे लगता है कि सीखा है है:

उत्तर

22

urllib2 का उपयोग करने पर विचार करें यदि यह आपके मामले में संभव है। यह urllib से अधिक उन्नत और उपयोग करने में आसान है।

आप किसी HTTP त्रुटियों को आसानी से पता लगा सकते हैं:

>>> import urllib2 
>>> resp = urllib2.urlopen("http://google.com/abc.jpg") 
Traceback (most recent call last): 
<<MANY LINES SKIPPED>> 
urllib2.HTTPError: HTTP Error 404: Not Found 

resp वास्तव में है HTTPResponse उद्देश्य यह है कि आप के साथ उपयोगी बहुत कुछ कर सकते हैं: मैं अपने खुद के retrieve कार्यान्वयन के साथ समाप्त हो गया

>>> resp = urllib2.urlopen("http://google.com/") 
>>> resp.code 
200 
>>> resp.headers["content-type"] 
'text/html; charset=windows-1251' 
>>> resp.read() 
"<<ACTUAL HTML>>" 
+6

क्या urllib2 urlretrieve के कैशिंग व्यवहार प्रदान कर सकता है? या क्या हमें इसे फिर से लागू करना होगा? – Kiv

+0

एक्टिवस्टेट से इस अवेरोम रेसिपी को देखें: http://code.activestate.com/recipes/491261/ हम इसे अपने वर्तमान प्रोजेक्ट में उपयोग कर रहे हैं, बेकार ढंग से काम करता है –

+1

urlopen एक हुक फ़ंक्शन प्रदान नहीं करता है (प्रगति पट्टी दिखाने के लिए उदाहरण) urlretrieve की तरह। –

2

प्रलेखन के अनुसार किया जाता है undocumented

ऐसा लगता है कि जैसे कुछ करने लग रहा है संदेश तक पहुँच प्राप्त करने के लिए है अजगर यह हमेशा आत्मविश्लेषी होने के लिए अजगर की क्षमता का उपयोग करने के जब मैं टाइप

dir(b) 
उपयोगी है

मैं तरीकों या कार्यों के बहुत सारे

और फिर साथ खेलने के लिए मैं ख के साथ काम करने

उदाहरण के लिए

b.items() 

दिलचस्प बातें की सूची बहुत सारे, मुझे लगता है कि के साथ प्रयोग करना शुरू कर दिया देखना ये चीजें आपको उस विशेषता को प्राप्त करने की अनुमति देगी, जिसे आप कुशल बनाना चाहते हैं।

क्षमा करें यह इस तरह के एक शुरुआत का जवाब है, लेकिन मैं कैसे सुधार करने के लिए मेरे सीखने और आपके सवालों बस पॉप आत्मनिरीक्षण क्षमताओं का उपयोग करने के लिए गुरु की कोशिश कर रहा हूँ।

खैर मैं कुछ दिलचस्प संबंधित की कोशिश की इस-मैं करने के लिए करता है, तो मैं अपने आप चीजों की प्रत्येक कि निर्देशिका में दिखाया से उत्पादन है कि मानकों की ज़रूरत नहीं थी इसलिए मैंने लिखा मिल सकता है सोच रहा था:

needparam=[] 
for each in dir(b): 
    x='b.'+each+'()' 
    try: 
     eval(x) 
     print x 
    except: 
     needparam.append(x) 
+0

मेरे लिए कोई स्थिति नहीं है, और आपका कोड केवल एक बार काम करता है। 'के लिए बी के लिए प्रयास करें: प्रिंट करें"% s:% r "% (के, बी [के])' –

1

, pycurl की मदद से यह urllib/urllib2 की तुलना में अधिक प्रोटोकॉल का समर्थन करता है, आशा है कि यह अन्य लोगों की मदद कर सकते हैं।

import tempfile 
import pycurl 
import os 

def get_filename_parts_from_url(url): 
    fullname = url.split('/')[-1].split('#')[0].split('?')[0] 
    t = list(os.path.splitext(fullname)) 
    if t[1]: 
     t[1] = t[1][1:] 
    return t 

def retrieve(url, filename=None): 
    if not filename: 
     garbage, suffix = get_filename_parts_from_url(url) 
     f = tempfile.NamedTemporaryFile(suffix = '.' + suffix, delete=False) 
     filename = f.name 
    else: 
     f = open(filename, 'wb') 
    c = pycurl.Curl() 
    c.setopt(pycurl.URL, str(url)) 
    c.setopt(pycurl.WRITEFUNCTION, f.write) 
    try: 
     c.perform() 
    except: 
     filename = None 
    finally: 
     c.close() 
     f.close() 
    return filename 
2

आप एक नया URLopener बना सकते हैं (FancyURLopener से विरासत) और अपवाद फेंक या त्रुटियों जैसे चाहें वैसे संभाल। दुर्भाग्य से, FancyURLopener 404 और अन्य त्रुटियों को अनदेखा करता है।

How to catch 404 error in urllib.urlretrieve

6

मैं इसे सरल रखने:: इस सवाल देखें

# Simple downloading with progress indicator, by Cees Timmerman, 16mar12. 

import urllib2 

remote = r"http://some.big.file" 
local = r"c:\downloads\bigfile.dat" 

u = urllib2.urlopen(remote) 
h = u.info() 
totalSize = int(h["Content-Length"]) 

print "Downloading %s bytes..." % totalSize, 
fp = open(local, 'wb') 

blockSize = 8192 #100000 # urllib.urlretrieve uses 8192 
count = 0 
while True: 
    chunk = u.read(blockSize) 
    if not chunk: break 
    fp.write(chunk) 
    count += 1 
    if totalSize > 0: 
     percent = int(count * blockSize * 100/totalSize) 
     if percent > 100: percent = 100 
     print "%2d%%" % percent, 
     if percent < 100: 
      print "\b\b\b\b\b", # Erase "NN% " 
     else: 
      print "Done." 

fp.flush() 
fp.close() 
if not totalSize: 
    print 
+0

एक बेहतर विचार 'shutil.copyfileobj' है। – lericson

+1

कैसे, लेरिक्सन? –

0
class MyURLopener(urllib.FancyURLopener): 
    http_error_default = urllib.URLopener.http_error_default 

url = "http://page404.com" 
filename = "download.txt" 
def reporthook(blockcount, blocksize, totalsize): 
    pass 
    ... 

try: 
    (f,headers)=MyURLopener().retrieve(url, filename, reporthook) 
except Exception, e: 
    print e 
0

:) StackOverflow पर मेरी पहली पोस्ट है, साल के लिए एक lurker किया गया है। :)

दुर्भाग्य से dir (urllib.urlretrieve) उपयोगी जानकारी में कमी है।

a,b = urllib.urlretrieve(imgURL, saveTo) 
print "A:", a 
print "B:", b 

जो इस उत्पादित:

A: /home/myuser/targetfile.gif 
B: Accept-Ranges: bytes 
Access-Control-Allow-Origin: * 
Cache-Control: max-age=604800 
Content-Type: image/gif 
Date: Mon, 07 Mar 2016 23:37:34 GMT 
Etag: "4e1a5d9cc0857184df682518b9b0da33" 
Last-Modified: Sun, 06 Mar 2016 21:16:48 GMT 
Server: ECS (hnd/057A) 
Timing-Allow-Origin: * 
X-Cache: HIT 
Content-Length: 27027 
Connection: close 

मुझे लगता है कि एक जाँच कर सकते हैं:

if b.Content-Length > 0: 

मेरे अगले कदम के एक परीक्षण करने के लिए है तो इस धागे से अब तक मैं इस लेखन की कोशिश की परिदृश्य जहां पुनर्प्राप्ति विफल हो जाती है ...

+0

b.getheader ('सामग्री-लंबाई') आमतौर पर 404 पर भी 0 से अधिक होगा (यदि फ़ाइल मौजूद नहीं है) –

0

किसी अन्य सर्वर/वेबसाइट के विरुद्ध परिणाम - क्या 'बी' में वापस आता है एक सा यादृच्छिक है, लेकिन एक निश्चित मूल्यों के लिए परीक्षण कर सकते हैं:

A: get_good.jpg 
B: Date: Tue, 08 Mar 2016 00:44:19 GMT 
Server: Apache 
Last-Modified: Sat, 02 Jan 2016 09:17:21 GMT 
ETag: "524cf9-18afe-528565aef9ef0" 
Accept-Ranges: bytes 
Content-Length: 101118 
Connection: close 
Content-Type: image/jpeg 

A: get_bad.jpg 
B: Date: Tue, 08 Mar 2016 00:44:20 GMT 
Server: Apache 
Content-Length: 1363 
X-Frame-Options: deny 
Connection: close 
Content-Type: text/html 

'बुरे' मामले में (गैर मौजूदा छवि फ़ाइल) 'बी' (Googlebot का एक छोटा सा हिस्सा लिया गया?) एचटीएमएल कोड और इसे लक्ष्य के रूप में सहेजा, इसलिए 1363 बाइट्स की सामग्री-लंबाई।

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