Dynamische Website komplett laden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

Hey,
ich möchte von einer Website links abgreifen, das Problem ist, das eben das der Content nicht komplett geladen ist zu anfang.
Wenn man auf der Seite das Seitenende erreicht hat wird der restliche Content erst nachgeladen.
Mein Code funktioniert bisher, nur bekomme ich halt nur die ersten paar Links raus, aber eben nicht alle ...

Wie stelle ich es an das ich den gesamten content der html (also auch der der noch nicht nachgeladen wurde) durchsuchen kann.

Mein Code sieht bisher so aus:

Code: Alles auswählen

import urllib.request
import re

#connect to a URL
website = urllib.request.urlopen("URL")

#read html code
html = website.read().decode('utf-8')

#use re.findall to get all the links
links = re.findall('"((http|ftp)s?://scontent.*?)"', html)

print(links)
#print(len(links))
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@ElectricHamter9o: das kommt halt drauf an, wie die Daten nachgeladen werden. Da gibt es viele Möglichkeiten. Am einfachsten kannst Du das mit den Entickler-Tools Deines Browsers herausfinden. Die Links solltest Du nicht mit regulären Ausdrücken suchen, sondern mit einem passenden HTML-Parser.
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

ok ich glaube auf der seite gibt es ein JavaScript File der das erledigt mit dem Nachladen des Contents.
Wie handhabe ich das jetzt am besten?
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

Habe das Problem erkannt wenn ich es mit den regulären Ausdrücken mache. So habe ich ja eine Liste die ich noch bearbeiten muss ...
Muss mir das mit dem Webparser mal anschauen.

Ach ja es handelt sich bei der Seite um Instagram und ja ich weiß das es da eine API gibt xD
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der einzige sinnvolle Weg ist die API zu verwenden. Alle anderen Lösungen werden bestenfalls temporär funktionieren.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Instagram -> schau dir die API an!

Schau dir mal die Bibliotheken requests (http://docs.python-requests.org/en/master/) und BeautifoulSoup (https://www.crummy.com/software/BeautifulSoup/) an. Mit den beiden Bibliotheken wäre so eine Aufgabe dann schnell erledigt.

Falls du die Instagram-Bibliothek nicht nutzen kannst oder willst. Deaktiviere mal in deinem Browser JS und lade die betreffende Seite neu, möglicherweise hast du eine Chance, dass Du dann herausfinden kannst, woher die Daten kommen. Ich habe das durch Zufall mal bei einer Seite gemacht, die ich parsen muss und netterweise wurde mir die Datenliefer-Seite (ein php-Skript) angezeigt.
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

Ich habe mal JS deaktiviert. Leider bleibt dann die komplette Seite weiß
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

ElectricHamter9o hat geschrieben:Habe das Problem erkannt wenn ich es mit den regulären Ausdrücken mache. So habe ich ja eine Liste die ich noch bearbeiten muss ...
Das ist allerdings ein Implementierungsdetail und wahrscheinlich nicht das, was Sirius 3 meinte. Der Rat, HTML nicht mit regulären Ausdrücken zu verarbeiten ist prinzipieller Natur und mittles der Theorie formaler Sprachen begründbar (siehe z. B. https://de.wikipedia.org/wiki/Chomsky-Hierarchie )
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

Ich habe es ja mittlerweile mit BeautifulSoup abgeändert.
Nur leider bekomme ich so keine Ausgabe von den Links.
Hier mal mein Code so weit:

Code: Alles auswählen

import urllib.request
import lxml
import re
from bs4 import BeautifulSoup

site = "https://www.instagram.com/"
nm = input("Username\n")
profile = site + str(nm) + "/"
print("Connencting to ", profile)
# #connect to a URL
website = urllib.request.urlopen(profile)

# #read html code
html = website.read()
    #.decode('utf-8')

soup = BeautifulSoup(html, "lxml")

#print(soup.prettify())

for link in soup.find_all('a'):
    print(link.get('href'))
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Seite die du so herunterlädst ist genauso blank, wie die Seite die du im Brower ohne Javascript siehst. Wie schon erwähnt ist die einzige sinnvolle Lösung hier die API zu nutzen.

Wenn du unbedingt eine instabile schlechte und komplizierte "Lösung" haben möchtest musst du z.b. mit Selenium Instagram in einem Browser starten und den DOM auswerten.
ElectricHamter9o
User
Beiträge: 9
Registriert: Donnerstag 28. Juli 2016, 17:33

mhh naja ist dann wohl so.
Dann lass ich das "Projekt" jetzt fallen.

Das Thema hier kann gelöscht werden.

Tut mir leid die Zeit von einigen hier unnötigerweise beansprucht zu haben
Antworten