2016-05-09 13 views
6

Sto provando a utilizzare il seguente codice, che funziona bene ma non consente di eseguire prima JavaScript, il che significa che non lo faccio ottieni l'HTML desiderato dalla pagina web.Raschiare l'HTML da una pagina Web dopo aver eseguito il rendering di JSON/Javascript senza selenio mentre supportavo il POSTing

che ho avuto uno sguardo al DryScrape ma per quanto posso vedere non supporta la pubblicazione, come si può vedere nella funzione auto_login(), lo stesso vale per PyQt4.

Il sito Web in questione ha 4 bit di "liste" JSON? che formano la pagina su caricamento/rendering; se visualizzo la fonte non viene visualizzata correttamente e non riesco a trovare facilmente delle cose, tuttavia se "Inspect Element" sulla pagina l'HTML sembra perfetto e quindi posso guardarlo facilmente con BeautifulSoup.

So che potrei usare Selenium, ma questo non è quello che voglio fare soprattutto a causa di volerlo per l'esecuzione in background, io possa essere in grado di utilizzare PhantomJS o PyVirtualDisplay per fare questo, ma questo sarebbe solo come un'ultima risorsa.

import requests 
from bs4 import BeautifulSoup 

HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'} 
SESSION = requests.session() 
RESPONSE = requests.Response 

email = "[email protected]" 
pass = "password123 

def auto_login(): 
    global RESPONSE 
    url = "https://website.com/log.php" 
    payload = { 
     "log":email, 
     "pwd":pass, 
    "finish":"https://website.com/listed/public/gen1/", 
    } 
    RESPONSE = SESSION.post(url, data=payload, headers=HEADERS, verify=False) 

def process_html(): 
    PROCESSED_HTML = BeautifulSoup(RESPONSE.content, 'html.parser') 
    return PROCESSED_HTML 

def main(): 
    auto_login() 
    PROCESSED_HTML = get_html() 

if __name__ == "__main__": 
    main() 

Come posso facilmente render di una pagina web JavaScript utilizzando il mio script (modificato), preferibilmente con PyQt4 (DryScrape non verrà installato correttamente sul mio Windows 10, Python 2.7 per qualche motivo) senza l'utilizzo di Selenium.

Qualsiasi idea sarebbe apprezzata.

+0

Provi il selenio? – Buaban

+0

Buaban, no, questa è l'ultima opzione che non so ancora come fare, ho bisogno di guardare oltre in un percorso di "selenio" in background e capire che funzionerebbe. Sto cercando principalmente un'opzione per usare 'PyQt4' e fare in modo che il mio codice cambi la quantità minima di modifiche. – Ryflex

+0

eseguire test selenio senza testa è davvero banale ... sono solo poche righe di codice da integrare con Xvfb: https://github.com/cgoldberg/xvfbwrapper#testing-example-headless-selenium-webdriver-tests –

risposta

0

Non riesco a far funzionare Dryscape per me, quindi non posso verificarlo; tuttavia, penso che questa idea/hack possa funzionare - potrebbe aver bisogno di qualche piccola modifica.

L'idea è di creare un piccolo file HTML locale con un modulo e i parametri che è necessario passare. Questo file HTML viene creato in Python in modo che tu possa passare i valori a ciascun parametro.

Secondo i documenti, dryscrape può inviare moduli, quindi invia il tuo modulo e dovrebbe portarti dove devi andare.

Qualcosa di simile:

import dryscrape 

payload = {'log':email, 'pwd':pass, 'finish':'https://website.com/listed/public/gen1/'} 

html = ''' 
    <form action="https://website.com/log.php" method="POST"> 
     <input name="log" type="text" value="{log}"> 
     <input name="pwd" type="password" value="{pwd}"> 
     <input name="finish" type="text" value="{finish}"> 
     <input type="submit"> 
    </form> 
    '''.format(**payload) 

with open('./temp.html','w') as hf: 
    hf.write(html) 

sess = dryscrape.Session(base_url = './') # maybe 'file://' is needed? 

q = sess.visit('/temp.html') 
q.form().submit() 

# Remainder of your code to follow... 

Anche in questo caso, io non sono in grado di testare per conto mio, quindi non ci possono essere alcuni piccoli aggiustamenti necessari.

Non molto elegante, ma solo un pensiero ... :-)

Problemi correlati