Pobranie kodu strony WWW

0

Witam, mam następujący problem:
Próbowałem napisać program (python), który wyciągałby kod HTML strony w internecie. Zrobiłem to przy pomocy requests.get("url").
Niestety strona, którą próbuję w ten sposób załadować ma nietypową strukturę. Mianowicie między znacznikami <body> znajduję się JavaScript, który o ile się nie mylę wczytuje całą stronę.

Wygląda to tak:

  <body>
    <div id="fb-root"></div>
      <script>
        (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pl_PL/sdk.js#version=v2.7&xfbml=1&apId=66326061";
        fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));
      </script>
    <div id="frontend-root"></div>
  </body>

Rzeczywisty kod, który odpowiada za wyświetlanie strony mogę zobaczyć dopiero po jej załadowaniu i zbadaniu przy pomocy "Inspektora" kodu wbudowanego w przeglądarkę. Python oczwiście widzi tylko tę wersję ze skryptem.

Czy jest możliwość na pobranie kodu strony, w formie w jakiej wygląda po załadowaniu?

1

Możesz użyć np. webkit silnika, załadować tego htmla w tym silniku i potem odczytać.

1

Ten kod js, który tu widać nie ma nic wspólnego z ładowaniem tej strony. Niemniej jednak masz rację, bo strona jest tworzona przez JavaScript (prawdopodobnie użyty jest jakiś react czy angular).

Teraz powstaje pytanie, czy potrzebny jest Ci kod HTML jako taki, czy potrzebujesz wyciągnąć jakieś dane z tego kodu HTML.

W aplikacjach napisanych z użyciem react/angular dane są ładowane asynchronicznie, tzn. sam HTML buduje framework, ale jego dane to zwykły JSON. Jeżeli otworzysz narzędzia deweloperskie i zakładkę networking, to będziesz mógł podejrzeć żądania, które zwracają interesujące Cie dane. Wtedy oszczędzasz sobie parsowania HTML, tylko dekodujesz JSON i voila :) W Pythonie robisz request bezpośrednio pod URL zwracający dane.

Jeżeli jednak potrzebujesz z jakiś względów HTML to możesz użyc PhantomJS. Możliwe, że w Pythonie też się jakoś da to zrobić, ale ja to zawsze robiłem z użyciem Phantoma.

2

Dzięki! Obie odpowiedzi nieco mnie nakierowały i po paru godzinach poszukiwań rozwiązałem problem.

Przedstawię jak to zrobiłem, może się komuś przyda:

(wcześniej trzeba zainstalować Selenium i PhantomJS)

#!/usr/bin/env python
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get("http://example.com") #załadowanie strony
html = driver.page_source #pobranie kodu strony
driver.close() #zamknięcie strony

Rozwiazanie działa pod linuxem (Ubuntu) :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1