2010-01-25 7 views
5

한 사이트에서 웹 페이지를 일괄 적으로 다운로드하고 싶습니다. 내 'urls.txt'파일에는 5000000 개의 URL 링크가 있습니다. 그것은 약 300M입니다. 다중 스레드가 이러한 URL을 연결하고 이러한 웹 페이지를 다운로드하는 방법은 무엇입니까? 또는 어떻게 이러한 웹 페이지를 다운로드 할 수 있습니까?파이썬, 멀티 스레드, 웹 페이지 가져 오기, 웹 페이지 다운로드

내 아이디어 :

with open('urls.txt','r') as f: 
    for el in f: 
     ##fetch these urls 

또는 트위스트?

좋은 해결책이 있습니까?

+2

당신이 직접 프로그램 하시겠습니까 체크 아웃? 'wget'로 쉽게 할 수 있습니다. – notnoop

답변

1

분명히 한 번에 5M 웹 페이지를 다운로드하는 것은 좋은 생각이 아닙니다. 네트워크 대역폭과 OS의 파일 설명자를 포함하여 많은 것들을 최대한 활용할 것이기 때문입니다. 나는 100-1000의 일괄로 갈 것이다. urllib.urlopen을 사용하여 소켓을 얻은 다음 여러 스레드에서 read()를 수행 할 수 있습니다. select.select를 사용할 수 있습니다. 그렇다면 한 번에 1000 개를 모두 다운로드하고 select가 반환하는 각 파일 핸들을 배포하여 10 개의 작업자 스레드라고 말하십시오. select가 작동하지 않으면 배치를 100 다운로드로 제한하고 다운로드 당 하나의 스레드를 사용하십시오. OS가 터지거나 적어도 느리게 진행될 수 있으므로 확실히 100 개 이상의 스레드를 시작해서는 안됩니다.

3

이 프로그램이 더 큰 프로그램의 일부가 아니라면, 기존의 도구를 사용하여 이것을 수행하는 노노의 아이디어는 꽤 좋은 프로그램입니다. wget을 호출하는 셸 루프가 문제를 해결하면 더 많은 사용자 정의 소프트웨어 개발이 필요한 것보다 훨씬 쉽습니다.

그러나 이러한 리소스를 더 큰 프로그램의 일부로 가져와야하는 경우 셸을 사용하여 이러한 리소스를 가져 오는 것이 이상적이지 않을 수 있습니다. 이 경우, 많은 요청을 병렬로 쉽게 처리 할 수있는 Twisted를 강력히 권장합니다.

몇 년 전 나는 이것을 어떻게 수행해야하는지에 대한 예를 썼다. http://jcalderone.livejournal.com/24285.html을보십시오.

+0

감사합니다. – bell007

1

먼저 파일을 구문 분석하고 URL을 대기열로 밀어 넣어 5-10 개의 작업자 스레드를 생성하여 대기열에서 URL을 가져 와서 다운로드하십시오. 대기열은 이것에 너의 친구 야.

+0

감사합니다! "대기열은 이걸로 네 친구 야." :) – bell007

0

wget과 스크립트는 아마 가장 간단하지만 파이썬 트위스트 크롤링 솔루션을 찾고 있다면, scrapy