2012-02-10 30 views
6

Điều tương tự được yêu cầu 2.5 năm trước trong Downloading a web page and all of its resource files in Python nhưng không dẫn đến câu trả lời và 'xin vui lòng xem chủ đề liên quan' không thực sự hỏi điều tương tự.Tương đương với wget bằng Python để tải xuống trang web và tài nguyên

Tôi muốn tải xuống mọi thứ trên một trang để có thể xem nó chỉ từ các tệp.

Lệnh

wget --page điều kiện tiên quyết --domains --restrict-file-names = cửa sổ = DOMAIN --no-mẹ --html-mở rộng --convert-liên kết

thực hiện chính xác những gì tôi cần. Tuy nhiên, chúng tôi muốn có thể kết hợp nó với những thứ khác phải di động, vì vậy yêu cầu nó phải bằng Python.

Tôi đã xem súp đẹp, có nhiều bụi, nhiều loại nhện khác nhau được đăng xung quanh địa điểm, nhưng tất cả những thứ này dường như đối phó với việc nhận dữ liệu/liên kết theo cách thông minh nhưng cụ thể. Sử dụng chúng để làm những gì tôi muốn có vẻ như nó sẽ đòi hỏi rất nhiều công việc để đối phó với việc tìm kiếm tất cả các nguồn lực, khi tôi chắc chắn phải có một cách dễ dàng.

cảm ơn rất nhiều

+0

nhập khẩu urllib urllib.urlretrieve ('http://www.somesite.com/file Bất cứ điều gì ',' tên tập tin được tải xuống là ') – CR0SS0V3R

+1

vì vậy tôi biết rằng tôi có thể tải xuống một tệp theo cách đó, nhưng tôi sẽ cần sử dụng trình thu thập thông tin và đặt nhiều điều kiện để tìm tất cả các tệp mà tôi muốn (mọi thứ để có thể xem một phần của trang web ngoại tuyến). Phải có điều gì đó xung quanh tải xuống trang web và các điều kiện tiên quyết trong Python? – Conrad

+0

bạn có thể sử dụng chức năng phân tích cú pháp trong vòng lặp for để tìm kiếm liên kết bên trong tệp đã tải xuống (hoặc đọc từ nơi nào) – CR0SS0V3R

Trả lời

3

Bạn nên sử dụng một công cụ thích hợp cho công việc trong tầm tay.

Nếu bạn muốn tạo một trang web và lưu các trang vào đĩa, Python có lẽ không phải là lựa chọn tốt nhất cho điều đó. Các dự án mã nguồn mở có được các tính năng khi ai đó cần tính năng đó, và bởi vì wget thực hiện công việc của mình rất tốt, không ai phải cố gắng viết một thư viện python để thay thế nó.

Xem xét wget chạy trên nhiều nền tảng bất kỳ có trình thông dịch Python, có lý do nào bạn không thể sử dụng wget không?

+0

bạn thực hiện một điểm tốt mà không ai sẽ viết một cho python, lý do duy nhất tôi đã không theo đuổi các tuyến đường wget là tôi đã được yêu cầu để làm điều đó trong Python .... Tôi đoán họ muốn giảm phụ thuộc. Hiện tại, chúng tôi đã viết khá nhiều công cụ bằng Python để sử dụng hẹp. Sẽ đăng lên đây nếu được phép – Conrad

1

Đồng nghiệp của tôi đã viết mã này, nhiều lô được ghép lại với nhau từ các nguồn khác mà tôi tin. Có thể có một số tật cụ thể cho hệ thống của chúng tôi nhưng nó sẽ giúp bất cứ ai muốn làm như vậy

""" 
    Downloads all links from a specified location and saves to machine. 
    Downloaded links will only be of a lower level then links specified. 
    To use: python downloader.py link 
""" 
import sys,re,os,urllib2,urllib,urlparse 
tocrawl = set([sys.argv[1]]) 
# linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?') 
linkregex = re.compile('href=[\'|"](.*?)[\'"].*?') 
linksrc = re.compile('src=[\'|"](.*?)[\'"].*?') 
def main(): 
    link_list = []##create a list of all found links so there are no duplicates 
    restrict = sys.argv[1]##used to restrict found links to only have lower level 
    link_list.append(restrict) 
    parent_folder = restrict.rfind('/', 0, len(restrict)-1) 
    ##a.com/b/c/d/ make /d/ as parent folder 
    while 1: 
     try: 
      crawling = tocrawl.pop() 
      #print crawling 
     except KeyError: 
      break 
     url = urlparse.urlparse(crawling)##splits url into sections 
     try: 
      response = urllib2.urlopen(crawling)##try to open the url 
     except: 
      continue 
     msg = response.read()##save source of url 
     links = linkregex.findall(msg)##search for all href in source 
     links = links + linksrc.findall(msg)##search for all src in source 
     for link in (links.pop(0) for _ in xrange(len(links))): 
      if link.startswith('/'): 
       ##if /xxx a.com/b/c/ -> a.com/b/c/xxx 
       link = 'http://' + url[1] + link 
      elif ~link.find('#'): 
       continue 
      elif link.startswith('../'): 
       if link.find('../../'):##only use links that are max 1 level above reference 
        ##if ../xxx.html a.com/b/c/d.html -> a.com/b/xxx.html 
        parent_pos = url[2].rfind('/') 
        parent_pos = url[2].rfind('/', 0, parent_pos-2) + 1 
        parent_url = url[2][:parent_pos] 
        new_link = link.find('/')+1 
        link = link[new_link:] 
        link = 'http://' + url[1] + parent_url + link 
       else: 
        continue 
      elif not link.startswith('http'): 
       if url[2].find('.html'): 
        ##if xxx.html a.com/b/c/d.html -> a.com/b/c/xxx.html 
        a = url[2].rfind('/')+1 
        parent = url[2][:a] 
        link = 'http://' + url[1] + parent + link 
       else: 
        ##if xxx.html a.com/b/c/ -> a.com/b/c/xxx.html 
        link = 'http://' + url[1] + url[2] + link 
      if link not in link_list: 
       link_list.append(link)##add link to list of already found links 
       if (~link.find(restrict)): 
       ##only grab links which are below input site 
        print link ##print downloaded link 
        tocrawl.add(link)##add link to pending view links 
        file_name = link[parent_folder+1:]##folder structure for files to be saved 
        filename = file_name.rfind('/') 
        folder = file_name[:filename]##creates folder names 
        folder = os.path.abspath(folder)##creates folder path 
        if not os.path.exists(folder): 
         os.makedirs(folder)##make folder if it does not exist 
        try: 
         urllib.urlretrieve(link, file_name)##download the link 
        except: 
         print "could not download %s"%link 
       else: 
        continue 
if __name__ == "__main__": 
    main() 

cảm ơn cho trả lời

+0

Tôi là người mới lập trình, Bạn có thể vui lòng cho tôi biết cách sử dụng mã này không? Tôi cũng muốn tải xuống mọi thứ được liên kết đến một trang web và mở nó cục bộ và tôi cũng được yêu cầu làm điều đó bằng Python. –

+0

Tôi nên đặt liên kết của mình ở đâu và trang của tôi được lưu ở đâu? –

+1

ouch .. sử dụng trình phân tích cú pháp html –

Các vấn đề liên quan