Webseite in Variable einlesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
athlon
User
Beiträge: 4
Registriert: Freitag 31. August 2018, 07:20

Hallo zusammen,
Ich versuche gerade in Python einzusteigen, dabei habe ich ein Problem bei meinem ersten Projekt.
Ich möchte eine Webseite folgendermaßen auslesen:
________________________________
import urllib.request

html = urllib.request.urlopen("http://gwise.itwelzel.biz/Books/Openboo ... 20_002.htm")
print(html.read())
________________________________


Wenn ich kleine Websites auslese funktioniert das auch, wenn ich allerdings umfangreichere Websites (wie im Beispiel) auslese wird nur ein Teil der Webseite in der Variablen html gespeichert.
Meine Vermutung ist das entweder die Variable die Menge an Daten nicht speichern kann oder dass die Funktion: urllib.request.urlopen nicht alles zurückgibt.

Ich hoffe das ihr mir dabei weiterhelfen könnt, Vielen Dank
athlon
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn dein Browser respektive allgemein dein Computer die Menge an Daten speichern kann, dann kann das auch Python. Das ist also nicht der Grund.

Sondern das heutzutage eine Vielzahl von Webseiten hochdynamisch sind. Nach dem initialen lesen werden per Javascript grosse Teile nachgeladen. Facebook zB ist eine fast komplette single-page-Anwendung.

Wenn du so eine Seite abgrasen willst, musst du entweder rausfinden (per Browser Debugger) welche Aufrufe die Seite an den Server macht, und die auch machen.

Oder du scrapst *durch* einen Browser, mit so etwas wie Selenium zB.
athlon
User
Beiträge: 4
Registriert: Freitag 31. August 2018, 07:20

Vielen Dank für die schnelle Antwort,

ich habe Selenium getestet, allerdings habe ich dabei das gleich Problem wie zuvor, die Webseite wird nur zum Teil eingelesen.
Hier ist mein Quellcode:

from selenium import webdriver

browser = webdriver.Chrome("c:\Python\chromedriver\chromedriver.exe")
browser.get("https://www.rheinwerk-verlag.de/")
print (browser.page_source)

Woran könnte es liegen das bei der Ausgabe der Webseite mit print nur ein Teil ausgegeben wird?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit "nur ein Teil"? Kannst Du das genauer beschreiben (Beispiel posten)? Was willst Du eigentlich machen?
athlon
User
Beiträge: 4
Registriert: Freitag 31. August 2018, 07:20

Es werden nur ca. die ersten 100 Zeilen html Code ausgegeben bzw. eingelesen. Der Quellcode Zeigt es:

from selenium import webdriver

browser = webdriver.Chrome("c:\Python\chromedriver\chromedriver.exe")
browser.get("https://www.rheinwerk-verlag.de/")
print (browser.page_source)

Mein Ziele ist es Webseiten zu Vergleichen und nach Neuerrungen zu durchsuchen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das jetzt nicht ausprobiert, aber es kann gut sein, das du erstmal ersten musst, bevor du dir den Source holst. Die Seite muss ja nachladen und sich umbauen etc. Das dauert ein bisschen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@athlon: ich kann Dein Problem nicht nachvollziehen, weil ich alle 3940 Zeilen bekomme.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich auch. Auch schon `requests`, da brauche ich kein Selenium für bemühen:

Code: Alles auswählen

In [18]: r = requests.get('https://www.rheinwerk-verlag.de/')

In [19]: r.content.count(b'\n')
Out[19]: 3939
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
athlon
User
Beiträge: 4
Registriert: Freitag 31. August 2018, 07:20

Danke für eure Hilfe,

der Fehler scheint bei der Ausgabe des Strings zu liegen, mit print() es wird nicht der komplette string (im Terminal Fenster von VS code) ausgegeben.

Das einlesen der Webseite in eine Variable funktioniert.

Gruß
athlon
Antworten