2011-04-20 3 views
2

한다고 가정 내가 웹 페이지 bruteforce 할 많은 웹 페이지에서 텍스트를 찾을 수 있습니다 : 예를 들어C++ 또는 파이썬 :을 bruteforce는

http://www.example.com/index.php?id= < 1-99999> 및 특정 텍스트가 포함 된 경우 찾기 위해 각 페이지를 검색 할 수 있습니다. 페이지에 텍스트가 포함되어 있으면 문자열에 저장하십시오.

저는 파이썬에서 작동하도록하는데 꽤 느립니다 (페이지 당 약 1-2 초가 걸리는데 약 24 시간이 소요될 것입니다) 더 나은 해결책이 있습니까? 나는 파이썬이 매우 효율적이지 않다고 들었 기 때문에 C/C++을 사용할 생각이다. 그러나, 두 번째 생각 후에, 나는 python의 효율성이 아니라 html 요소에 접근하는 효율성 (전체 HTML을 텍스트로 변경 한 다음 검색 ... 콘텐츠가 상당히 길다는 것)이 될 수도 있다고 생각합니다.

그래서 bruteforcing의 속도를 어떻게 향상시킬 수 있습니까?

+1

코드를 게시하십시오. – Sylverdrag

+2

오버 헤드가 처음에 데이터를 검색하는 것이 아닙니다. 대부분의 사이트는로드하는 데 1 ~ 2 초가 걸립니다. Python은 충분히 빠르게 작업해야합니다. – Adam

+0

psyco를 사용해 보셨습니까? –

답변

6

대부분의 경우 사용자의 문제는 HTML을 빠르게 구문 분석하고 순차적 인 작업에서 페이지 검색 및 차단의 지연과 관련된 모든 기능과 관련이 없습니다.

1-2 초는 페이지를 검색하는 데 알맞은 시간입니다. 페이지 순서의 텍스트를 빠르게 찾을 수 있어야합니다. 그러나 한 번에 한 페이지 씩 처리하는 경우 결과를 찾을 수있는 동안 웹 서버의 응답을 기다리지 못하게 차단됩니다. 대신 작업자 프로세스를 통해 한 번에 여러 페이지를 가져 와서 출력 만 대기 할 수 있습니다.

다음 코드는 문제를 좀더 자세히 해결하기 위해 Python's multiprocessing docs에서 수정되었습니다.

import urllib 
from multiprocessing import Process, Queue 

def worker(input, output): 
    for func, args in iter(input.get, 'STOP'): 
    result = func(*args) 
    output.put(result) 

def find_on_page(num): 
    uri = 'http://www.example.com/index.php?id=%d' % num 
    f = urllib.urlopen(uri) 
    data = f.read() 
    f.close() 
    index = data.find('datahere:') # obviously use your own methods 
    if index < 0: 
    return None 
    else: 
    return data[index:index+20] 

def main(): 
    NUM_PROCESSES = 4 
    tasks = [(find_on_page, (i,)) for i in range(99999)] 
    task_queue = Queue() 
    done_queue = Queue() 
    for task in tasks: 
    task_queue.put(task) 
    for i in range(NUM_PROCESSES): 
    Process(target=worker, args=(task_queue, done_queue)).start() 
    for i in range(99999): 
    print done_queue.get() 
    for i in range(NUM_PROCESSES): 
    task_queue.put('STOP') 

if __name__ == "__main__": 
    main() 
+0

오,하지만 제 문제를 해결할 수 있다고 생각합니다. 다중 처리 된 것으로 생각합니다. 처음에,하지만 당신이 말한 것을 듣고 난 생각을 바꿔야 만합니다. – biloon

+1

파이썬 3.2에서 새로운'concurrent.futures' 모듈을 사용하는 것이 더 쉬울 수도 있습니다 (개념은 여기에있는 것과 같을 것입니다. fiddly 세부 정보를 자동으로 처리하십시오. – ncoghlan

+1

대역폭이 있더라도 웹 서버가 높은 빈도로 여러 페이지를 제공하게되어 기쁘지 않을 수도 있습니다. 이것은 DOS 공격 시도로 해석 될 수 있습니다. –

4

구문 분석 부분이 HTTP 요청 및 응답 트랜잭션이 아닌 알고리즘의 병목 현상이라고 분석 했습니까?

저는 C/C++을 제공하는 효율성의 종류가 여기에서 찾고있는 것이라고 생각하지 않습니다.

+0

그래서 어떤 속도를 잃지 않고 html의 특정 부분을 구문 분석합니까? 나는 Beautiful Soup을 시도했지만 올바른 태그를 찾고 나서 안에 무엇이 있는지 검색하고 있습니다. 가능한 경우, 특정 회선 번호에서 운영자 검색을 시작하고 싶습니다만, 나는 아직 그것을 읽지 못했지만 어떻게해야합니까? – biloon