2011-09-26 2 views
0

나는 파이썬을 사용하여 웹 사이트 다운로더을 생성하려고합니다.웹 사이트 내려 받기 파이썬을 사용하여

  1. 다운로드 페이지

  2. 에서

은 내가해야 할 것은 재귀 적으로 페이지를 다운로드하는 것입니다 주어진 URL을 모든 URL 찾기 : 나는에 대한 코드를 해당 페이지에 다른 링크가있는 경우 다운로드해야합니다. 위의 두 함수를 결합하려고했지만 재귀가 작동하지 않습니다.

1)

다운로드 (URL) 함수는 다음과 같이 정의된다
*from sgmllib import SGMLParser 
class URLLister(SGMLParser): 
    def reset(self): 
     SGMLParser.reset(self) 
     self.urls = [] 
    def start_a(self, attrs): 
     href = [v for k, v in attrs if k=='href'] 
     if href: 
      self.urls.extend(href) 
if __name__ == "__main__": 
    import urllib 
    wanted_url=raw_input("Enter the URL: ") 
    usock = urllib.urlopen(wanted_url) 
    parser = URLLister() 
    parser.feed(usock.read()) 
    parser.close() 
    usock.close() 
    for url in parser.urls: download(url)* 

2) 다음과 같습니다 :

*def download(url): 
    import urllib 
    webFile = urllib.urlopen(url) 
    localFile = open(url.split('/')[-1], 'w') 
    localFile.write(webFile.read()) 
    webFile.close() 
    localFile.close() 
    a=raw_input("Enter the URL") 
    download(a) 
    print "Done"* 

을 친절하게 결합하는 방법에 대한 좀 도와

코드

아래에서 언급 이 2 개의 부호는 " 반복적으로"에 "인 다우 인 웹 페이지에 새로운 연결을 다운로드한다 nloaded.

+1

정말로 'wget'을 사용하여 직접 작성하고 싶습니까? – NPE

답변

1

일반적으로, 아이디어는 이것이다 :

def get_links_recursive(document, current_depth, max_depth): 
    links = document.get_links() 
    for link in links: 
     downloaded = link.download() 
     if current_depth < max_depth: 
      get_links_recursive(downloaded, depth-1, max_depth) 

통화 get_links_recursive (문서, 0, 3)받을 일이 시작했다.

+3

이것은 정확하게 스택 오버플로를 트리거하는 방법으로, SO에서 질문을 반복적으로 트리거하고 궁극적으로 유니버스를 종료합니다. – Tibo

+0

동의를 얻으려면 크롤링을 중지해야하는시기에 제한을 추가해야합니다. 가능한 한 크롤링되는 수준의 수를 제한하는 것이 좋습니다. 나는 대답을 편집 할 것이다. –

2

Scrapy 라이브러리를 살펴볼 수 있습니다.

이렇게하면 작업이 간단 해지고 여러 페이지를 동시에 다운로드 할 수 있습니다.

2
done_url = [] 
def download(url): 
    if url in done_url:return 
    ...download url code... 
    done_url.append(url) 
    urls = sone_function_to_fetch_urls_from_this_page() 
    for url in urls:download(url) 

이것은 매우 슬픈/나쁜 코드입니다. 예를 들어 URL이 크롤링 할 도메인 내에 있는지 확인해야합니다. 그러나 재귀 적으로 요청했습니다.

재귀 수준에 유의하십시오.

내 솔루션에는 여러 가지 문제가 있습니다. : P

Scrapy와 같은 크롤링 라이브러리 나 뭔가를 시도해야합니다.

관련 문제