Save_The_Page

Stato
Discussione chiusa ad ulteriori risposte.

fojeaf

Utente Silver
3 Marzo 2008
235
8
0
95
oggi ho ripreso in mano questo mio vecchio codice, il cui scopo era salvare una pagina con relativi css e immagini. Il codice nn funzionava, ed effettivamente era pieno di bug.

Dopo molto lavorare sono riuscito a metterlo in sesto: ora salva pagina e css (e credo anche gli altri valori in <link>).

L'ho testato sull'index del mio sito e funziona, ditemi se ha eventuali bug (credo nn funzioni ancora sulle pagine interne, ora verifico.

Il nuovo codice è:

Codice:
# -*- coding: iso-8859-1 -*-
#!/usr/bin/env python
#############################
# Name: Save_The_Page.py
# Author: Malex
# License: GNU/GPL 3
# Version: 2.0.2
################
"""
Run the file and do what is said.
"""
################
#imports
import httplib
from os import access,mkdir
import HTMLParser

########################
#functions
def check_url(url):
    if url[0:7]!="http://":
        url="http://"+url
    url=url.replace("\\","/")
    if (not url.find("?")) and (url[-1]=="/"):
        url+="index"
    return url

def get_site(url):
    url=check_url(url)
    site=url[7:].split("/")[0]
    return site

def get_path(url):
    url=check_url(url)
    path="/".join(url[7:].split("/")[1:])
    return path

def get_name(url):
    url=check_url(url)
    return url.split("/")[-1]

def check2(string):
    if string[0:4]=="http":
        string=string[7:]
    global url
    if string[0:len(get_site(url))]==get_site(url):
        string=string[len(get_site(url)):]
    if "?" in string:
        string=string[:string.find("?")]
    return string
#########################
#classes
class Parser(HTMLParser.HTMLParser):
    def __init__(self,data,other):
        HTMLParser.HTMLParser.__init__(self)
        self.feed(data)
        self.other=other
    def handle_starttag(self,tag,attrs):
        if tag=="link":
            count=0
            for i in attrs:
                if "href" in i:
                    rel=attrs[count][1]
                    global con
                    con.putrequest("GET","/"+rel)
                    con.endheaders()
                    rel=rel.replace("/","\\")
                    t=rel.split("\\")
                    if t.count>=1:
                        del t[-1]
                        try:
                            mkdir(folder+"\\".join(t))
                        except WindowsError:
                            print "errore con %s" % "\\".join(t)
                    rel=check2(rel)
                    fil=open(folder+rel,'w')
                    fil.write(con.getresponse().read())
                    fil.close()
                    break
                else:
                    count+=1
                    continue
        elif tag=="img":
            count=0
            for i in attrs:
                if "src" in i:
                    rel=attrs[count][1]
                    global con
                    con.putrequest("GET","/"+rel)
                    con.endheaders()
                    rel=rel.replace("/","\\")
                    t=rel.split("\\")
                    if t.count>=1:
                        del t[-1]
                        mkdir(folder+"\\".join(t))
                    rel=check2(rel)
                    fil=open(folder+rel,'wb')
                    fil.write(con.getresponse().read())
                    fil.close()
                    break
                else:
                    count+=1
                    continue
#########################
#globals

diz={ 200 : "OK", 404 : "Page Not Found", 403 : "You haven't got the permission",
      301 : "Moved Permanently", 302 : "Found", 400 : "Bad Request", 500 : "Internal Server Error",
      505 : "HTTP Version Not Supported"  }
#########################


print "Insert the url: "
url=check_url(raw_input())

#########################
#to do
##print "Insert S for a https connection, else press ENTER"
##q=raw_input()
#########################

while True:
    print "Insert the directory where you wanna save the page"
    folder=raw_input().replace("/","\\")
    if access(folder,0):
        break

con=httplib.HTTPConnection(get_site(url),80)
con.connect()

con.putrequest("GET","/"+get_path(url))
con.endheaders()

rep=con.getresponse()

try:
    print diz[rep.status]
except KeyError:
    print rep.status

a=rep.read()
fil=open(folder+get_name(url)+".html",'w')
fil.write(a)
fil.close()

ht=Parser(a,folder)

con.close()

Sono soddisfatto, perché sembrava impossibile, ma ce l'avevo fatta ;) (di solito se mi impianto su un codice difficilemente mi sblocco)

-UPDATE: versione 2.0.2 : Integrato il salvataggio delle immagini e sistemato qualche buggino. Permane il problema che fa si che il salvataggio avvenga solo per l'index.
 
bello script, una volta risolto il problema si potrebbe ampliare:
potresti aggiungere una funzione che ti permette di salvare in contemporanea anche le pagine che sono linkate nella pagina salvata, fino ad una "profondità" che viene definita dall'utente...

Non so se ho reso l'idea.

Del tipo, io salvo la pag X a cui sono linkate le pag Y, Z e K, alle quali sono linkate rispettivamente le pagg Q, W, T.
Io salvo X e decido a quale profondità salvare le pagg linkate, se scelgo uno, mi salva anche Y,Z e K, se scelgo 2 mi salva Y,Z,K e Q,W,T, e così via. ;)
 
in effetti l'obiettivo finale era proprio quello che dicevi tu, salvando pagine linkate e <img> ma coome beta avevo pensato a questo che però misteriosamente da problemi
 
Beh, l'errore vuol dire che Parser non ha un attributo rawdata.
Se aggiungi:
Codice:
self.rawdata = ''
Prima di
Codice:
self.feed(data)
l'errore sparisce.

Tuttavia, non mi pare salvi alcun file oltre la paina data in input, ne css ne immagini.
Non hai ancora implementato il resto, o non funzia?

Ho dato un'occhiata al codice, ma lo trovo un pò maccheronico (non prenderla come un'offesa, è che sono abituato a uno stile di codifica rigidissimo).
Comunque io lo farei diversamente, anzi, mi hai fatto venire la voglia. Magari se ho tempo mi ci metto.
 
quando sovrascrivi il costruttore in una sottoclasse, devi chiamare anche il costruttore della classe originale:
Codice:
class Parser(HTMLParser.HTMLParser):
    def __init__(self,data,con,other):
        HTMLParser.HTMLParser.__init__(self)
        self.feed(data)
 
Mast3rB0und ha detto:
bello script, una volta risolto il problema si potrebbe ampliare:
potresti aggiungere una funzione che ti permette di salvare in contemporanea anche le pagine che sono linkate nella pagina salvata, fino ad una "profondità" che viene definita dall'utente...

il grabber di internet download manager :asd:
 
certo c'è quello va vuoi mettere il gusto di farselo? :asd: cmq credo di aver capito dove sta un altro errore, devo fare un test
 
ecco la mia versione in perl, non salva tutti i link associati per mia scelta, dato che mi sembrava inutile ^^

http://lepa.pastebin.com/f6aeb2916

Malex, a me il download delle immagini funziona, se vuoi puoi prendere spunto dal mio =)
 
il problema che riscontro lo risolvo relativamente in poco tempo, tuttavia nn ho materialmente il tempo di programmare ultimamente.
 
ShuraBozz ha detto:
Malex ora la fai diventare una sfida pero'... non prenderla sul personale dai

??? di che parli?

ho solo precisato che ho praticamente abbandonato questo progetto (che + che altro mirava a dare un senso alle libririe httplib e HTMLParser che sono scarsamente usate).
 
[ot]beh, è reciproco, nn so cosa ti abbia io fatto personalmente, ma mi stai dimostrando una tale simpatia, sebbene continui a non capirne il perché...[/ot]
 
Stato
Discussione chiusa ad ulteriori risposte.