2016-04-03 64 views
0

我真的很困惑,新来的Python和我正在研究一个脚本,在Python27上的产品刮伤网站。我试图使用urllib2来做到这一点,当我运行脚本时,它会打印多个追溯错误。建议?Python跟踪错误使用urllib2

脚本:

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' 

错误(S):

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

它似乎在这里运行良好。没有错误。 – jDo

+0

@jDo,你在Python 2.7? – rated

+0

这发生在'HTTPS'网站上,并且表明您的计算机的SSL软件可能已过时,或者服务器请求了您没有的内容,如SSL证书。如果不使用'urllib',而是使用['requests'](http://docs.python-requests.org/en/master/),这会带来更好的全面支持所有这些问题都是行业标准。 –

回答

3

你快与你的要求的SSL配置问题。我很抱歉,但我不会纠正你的代码,因为我们是在2016年,并有一个美好的库,你应该使用:requests

因此它的用法很简单:

>>> 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', … 

你会发现,我改变了用户代理在前面的查询到有工作,因为古怪的是,该网站拒绝requests API访问:

>>> 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. 

否则,现在您已经尝试requests并且您的生活发生了变化,您可能仍然会遇到此问题。正如你可能从互联网上的很多地方读到的,这与SNI and outdated libraries有关,你可能会很头痛,试图解决这个问题。我最好的建议是升级到Python3,因为问题可能通过安装一个新的python版本和相关的库来解决。

HTH

+0

请注意,仅仅切换到'requests'还不够:您仍然可以获得SSL错误。通常,这是由[SNI问题](https://github.com/kennethreitz/requests/issues/2022)造成的,并且可以按照其中的说明轻松解决。 –

+0

是的,我正要提出这一点,但我需要在发布前多做一点google-fu☺ – zmo

+0

将其转换为请求!所以在这样做时,回溯错误将消失? @zmo – rated