2010-06-12 6 views
10

urllib2urlopen 함수를 사용하여 StackOverflow API에서 JSON 결과를 얻으려고합니다.일부 사이트에서 Urlliben이 깨졌습니다 (예 : StackApps API) : 가비지 결과가 반환됩니다.

내가 사용하고 코드 :

>>> import urllib2 
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/") 
>>> conn.readline() 

결과 내가 갖는 :

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\... 

내가 URLLIB 상당히 새로운 해요,하지만이 결과가 아닌 것 같아 I 가야 해. 나는 다른 장소에서 그것을 시도하고 내가 기대하는 것을 얻는다. (브라우저로 주소를 방문하는 것은 나에게 준다 : JSON 객체).

다른 사이트에서 urlopen을 사용하면 (예 : "http://google.com") 정상적으로 작동하며 실제 html을 제공합니다. 또한 urllib을 사용해 보았는데 동일한 결과가 나타납니다.

나는이 문제를 해결하기 위해 어디를 봐야할지 모르겠다. 어떤 아이디어?

+1

감사합니다. 이것은 내 자신의 API 애플 리케이션을 디버그하는 데 도움이되었습니다 :) – swanson

답변

10

피클에 먹이를주는 것처럼 보입니다. 어쩌면 urllib2가 보내는 User-Agent 문자열 또는 Accepts 헤더의 일부가 StackOverflow가 JSON이 아닌 다른 것을 보내 게 할 수 있습니다.

하나의 안내문은 conn.headers.headers에서 Content-Type 헤더의 내용을 확인하는 것입니다.

이 질문 (Odd String Format Result from API Call)에 대한 답변이있을 수 있습니다. 기본적으로 gzip 압축 해 제기를 통해 결과를 실행해야 할 수도 있습니다. 이 코드

두 번 검사 :

>>> req = urllib2.Request("http://api.stackoverflow.com/0.8/users/", 
          headers={'Accept-Encoding': 'gzip, identity'}) 
>>> conn = urllib2.urlopen(req) 
>>> val = conn.read() 
>>> conn.close() 
>>> val[0:25] 
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ' 

예, 당신은 확실히 gzip으로 인코딩 된 데이터를 다시 얻고있다.

동일한 버전의 Python을 사용하는 다른 컴퓨터에서 결과가 달라지는 것 같고 일반적으로 urllib2 API에서 gzip 인코딩 된 데이터를 요청하기 위해 특별한 작업을 수행해야하는 것처럼 보입니다. 거기에 투명 프록시.

2009 년 CodeCon에서 EFF가 발표 한 내용을 보았습니다. 그들은 다양한 종류의 ISP 트릭을 발견하기 위해 종단 간 연결 테스트를 수행하고있었습니다. 이 테스트를 수행하는 동안 발견 한 사항 중 하나는 놀라운 수준의 소비자 수준의 NAT 라우터가 임의의 HTTP 헤더를 추가하거나 투명한 프록시를 수행한다는 것입니다. 연결을 더 빠르게 보이게하려면 네트워크에 Accept-Encoding 헤더를 추가하거나 수정하는 일부 장비가있을 수 있습니다.

+0

흠, 그건 의미가 있습니다. 왜 이것이 다른 컴퓨터에서 (파이썬의 같은 버전을 실행하는) 다른 것일까? –

+1

@Edan Maor : 잘 모르겠습니다. 이상하게 보입니다. – Omnifarious

+0

그래, 방금 내 시스템을 점검했는데 그게 분명히 문제가되었다. (나는 http://diveintopython.org/http_web_services/gzip_compression.html에있는 가이드를 사용하여 압축을 풀었다.) 아직도 다른 개발자가 여기에서 잘 작동하고 래퍼 작성자도 잘 작동하기 때문에 왜 이런 현상이 발생하는지 알 수 없습니다. –

관련 문제