Webseite Inhalte laden (dynamische Inhalte?)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo Leute, hier mal eine spannende Frage. Ich entwickle ein (hässliches) Skript, das helfen soll, viele unserer eigenen Fotos von einer freundlichen sozialen Seite herunterzuladen. Dabei fand ich ein Problem, das ich nicht ganz greifen kann.

Ich betrachte diese Url:
* http://animexx.onlinewelten.com/cosplay ... 6/#seite=0

Unten auf der Seite gibt es eine Fotogalerie mit 15 von insgesamt 21 Fotos. Ich möchte diese 15 alle herunterladen, und auch die 6 auf der nächsten Seite.

Wenn ich bei mir im Browser auf den Link zu Seite 2 klicke, komme ich auf diese URL:
* http://animexx.onlinewelten.com/cosplay ... 6/#seite=1

Es ist die gleiche URL, mit einem anderen Ende. Da sehe ich die letzten 6 Fotos dieser Galerie (in meinem Browser). So weit ist alles klar.

Nur jetzt, wenn ich die beiden Urls per urllib2.urlopen abrufen will, erhalte ich immer den Inhalt der ersten Seite, ganz egal welche ich anfrage:

Code: Alles auswählen

>>> from urllib2 import urlopen
>>> url1 = "http://animexx.onlinewelten.com/cosplay/mitglied/6125/order_1_0/4336/#seite=0"
>>> url2 = "http://animexx.onlinewelten.com/cosplay/mitglied/6125/order_1_0/4336/#seite=1"
>>> url1 == url2
False
>>> urlopen(url1).read() == urlopen(url2).read()
True
Was passiert hier? Ich sehe ein kleines drehendes Icon (in meinem Browser, wenn ich die Galerie-Seitenzahlen anklicke). Vielleicht werden Daten dynamisch nachgeladen, oder so? Wie kann Python das greifen?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BlackJack

@Kebap: Das nach ``#`` ist ja eine „Sprungmarke” *innerhalb* der Seite und damit für das abrufen der URL irrelevant. Ganz offensichtlich werden die Bilder/Seiten von der Gallerie per JavaScript geladen. Da müsstest Du halt herausfinden wie das gemacht wird und welche URLs dafür abgefragt werden. Und dass dann per Python machen.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

An der Stelle würde ich mit den Webdeveloper Tools deines Browsers nachsehen welche Inhalte von wo nachgeladen werden. Wenn du Glück hast, kriegst du eine direkte URL zu allem was du dir jemals davon schnappen willst oder sogar eine JSON API mit der du per REST oder ähnlichem interagieren kannst.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Man könnte auch Selenium nutzen.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Wollte eig. schon aufgeben aber... hier zumindest meine raw solution.

Code: Alles auswählen

import mechanize
from bs4 import BeautifulSoup
import urllib
import time

def check(site, links):
    checked = []
    mech= mechanize.Browser()
    mech.set_handle_robots(False)
    mech.open(site)
    for link in mech.links():
        if link.url.startswith("/cosplay/mitglied/6125/"):
            checked.append(link.url)
    chkd = list(set(checked))
    for i in chkd:
        if i in links:
            chkd.remove(i)
    return chkd[0]


url = "http://animexx.onlinewelten.com"
start = "http://animexx.onlinewelten.com/cosplay/mitglied/6125/4336/494616/"
links = []

while len(links) < 20:
    link = check(start, links)
    links.append(link)
    start = "{}{}".format(url, link)
links = map(lambda x: "{}{}".format(url, x), links)


imgs = []
mech = mechanize.Browser()
mech.set_handle_robots(False)
for link in links:
    tag = link.replace("http://animexx.onlinewelten.com/cosplay/mitglied/6125/4336/", "")[:-1]
    a = mech.open(link)
    for i in BeautifulSoup(a.read()).findAll("img"):
        if tag in i["src"]:
            imgs.append(i["src"])

for num, img in enumerate(imgs):
    urllib.urlretrieve(img, "{}.jpg".format(num))
Der Trick war es dem Album Bild für Bild zu folgen. Den dynamisch erzeugten Inhalt, hab ich auch nicht ausgelesen bekommen.
Wenn du die Module nicht hast oder nicht Installieren möchtest, hier die reinen Bilder Links, sofern die noch benötigt werden:

Code: Alles auswählen

['http://media.animexx.onlinewelten.com/himitsu/fotos/0/73700/4500/160442.jpg?st=6RIx88HfHytA8yIbgEa7iQ&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/97/48597/1843/65301.jpg?st=PDbu1dHZ0GsINsnLajjYtA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/26/64026/1848/65060.jpg?st=fGG0HzqNymVbM3k7-fIqBA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/56/5756/2304/80605.jpg?st=0G3QMe3gtn71a9eA1BukiQ&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/56/5756/2304/80609.jpg?st=qjRphJ-MvYNJ0lajDCU5WA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/65/58065/1976/68707.jpg?st=BoTo-ISFoNMN2BhyagXZfw&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/55/62955/1935/75009.jpg?st=hL29nscmMDcGOVXsVslsvQ&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/67/97267/2031/70974.jpg?st=NsyZuB8yxWJb7vy8-QSgKw&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/56/35456/2038/71555.jpg?st=0TsQsOl9lmAlE-FgzAEWUA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/56/35456/2038/71557.jpg?st=qiY81Xo6k5jK7bOH-yXoog&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/55/62955/1935/68234.jpg?st=049pSAq15xBoxS-_Dzv_iw&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/53/18953/1845/65324.jpg?st=R4JPu8_Bm7BMTkR348Cxzg&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/59/67059/1833/63914.jpg?st=lfZdVEXGpIgrKIQUhimBIg&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/59/67059/1833/63916.jpg?st=w6SqBCMaOt9biuXcIvljzA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/59/67059/1833/63915.jpg?st=B0wdpWPdI7XbaAfQHP9zIQ&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/96/22796/1842/64256.jpg?st=b1yBxgcEtv2RJUptbIxt1g&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/76/48576/1805/63055.jpg?st=-UsDo-WMZhEI2DpLvaTcKQ&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/76/48576/1805/63059.jpg?st=yybGkWRQIKFRQDPQpt0QjA&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/96/55096/1808/63120.jpg?st=NUbF_QEfbSVDqyvurrXQ5w&e=1381557600', 'http://media.animexx.onlinewelten.com/himitsu/fotos/2/54502/1809/63133.jpg?st=ymztHcvgDiWubIjZsNsjzw&e=1381557600']
Antworten