Парсинг структуры сайта, используя метаданные svn

Discussion in 'PHP' started by oRb, 6 Oct 2009.

  1. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    582
    Reputations:
    256
    Не совсем релиз, ибо кода мало.
    Возможно кому-то будет полезен.
    Рекурсивно обходит всю директорию, которую вы указали.
    Написан на питоне.
    PHP:
    #!/usr/bin/python
    import sysurllib

    def parse
    (path):
        
    fh urllib.urlopen(url path '.svn/entries')
        
    prev ''
        
    while True:
            
    line fh.readline()
            if 
    not line:
                break
            
    line line.strip()
            if 
    prev:
                if 
    line.lower() == 'dir':
                    print 
    path prev '/'
                    
    parse(path prev '/')
                
    elif line.lower() == 'file':
                    print 
    path prev
            prev 
    line

    url 
    raw_input("URL: http://")
    if 
    url[-1] == '/':
        
    url url[:-1]
    url "http://" url
    print 
    parse('/')
    Пример:
    Code:
    $ ./svn_parser.py
    URL: http://wiki.postgresql.org/skins/
    
    /Simple.php
    /chick/
    /chick/IE50Fixes.css
    /chick/IE60Fixes.css
    /chick/main.css
    /chick/IE55Fixes.css
    /monobook/
    /monobook/user.gif
    /monobook/Opera6Fixes.css
    /monobook/Opera7Fixes.css
    /monobook/required.gif
    /monobook/audio.png
    /monobook/wiki.png
    /monobook/rtl.css
    /monobook/IE50Fixes.css
    /monobook/video.png
    /monobook/IE60Fixes.css
    [и так далее]
    
     
    5 people like this.
  2. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Хз зачем, но покрутил сам ))+proxy+вывод в файл
    Немного удобнее выводит список файлов, если папка не пуста то буит приблизительно так :
    Code:
    URL (with scheme):http://wiki.postgresql.org/skins/
    ========================================
    Simple.php
    /chick/
          IE50Fixes.css
          IE60Fixes.css
          main.css
          IE55Fixes.css
    /monobook/
             user.gif
             Opera6Fixes.css
             Opera7Fixes.css
             required.gif
             audio.png
             wiki.png
             rtl.css
             IE50Fixes.css
             video.png
             IE60Fixes.css
             headbg.jpg
             IE70Fixes.css
             bullet.gif
             file_icon.gif
             IE55Fixes.css
             mail_icon.gif
             document.png
             magnify-clip.png
             IEMacFixes.css
             lock_icon.gif
             wiki-indexed.png
             external.png
             KHTMLFixes.css
             news_icon.png
             link_icon.gif
             main.css
             discussionitem_icon.gif
    CologneBlue.php
    Skin.sample
    /modern/
    
    Code:
    #!/usr/bin/python 
    #-*-encoding:UTF-8-*-
     
    import sys
    import urllib2
    
    def parse(url, path, write=True):
        try:
            fh = urllib2.urlopen("{url}{path}.svn/entries".format(url=url, path=path))
        except urllib2.HTTPError:
            #print u"Файл не найден : {url}{path}.svn/entries".format(url=url, path=path)
            pass
        else:
            prev = ""
            line = "NOT_EMPTY"
            while True:
                lines = iter(fh.readlines())
                if not line: 
                    break 
                else:
                    for line in lines:
                        line = line.strip() 
                        if prev: 
                            if line.lower() == 'dir': 
                                print "{path}{prev}/".format(path=path, prev=prev)
                                if write:
                                    out_file.write("{path}{prev}/\n".format(path=path, prev=prev))
                                parse(url, "{1}{0}/".format(prev, path))
                            elif line.lower() == 'file': 
                                print "{path}{prev}".format(path=" "*(len(path)-1), prev=prev)
                                if write:
                                    out_file.write("{path}{prev}\n".format(path=" "*(len(path)-1), prev=prev))
                        prev = line 
    
    url = raw_input("URL (with scheme):") 
    if url.endswith("/"): 
        url = url.rstrip("/")
    proxy = raw_input("PROXY? (HTTP/HTTPS, ip:port):").strip()
    if proxy:
        proxy_handler = urllib2.ProxyHandler(
                                             { 
                                              "http": "http://{0}/".format(proxy),
                                              "https": "http://{0}/".format(proxy)
                                             }
                                           )
        opener = urllib2.build_opener(proxy_handler)
        urllib2.install_opener(opener)
    write = raw_input("Write to file?(y/n):").strip()
    if write == "y":
        write = True
        out_file = open("work_log.txt", "a")
        out_file.write("{0}\n".format(url))
        out_file.write("{0}\n".format("="*80))
    else:
        write = False
    print u"="*40
    parse(url, "/", write)
    out_file.close()
    
     
    #2 login999, 17 Apr 2010
    Last edited: 17 Apr 2010
    shell_c0de and oRb like this.