2016-04-03 33 views
0

Python27 için yeni bir web sitesi çizen bir komut dosyası üzerinde çalışıyorum. Bunu yapmak için urllib2 kullanmaya çalışıyorum ve komut dosyasını çalıştırdığımda birden çok geri izleme hatası yazdırıyor. Öneriler?urllib2 kullanarak Python traceback hatası

Senaryo:

import urllib2, zlib, json 

url='https://launches.endclothing.com/api/products' 
req = urllib2.Request(url) 
req.add_header(':host','launches.endclothing.com');req.add_header(':method','GET');req.add_header(':path','/api/products');req.add_header(':scheme','https');req.add_header(':version','HTTP/1.1');req.add_header('accept','application/json, text/plain, */*');req.add_header('accept-encoding','gzip,deflate');req.add_header('accept-language','en-US,en;q=0.8');req.add_header('cache-control','max-age=0');req.add_header('cookie','__/');req.add_header('user-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/37.0.2062.120 Chrome/37.0.2062.120 Safari/537.36'); 
resp = urllib2.urlopen(req).read() 
resp = zlib.decompress(bytes(bytearray(resp)),15+32) 
data = json.loads(resp) 
for product in data: 
    for attrib in product.keys(): 
     print str(attrib)+' :: '+ str(product[attrib]) 
    print '\n' 

Hata (lar):

C:\Users\Luke>py C:\Users\Luke\Documents\EndBot2.py 
Traceback (most recent call last): 
    File "C:\Users\Luke\Documents\EndBot2.py", line 5, in <module> 
    resp = urllib2.urlopen(req).read() 
    File "C:\Python27\lib\urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python27\lib\urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "C:\Python27\lib\urllib2.py", line 409, in _open 
    '_open', req) 
    File "C:\Python27\lib\urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "C:\Python27\lib\urllib2.py", line 1181, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "C:\Python27\lib\urllib2.py", line 1148, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 1] _ssl.c:499: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error> 
+2

Burada iyi görünüyor. Hata yok. – jDo

+0

@jDo ve Python 2.7 üzerinde misiniz? – rated

+0

Bu, HTTPS siteleriyle olur ve bilgisayarınızın SSL yazılımının güncelliğini yitirebileceğini veya sunucunun SSL sertifikası gibi sahip olmadığınız bir şeyi istediğini gösterir. Bu sorunların çoğu, 'urllib' yerine, daha iyi bir çözüm sunan ['request'] (http://docs.python-requests.org/en/master/) kullanırsanız ortadan kalkar. Tüm bu konular için ve endüstri standardıdır. –

cevap

3

İsteğinizin SSL yapılandırmasıyla sorunlar yaşamaya devam edip. Üzgünüm, ama biz 2016 yılında olduğun için, kodunuzu düzeltmez ve bunun yerine kullanması gereken harika bir kütüphane var: requests

Yani kullanım oldukça basittir:

>>> user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1' 
>>> result = requests.get('https://launches.endclothing.com/api/products', headers={'user-agent': user_agent}) 
>>> result 
<Response [200]> 
>>> result.json() 
[{u'name': u'Adidas Consortium x HighSnobiety Ultraboost', u'colour': u'Grey', u'id': 30, u'releaseDate': u'2016-04-09T00:01:00+0100', … 

Sen garip bir şekilde yeterli, çünkü web sitesi requests API erişimini reddediyor, çalışıyor olması önceki sorguda user-agent değiştiğini fark edeceksiniz:

>>> result = requests.get('https://launches.endclothing.com/api/products') 
>>> result 
<Response [403]> 
>>> result.text 
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.</p></div><div class="error-right"><h3>What can I do to resolve this?</h3><p>If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.</p><p>If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices. 

Aksi halde, şimdi requests'u denediniz ve hayatınız değişti, yine bu konuyla karşılaşabilirsiniz. İnternette birçok yerden okuyabileceğiniz gibi, bu SNI and outdated libraries ile ilgilidir ve bunu çözmeye çalışırken baş ağrısı olabilir. Python3'e yükseltme yapmak için en iyi tavsiyem olacaktır, çünkü problem pythonun yeni bir vanil versiyonunu ve ilgili lib'leri kurarak çözülecektir.

HTH

+0

Sadece 'isteklere' geçmenin yeterli olmadığını unutmayın: Hala bir SSL hatası alabilirsiniz. Genellikle buna, [SNI sorunları] neden olur (https://github.com/kennethreitz/requests/issues/2022) ve buradaki talimatları izleyerek kolayca çözülür. –

+0

yup Ben bu noktayı yükseltmek üzereydim, ama ben bunları göndermeden önce biraz daha google-fu yapmam gerekiyor ☺ – zmo

+0

Bunu isteklere dönüştürmek için gidiyor! Yani bunu yaparken, traceback hataları gider mi? @zmo – rated