2013-01-25 12 views
17

Sto usando seguente codice per salvare pagina web utilizzando Python:Come salvare "completa pagina web" non solo HTML di base utilizzando Python

import urllib 
import sys 
from bs4 import BeautifulSoup 

url = 'http://www.vodafone.de/privat/tarife/red-smartphone-tarife.html' 
f = urllib.urlretrieve(url,'test.html') 

Problema: salva questo codice html come HTML di base senza javascript, immagini ecc . voglio salvare pagina web più completo (come abbiamo opzione nel browser)

Aggiornamento: sto usando seguente codice ora per salvare tutte le JS/immagini/files css di webapge in modo che possa essere salvato come completa la pagina web ma il mio output html è ancora sempre salvato come HTML di base:

import pycurl 
import StringIO 

c = pycurl.Curl() 
c.setopt(pycurl.URL, "http://www.vodafone.de/privat/tarife/red-smartphone-tarife.html") 

b = StringIO.StringIO() 
c.setopt(pycurl.WRITEFUNCTION, b.write) 
c.setopt(pycurl.FOLLOWLOCATION, 1) 
c.setopt(pycurl.MAXREDIRS, 5) 
c.perform() 
html = b.getvalue() 
#print html 
fh = open("file.html", "w") 
fh.write(html) 
fh.close() 
+1

Quindi dovresti scrivere codice per analizzare l'HTML, prendere tutte le risorse collegate e scaricarle singolarmente, proprio come fa un browser. – Amber

+0

usando una bella zuppa posso farlo? –

+2

Prova [Scrapy] (http://scrapy.org/), un framework per la demolizione del web in Python portatile open source – Abhijit

risposta

17

Prova emulando il browser con selenium. Questo script aprirà la finestra di dialogo save as per la pagina web. Dovrai ancora capire come emulare premere Invio per avviare il download poiché la finestra di dialogo dei file è fuori dalla portata del selenio (il modo in cui lo fai dipende anche dal SO).

from selenium import webdriver 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.common.keys import Keys 

br = webdriver.Firefox() 
br.get('http://www.google.com/') 

save_me = ActionChains(br).key_down(Keys.CONTROL)\ 
     .key_down('s').key_up(Keys.CONTROL).key_up('s') 
save_me.perform() 

Inoltre penso seguente @Amber suggerimento di afferrare le risorse collegate può essere una tal modo una soluzione più semplice, meglio è. Tuttavia, penso che l'uso del selenio sia un buon punto di partenza poiché lo br.page_source ti porterà all'intero dom insieme al contenuto dinamico generato da javascript.

+0

Questo codice mi sta dando 'WindowsError: [Errore 2] Il sistema non riesce a trovare il file specificato' error –

+0

@atams - Su quale linea ottieni l'errore? L'ho provato e ha funzionato sulla mia macchina ... – root

+0

Sto ricevendo errore in questa riga: 'br = webdriver.Firefox()', è perché sto usando la versione portatile di firefox? –

Problemi correlati