2016-04-03 6 views
0

私は本当にPythonを初めて使うと混乱しています。Python27で製品のWebサイトをスクラップするスクリプトを作成しています。私はこれを行うためにurllib2を使用しようとしており、スクリプトを実行するときに複数のトレースバックエラーが出力されます。提案?urllib2を使ったPythonのトレースバックエラー

スクリプト:

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' 

エラー(秒):

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/ja/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の新しいバニラバージョンと関連するlibsをインストールすることで解決される可能性が高いからです。

HTH

+0

単に 'requests'に切り替えるだけでは不十分だということに注意してください。まだSSLエラーが出る可能性があります。通常、これは[SNIの問題](https://github.com/kennethreitz/requests/issues/2022)によって発生し、そこの指示に従って簡単に解決されます。 –

+0

ええ、私はその点を上げようとしていましたが、投稿する前にもう少しgoogle-fuを作る必要がありました。☺ – zmo

+0

リクエストに変換しよう!だから、これを行うには、トレースバックのエラーは消えますか? @zmo – rated