2012-07-16 3 views
0

파이썬에서 3 단계 웹 스크래핑을 수행해야합니다. 나는 처음에 긁어 모으는 몇 개의 기본 페이지를 가지고 있으며, 나는 그 페이지들로부터 몇 개의 선택 링크를 얻고 그들이 가리키는 페이지를 가져와 다시 한 번 더 반복해야한다. 트릭은 모든 비동기 적으로이 작업을 수행하여 모든 요청이 가능한 한 빨리 종료되도록하고 전체 요청이 단일 요청에서 차단되지 않도록하려는 것입니다. 어떻게하면 좋을까요? 이 시점까지 Python에서 다단계 동시 HTTP 요청

, 나는 다음과 같이 eventlet로 긁어 한 단계를 해왔 :

urls = ['http://example.com', '...'] 
def scrape_page(url): 
    """Gets the data from the web page.""" 
    body = eventlet.green.urllib2.urlopen(url).read() 
    # Do something with body 
    return data 

pool = eventlet.GreenPool() 
for data in pool.imap(screen_scrape, urls): 
    # Handle the data... 

을 그러나, 나는이 기술을 확장하고 중첩 GreenPool.imap 루프를 포함하는 경우, 될 때까지 차단 모든 해당 그룹의 요청이 완료되면 응용 프로그램이 필요에 따라 더 많은 요청을 시작할 수 없습니다.

Twisted 또는 다른 비동기 서버에서이 작업을 수행 할 수 있다는 것을 알고 있지만 큰 라이브러리가 필요하지 않으며 가벼운 것을 사용하고 싶습니다. 나는 제안에 열리다.

+0

정말 트위스트를보고하는 것이 좋습니다. 라이브러리가 크다는 것은 사실이지만이 작업을 수행하려면 http 클라이언트 부분 만 사용해야하며 유사한 작업을 두 가지 방법으로 시도한 경우 상위 수준 라이브러리 방법이 훨씬 쉽습니다. –

답변

3

다음은 아이디어입니다 ... 그러나 나는 eventlet을 알지 못해서 저를 용서합니다. 나는 대략적인 개념만을 제공 할 수 있습니다.

"단계 1"풀을 생성자로 고려하십시오. queue을 작성하고 1 단계 작업자가 찾은 새 URL을 대기열에 넣으십시오.

다른 작업자 풀을 만듭니다. 이 근로자들을 대기열에서 빼내어 처리하도록하십시오. 프로세스 중에 다른 URL을 발견하면 대기열에 넣으십시오. 후속 작업으로 계속 먹을 것입니다.

기술적으로이 접근법은 1,2,3 + 단계를 넘어서 쉽게 재귀 적으로 만듭니다. 새로운 URL을 찾아 대기열에 넣으면 작업이 계속됩니다.

큐의 원래 URL로 시작한 다음 새 URL을 동일한 큐에 넣는 단일 풀을 만듭니다. 오직 하나의 수영장이 필요했습니다. 나는이 대답을 게시하고 eventlet '큐'등가가 무엇인지를 찾아 갔다 후

포스트 노트

재미는 충분히, 나는 즉시 내가 방금 설명한 정확히 보여주는 예를 발견

http://eventlet.net/doc/examples.html#producer-consumer-web-crawler

이 예에서, producerfetch 방법이있다. 생산자는 큐에서 URL을 가져오고 스레드를 fetch으로 시작하기 시작합니다. fetch 그러면 새 URL이 대기열에 다시 저장되고 서로 계속주고받습니다.

+0

오, 멋진데, 내가 어떻게 그 예를 놓쳤는 지 모르겠다. 이걸 시험해 볼게요. 그리고 당신에게 돌아 올게요.하지만 그것이 제가 필요로하는 것과 똑같은 것처럼 보입니다. 고맙습니다! –

+0

깜빡했으나 매력처럼 작동했습니다! 문제는 Windows에서만 eventlet의 녹색 스레드 제한이 상당히 낮지 만 큰 문제는 아닙니다. 다시 한 번 감사드립니다! –

+0

대단히 환영합니다! – jdi