2011-04-21 2 views
2

URL이 많이 있는지 (약 1 천만 개) 있는지 확인해야합니다 (200 개 반환). 이 per-URL을 수행하기 위해 다음 코드를 작성했지만 모든 URL을 수행하는 데는 거의 시간이 걸립니다.URL이 많으면 200을 반환하는지 확인합니다. 가장 명확한 방법은 무엇입니까?

def is_200(url):    
    try: 
     parsed = urlparse(url) 
     conn = httplib.HTTPConnection(parsed.netloc) 
     conn.request("HEAD", parsed.path) 
     res = conn.getresponse() 
     return res.status == 200 
    except KeyboardInterrupt, e: 
     raise e 
    except: 
     return False 

URL은 약 다스 호스트에 분산, 그래서 파이프 라인 내 요청이 활용 및 연결 오버 헤드를 줄일 수있을 것처럼 보인다된다. 어떻게 지을거야? 나는 프로그래밍/스크립팅 언어에 열려 있습니다.

+1

비동기 입출력을 처리 할 때 node.js가 도움이 될 수도 있습니다. 또한 가능한 경우이를 위해 컴퓨터 클러스터를 사용할 수 있습니다. – Thilo

답변

2

urllib3을 살펴보십시오. 호스트 별 연결 재사용을 지원합니다. 또한 여러 프로세스/스레드 또는 비동기 I/O를 사용하는 것이 좋습니다.

+0

링크를 제공해 주셔서 감사합니다. urllib3는 좋아 보인다. –

2

이 모든 것은 Python 버전 3.x에 있습니다.

200을 확인하는 작업자 스레드를 만들 것입니다. 예제를 제공합니다. (threadpool.py에 넣어)이 스레드는이 프로그램에 따라 확장하는 것이

numconns = 40 
workers = threadpool.ThreadPool(numconns) 
results = [None] * len(urllist) 

def check200(url, index): 
    results[index] = is_200(url) 

for index, url in enumerate(urllist): 
    try: 
     workers.add_task(check200, url, index) 

    except KeyboardInterrupt: 
     print("Shutting down application, hang on...") 
     workers.wait_completion() 

     break 

참고 : urllist이 URL을 포함하는 경우

# http://code.activestate.com/recipes/577187-python-thread-pool/ 

from queue import Queue 
from threading import Thread 

class Worker(Thread): 
    def __init__(self, tasks): 
     Thread.__init__(self) 
     self.tasks = tasks 
     self.daemon = True 
     self.start() 

    def run(self): 
     while True: 
      func, args, kargs = self.tasks.get() 
      try: func(*args, **kargs) 
      except Exception as exception: print(exception) 
      self.tasks.task_done() 

class ThreadPool: 
    def __init__(self, num_threads): 
     self.tasks = Queue(num_threads) 
     for _ in range(num_threads): Worker(self.tasks) 

    def add_task(self, func, *args, **kargs): 
     self.tasks.put((func, args, kargs)) 

    def wait_completion(self): 
     self.tasks.join() 

이제 다음 주 파일이의 라인을 따라해야 여기에 게시 된 다른 제안 사항은 is_200()에만 의존합니다.

+1

스레드 풀 구현 주셔서 감사합니다. 불행하게도이 시스템에서는 python 2.5로 제한되어 있습니다. 처음에는 답을 찾지 못했지만 한 가져 오기를'From Queue import Queue'로 변경하고'self.setDaemon '을 사용하면 코드가 2.5에서 잘 작동합니다 (참)'을 생성합니다. –

관련 문제