2016-05-09 22 views
6

Próbuję użyć następującego kodu, który działa poprawnie, ale nie pozwala na uruchomienie kodu JavaScript, co oznacza, że ​​nie pobierz żądany kod HTML ze strony internetowej.Zeskanuj kod HTML ze strony internetowej po renderowaniu kodu JSON/Javascript bez selonu przy jednoczesnym wspieraniu testu POSTing

miałem spojrzeć na DryScrape ale o ile widzę go nie obsługuje wysyłania jak można zobaczyć w funkcji auto_login(), to samo dotyczy PyQt4.

Strona ma 4 bity "list" JSON? które tworzą stronę po wczytaniu/renderowaniu; jeśli widzę źródło, to nie jest ładnie wyświetlane i nie mogę łatwo znaleźć w nim żadnych rzeczy, jednak gdybym "Sprawdził element" na stronie, HTML wyglądałby idealnie, a następnie mogę łatwo przejrzeć go za pomocą BeautifulSoup.

Wiem, że mógłbym użyć Selenium, ale to nie jest to, co chcę zrobić, głównie dlatego, że chce go uruchomić w tle, może będę mógł używać PhantomJS lub PyVirtualDisplay to zrobić, ale to będzie tylko jako ostatnia deska ratunku.

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() 

Jak można łatwo uczynić stronę internetową za pomocą mojego skryptu JavaScript (zmodyfikowany), najlepiej z PyQt4 (DryScrape nie będzie prawidłowo zainstalować na moim systemie Windows 10, Python 2.7 z jakiegoś powodu) bez użycia Selenium.

Wszelkie pomysły będą mile widziane.

+0

Czy próbujesz już Selenium? – Buaban

+0

Buaban, nie, to jest opcja ostatniego wyboru, której jeszcze nie wiem, jak to zrobić, muszę spojrzeć dalej w tle trasy "Selenium" i wymyślić, że zadziała. Poszukuję głównie opcji "PyQt4" i zmusić mój kod do zmiany minimalnej ilości zmian. – Ryflex

+0

Testy selenowe bezgłowe są naprawdę trywialne ... to tylko kilka linijek kodu do zintegrowania z Xvfb: https://github.com/cgoldberg/xvfbwrapper#testing-example-headless-selenium-webdriver-tests –

Odpowiedz

0

Nie mogę uzyskać suchego krajobrazu do pracy dla mnie, więc nie mogę tego przetestować; jednak myślę, że ten pomysł/hack może działać - może wymagać drobnych poprawek.

Chodzi o to, aby utworzyć mały, lokalny plik HTML z formularzem i parametrami, które należy przekazać. Ten plik HTML jest tworzony w języku Python, dzięki czemu można przekazywać wartości do każdego parametru.

Zgodnie z dokumentami, dryscrape może przesyłać formularze, dlatego należy przesłać formularz, który powinien doprowadzić do miejsca, do którego należy się udać.

Coś jak:

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... 

Ponownie, nie jestem w stanie przetestować to na własną rękę, więc nie może być kilka drobnych poprawek potrzebne.

Niezbyt elegancko, ale tylko myśl ... :-)