2013-07-17 3 views
1

urllib2와 BeautifulSoup를 사용하여 웹 페이지를 긁어 내려고했습니다. 그것은 잘 작동했다 그리고 뭔가를 시도하고 디버깅하려면 내 코드의 다른 부분에 input() 넣을 때 HTTPError 있어요. 프로그램을 다시 실행하려고하면 read()를 호출 할 때 HTTPError가 발생합니다. 여기urllib2를 사용할 때 HTTPError가 발생했습니다. read()

[2013-07-17 16:47:07,415: ERROR/MainProcess] Task program.tasks.testTask[460db7cf-ff58-4a51-9c0f-749affc66abb] raised exception: IOError() 
16:47:07 celeryd.1 | Traceback (most recent call last): 
16:47:07 celeryd.1 | File "/Users/username/folder/server2/venv/lib/python2.7/site-packages/celery/execute/trace.py", line 181, in trace_task 
16:47:07 celeryd.1 |  R = retval = fun(*args, **kwargs) 
16:47:07 celeryd.1 | File "/Users/username/folder/server2/program/tasks.py", line 193, in run 
16:47:07 celeryd.1 |  self.get_top_itunes_game_by_genre(genre) 
16:47:07 celeryd.1 | File "/Users/username/folder/server2/program/tasks.py", line 244, in get_top_itunes_game_by_genre 
16:47:07 celeryd.1 |  game_page = BeautifulSoup(urllib2.urlopen(game_url).read()) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen 
16:47:07 celeryd.1 |  return _opener.open(url, data, timeout) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open 
16:47:07 celeryd.1 |  response = meth(req, response) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 
16:47:07 celeryd.1 |  'http', request, response, code, msg, hdrs) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error 
16:47:07 celeryd.1 |  return self._call_chain(*args) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain 
16:47:07 celeryd.1 |  result = func(*args) 
16:47:07 celeryd.1 | File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default 
16:47:07 celeryd.1 |  raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
16:47:07 celeryd.1 | HTTPError 

코드입니다 : 오류 스택은 다음과 같습니다

for game_url in urls:  
    game_page = BeautifulSoup(urllib2.urlopen(game_url).read()) 
    # code to process page 
나는이 오류를 받기 시작하는 이유

사람이 알고 있나요? 감사!

+1

일반적으로 네트워크 수준 또는 서버 측에서 오류가 발생하면'HTTPError'가 반환됩니다. 브라우저에서 여는 URL을 열어보고 브라우저에서 작동하는지 확인하십시오. – Amber

+0

urllib2는 조만간 (아마도 40 배 응답) 약간의 오류를 던질 것이므로 아마도 잡을 준비가되어 있어야합니다. – roippi

+0

은 페이지가 일부 이유로로드되지 않는 것처럼 보이는데 이는 문제입니다. – user1998511

답변

1

대답에 내 의견을 변경 : 그것이 the docs에 난데으로

당신이 4XX 응답 (대부분), 및 urllib2가로 응답 근근이 살아가고있는 페이지는 HTTPError를 발생시킵니다. 그 예외를 잡아서 (잘하면) 그것으로 무언가를하고, 기록하거나, 무엇을 가지고 있는지 당신의 직업입니다. 어떤 이유로 든 추적 오류가 HTTPError의 코드/이유를 표시하지는 않지만 거기에 있습니다. 오류의 '코드'및 '이유'속성을 확인하십시오.

편집 : 당신이 긁어 모으는 웹 사이트가 당신이 로봇이라는 것을 알아낼 가능성이 있습니다. 좀 더 서버 친화적 인 (그리고 훨씬 우수한 API) 라이브러리를 사용하기 위해 스크래퍼를 다시 작성하는 것이 좋습니다. urllib2는 일회성 작업에는 문제가 없지만 여기서는 다루지 않을 많은 단점이 있습니다. 살펴볼 수있는 우수한 라이브러리는 requests, mechanize, 아마도 httplib2입니다. 모두는 위/아래를 가지고 있으므로 귀하의 필요에 맞는 것을 말할 수는 없습니다.

당신이 요청할 때 어떤 사용자 에이전트 헤더를 보길 원할 것입니다. 왜냐하면 만약 당신이 로봇으로 스스로 식별한다면 잘합니다. 네.

+0

방금 ​​내가 열어 볼 수있는 많은 웹 사이트를 읽고 싶다면? – user1998511

+0

은 요청으로 시작하며 가장 합리적인 API를 가지고 있습니다. – roippi

+0

끝내 주셔서 고마워요! – user1998511