2011-12-20 2 views
3

일부 URL을 기반으로 웹 사이트에서 일부 웹 페이지를 다운로드하는 크롤러를 파이썬에 작성했습니다. 나는 때때로이 프로그램이 "conn.getresponse()"에 멈추는 것을 보았다. 예외는 발생하지 않았으며 프로그램은 그곳에서 영원히 기다렸습니다.conn.getresponse() (httplib.HTTPConnection)에 매달린 것을 피하십시오.

conn = httplib.HTTPConnection(component.netloc) 
conn.request("GET", component.path + "?" + component.query) 
resp = conn.getresponse() #hang here 

나는은 API 문서를 읽고는 (시간 제한을 추가하는) 것을 말한다 :

conn = httplib.HTTPConnection(component.netloc, timeout=10) 

그러나, 그것은 나에게 연결을 "다시 시도"할 수 없습니다. 시간 초과 후 크롤링을 다시 시도하는 가장 좋은 방법은 무엇입니까?

예를 들어, 나는 다음과 같은 솔루션을 생각 해요 :

trials = 3 
while trials > 0: 
    try: 
     ... code here ... 
    except: 
     trials -= 1 

암 I을 올바른 방향으로?

+0

때로는 파이썬 라이브러리가 웹 브라우저와 다른 헤더를 해석하는 경우가 있습니다 ([이 질문] (http://stackoverflow.com/q/8527862/183066) 에서처럼). 따라서 웹 브라우저에서 동일한 URL을 열어 볼 수 있다고 생각합니다. – jcollado

답변

1

그러나 연결을 "다시 시도"할 수 없습니다.

예, 제한 시간은 해당 정책이 속한 곳 (코드에서 httplib 제외)으로이 정책을 다시 푸시하도록 설계되었습니다.

시간 초과 후 크롤링을 다시 시도하는 것이 가장 좋은 방법은 무엇입니까?

매우 응용 프로그램에 따라 다릅니다. 크롤러가 다른 작업을 연기하는 데 얼마나 걸릴 수 있습니까? 얼마나 심하게 각 사이트에 깊이 들어가기를 원하십니까? 느리고 과다 가입 한 서버를 견딜 수 있어야합니까? 크롤러를 만났을 때 스로틀 또는 기타 대책이있는 서버는 어떻습니까? 내가 묻는 동안 robots.txt을 존중합니까?

이러한 질문에 대한 답변은 매우 다양하므로 크롤러의 요구, 추세가있는 사이트 (추세가 있다고 가정) 및 WAN 성능에 맞게 조정해야합니다.

관련 문제