2012-08-13 14 views
6

bir web madenciliği komut dosyasıdır.Tamamlanmamış Okunması, URLError

def printer(q,missing): 
    while 1: 
     tmpurl=q.get() 
     try: 
      image=urllib2.urlopen(tmpurl).read() 
     except httplib.HTTPException: 
      missing.put(tmpurl) 
      continue 
     wf=open(tmpurl[-35:]+".jpg","wb") 
     wf.write(image) 
     wf.close() 

q URL'lerin oluşan Queue() ve 'eksik 10 parçacığı ile paralel çalışan bir hata-yetiştirme-URL'lerin

toplamak için boş bir kuyruğudur.

ve bunu her çalıştırdığımda, bunu anladım.

File "C:\Python27\lib\socket.py", line 351, in read 
    data = self._sock.recv(rbufsize) 
    File "C:\Python27\lib\httplib.py", line 541, in read 
    return self._read_chunked(amt) 
    File "C:\Python27\lib\httplib.py", line 592, in _read_chunked 
    value.append(self._safe_read(amt)) 
    File "C:\Python27\lib\httplib.py", line 649, in _safe_read 
    raise IncompleteRead(''.join(s), amt) 
IncompleteRead: IncompleteRead(5274 bytes read, 2918 more expected) 

ama except kullanırım ... ben bile

httplib.IncompleteRead 
urllib2.URLError 

gibi başka bir şeyi denedik

image=urllib2.urlopen(tmpurl,timeout=999999).read() 

ama bunların hiçbiri çalışıyor

..

IncompleteRead ve URLError'u nasıl yakalarım? ?

+0

Biraz gecikti, ancak önce Google'a vurdu. Sooo, http://stackoverflow.com/a/14206036/1444854 sorunlarınızı çözmelidir. Bu arada, genellikle birden fazla istisna yakalamak istiyorsanız, bunları bir tuple yerleştirin: (httplib.IncompleteRead, urllib2.URLError) –

cevap

0

Bu sorunun doğru cevabı "hata veren URL" yi düşündüğünüze bağlı olduğunu düşünüyorum. alıcı birden istisnalar

ait

Yöntemleri Eğer bir istisna daha sonra yapabileceğiniz missing kuyruğuna eklenmelidir yükseltir herhangi bir URL'yi düşünüyorsanız:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except (httplib.HTTPException, httplib.IncompleteRead, urllib2.URLError): 
    missing.put(tmpurl) 
    continue 

Bu o üç istisna dışında herhangi yakalamak ve edecek URL'yi missing kuyruğuna ekleyin.

try: 
    image=urllib2.urlopen(tmpurl).read() 
except: 
    missing.put(tmpurl) 
    continue 

herhangi durum yakalamak için ama bu Pythonic kabul edilmez ve kodunuzda diğer olası hataları gizlemek olabilir: Daha basitçe yapabilirdi.

"hata yaratma URL" ye göre bir httplib.HTTPException hata yükseltir herhangi bir URL'yi demek ama hala işlemlerini tutmak isterseniz diğer hatalar daha sonra alınan eğer yapabilirsiniz:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except httplib.HTTPException: 
    missing.put(tmpurl) 
    continue 
except (httplib.IncompleteRead, urllib2.URLError): 
    continue 

Bu irade Bir URL'yi httplib.HTTPException yükseltir, ancak httplib.IncompleteRead ve urllib.URLError yakalar ve komut dosyanızın çökmesini engellerse, yalnızca URL'yi missing kuyruğuna ekleyin. Kuyruk Bir kenara

üzerinde

yineleme, while 1 döngüler bana hep ilişkin biraz bulunmaktadır. kesinlikle gerekli olmadığı sürece,

for tmpurl in iter(q, "STOP"): 
    # rest of your code goes here 
    pass 

güvenle kenara dosyaları

başka itibariyle

ile çalışan: bunu yolunuzu yapmaya devam özgürsünüz olsa Sen, şu kalıbı kullanarak Kuyruk içeriği arasında döngü gerekir Aksi halde, dosyaları açmak ve değiştirmek için context managers kullanmalısınız.Yani üç dosya işlem hatları olacaktı:

with open(tmpurl[-35:]+".jpg","wb") as wf: 
    wf.write() 

bağlam yöneticisi dosya kapama yapar ve dosyaya yazarken bir durum meydana gelse bile bunu yapacağız.