Mehrere Seiten gleichzeitig unsichtbar öffnen (ca.20)

  • Hallo zusammen,
    1. Ich möchte mit dem IE ($oIE) mehrere Seiten gleichzeitig, bzw in kurzem Abstand öffnen.
    2. Dann warten bis bestimmte Dateien, (deren jeweiliger Dateiname einen bestimmten String enthält) in den temporären Internet Dateien gelandet ist. Dann sollte sich diejenige Seite/Tab wieder schliessen
    (2. wäre nicht ganz so wichtig, aber nett zu haben)
    3. Sollen dann die Dateien aus dem Cache an einen anderen Ort kopiert werden (nicht so kompliziert), (und nach Links durchsucht werden, komplizierter)
    Letzteres mache ich bisher per "egrep" unter Cygwin,

    Code
    egrep -o -h 'http://[^"]*' /home/xxx/datei >> /home/xxx/neue_Datei.txt


    denke aber, das Autoit eine ähnliche Funktion enthalten wird..
    Bisher bin mehr oder unelegant vorgegangen und zwar so:

    [autoit]

    #include <IE.au3>
    ProcessClose("iexplore.exe")
    Sleep(500)
    Run("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8") ;leert zuerst den cache
    $oIE = _IECreate("seite1.com/test", 0, 0)
    $oIE = _IECreate("seite2.com/test", 0, 0)
    $oIE = _IECreate("seite3.com/test", 0, 0)
    ProcessClose("iexplore.exe")

    [/autoit]


    So landen dann auch die gewünschten Dateien im Cache (der zuerst geleert wird).
    Es werden natürlich auch diverse iexplore Prozesse gestartet, zwar unsichtbar, aber immerhin.
    Das geht doch mit Sicherheit eleganter..;)

  • 1. Ich möchte mit dem IE ($oIE) mehrere Seiten gleichzeitig, bzw in kurzem Abstand öffnen.


    Warum mit dem IE? Würdest du WinHttp oder (Web)TCP benutzen sparst du dir ne Menge
    1. Arbeitsspeicher
    2. Prozessorauslastung
    3. Zeit

    Ganz einfach würde es statt mit WinHttp & co auch mit InetRead / InetGet gehen - sogar gleichzeitig.
    Da alle 4 textbasiert sind, sparst du dir auch das laden von Werbung, Bildern, Flash, JavaScript, Videos usw - du bekommst nur den Quelltext der Seite zurück.

    2. Dann warten bis bestimmte Dateien, (deren jeweiliger Dateiname einen bestimmten String enthält) in den temporären Internet Dateien gelandet ist. Dann sollte sich diejenige Seite/Tab wieder schliessen
    (2. wäre nicht ganz so wichtig, aber nett zu haben)


    Was für Dateien? Warum liest du nicht einfach den (in Schritt 1 angesprochen) Quelltext der Seite aus, liest die Links der Dateien aus und lädst Sie selbst herunter?

    3. Sollen dann die Dateien aus dem Cache an einen anderen Ort kopiert werden (nicht so kompliziert), (und nach Links durchsucht werden, komplizierter)

    [autoit]

    StringRegExp

    [/autoit]
  • Zitat


    Ganz einfach würde es statt mit WinHttp & co auch mit InetRead / InetGet gehen - sogar gleichzeitig.
    Da alle 4 textbasiert sind, sparst du dir auch das laden von Werbung, Bildern, Flash, JavaScript, Videos usw - du bekommst nur den Quelltext der Seite zurück

    Tja, so einfach ist es nicht, ansonsten hätte ich mir ein kleines Shell Script gebastelt und die Seiten mit CURL/Wget geladen.
    Kurze Erklärung: Beim laden der Seite mit FF/IE (Authentifizierug notwendig), wird dynamisch ein Link generiert, der eine zeitbegrenzte Gültigkeit hat. Eine kleine Datei wird dabei im Cache gespeichert, aus der man diesen Link auslesen kann. Im Quelltext ist er nicht enthalten.
    Also Quelltext auslesen fällt weg!
    Und der IE aus dem Grund, weil dort die entsprechenden Dateien sehr einfach im Cache zu finden sind. Beim FF werden sie umbenannt und sind damit nutzlos.
    Fazit: Es geht nur so, wie ich es beschrieben habe...(zudem beim Aufruf der Seiten noch "X-forwarded-for" gesetzt sein muss und die ganze Geschichte noch zusätzlich über TOR läuft...) ;)
    Kann man nicht, den IE nur einmal laden, und die ganzen Seiten in Tabs?

    Zitat

    Hab ich schon gefunden.
    Ist aber mehr oder weniger eine Auflistung/Erklärung der versch. Regular Expressions.
    Meine Syntax ist schon ok, funktioniert z.B. auch zuverlässig in Notepad++
    Ein kleines Beispiel, das den obigen egrep Aufruf umsetzt und das gefundene, in eine Datei schreibt, bzw. es an diese anhängt, wäre nett. Der Rest ist schon nervig genug.. :rolleyes:
    thanks im voraus

    4 Mal editiert, zuletzt von vel2000 (29. April 2011 um 15:05)

  • Hi zu deiner Frage mit dem IE:

    Es gibt eine undokumentierte Funktion in der IE.au3 die es ermöglicht mehrere Tabs zu öffnen. Einen Vorteil sehe ich darin allerdings nicht, im Taskmanger erscheinen auch beim tabbed Browsing jeweils eigene Prozesse für jeden Tab. Ausserdem sollten über den Parameter ieattach von iecreate ebenfalls Tabs genutzt werden.

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ;
    ; Function Name: __IENavigate()
    ; Description: ** Unsupported version of _IENavigate (note second underscore in name)
    ; ** Last 4 parameters insufficiently tested.
    ; ** - Flags and Target can create new windows and new browser object - causing confusion
    ; ** - Postdata needs SAFEARRAY and we have no way to create one
    ; Directs an existing browser window to navigate to the specified URL
    ; Parameter(s): $o_object - Object variable of an InternetExplorer.Application, Window or Frame object
    ; $s_Url - URL to navigate to (e.g. "http://www.autoitscript.com")
    ; $f_wait - Optional: specifies whether to wait for page to load before returning
    ; 0 = Return immediately, not waiting for page to load
    ; 1 = (Default) Wait for page load to complete before returning
    ; $i_flags - URL to navigate to (e.g. "http://www.autoitscript.com")
    ; $s_target - URL to navigate to (e.g. "http://www.autoitscript.com")
    ; $spostdata - URL to navigate to (e.g. "http://www.autoitscript.com")
    ; $s_headers - URL to navigate to (e.g. "http://www.autoitscript.com")
    ; Requirement(s): AutoIt3 V3.2 or higher
    ; Return Value(s): On Success - Returns -1
    ; On Failure - Returns 0 and sets @ERROR
    ; @ERROR - 0 ($_IEStatus_Success) = No Error
    ; - 1 ($_IEStatus_GeneralError) = General Error
    ; - 3 ($_IEStatus_InvalidDataType) = Invalid Data Type
    ; - 4 ($_IEStatus_InvalidObjectType) = Invalid Object Type
    ; - 6 ($_IEStatus_LoadWaitTimeout) = Load Wait Timeout
    ; - 8 ($_IEStatus_AccessIsDenied) = Access Is Denied
    ; - 9 ($_IEStatus_ClientDisconnected) = Client Disconnected
    ; @Extended - Contains invalid parameter number
    ; Author(s): Dale Hohm
    ;
    ; http://msdn.microsoft.com/workshop/brows…s/browsernavcon
    ;
    ; Flags:
    ; navOpenInNewWindow = 0x1,
    ; navNoHistory = 0x2,
    ; navNoReadFromCache = 0x4,
    ; navNoWriteToCache = 0x8,
    ; navAllowAutosearch = 0x10,
    ; navBrowserBar = 0x20,
    ; navHyperlink = 0x40,
    ; navEnforceRestricted = 0x80,
    ; navNewWindowsManaged = 0x0100,
    ; navUntrustedForDownload = 0x0200,
    ; navTrustedForActiveX = 0x0400,
    ; navOpenInNewTab = 0x0800,
    ; navOpenInBackgroundTab = 0x1000,
    ; navKeepWordWheelText = 0x2000
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    #include <ie.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $myIE = _IECreate()
    __IEnavigate($myIE, "www.google.com", 0, 0x800)
    __IEnavigate($myIE, "www.chip.de", 0, 0x800)
    __IEnavigate($myIE, "www.heise.de", 0, 0x800)
    __IEnavigate($myIE, "www.gidf.de", 0, 0x800)

    [/autoit]

    Wenn du weiterhin IEcreate verwenden willst würde ich noch den 4. Parameter auf 0 setzen damit die Fenster alle zeitgleich geladen werden und nicht jedesmal gewartet wird. Sofern nach dem Aufruf der Webseiten noch interaktionen notwendig sind solltest du ausserdem jedem Fenster eine eigene Variable zuweisen und diese nicht überschreiben wie du es ja derzeit tust. Bei sehr vielen Fenstern solltest du die Objekte in einem Array speichern:

    [autoit]


    #include <ie.au3>

    [/autoit][autoit][/autoit][autoit]

    Dim $urlArray[4] = ["www.google.com","www.chip.de","www.heise.de","www.gidf.de"]
    Dim $IEobj[4]

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 to UBound($urlArray) - 1
    $IEobj[$i] = _IECreate($urlArray[$i], 0, 1, 0)
    Next

    [/autoit][autoit][/autoit][autoit]

    Sleep(10000) ; nur zu demozwecken
    ; antelle des sleeps kannst du hier ja dann eine Schleife einbauen die dir den Inhalt des Cache Ordners überwacht und die Dateien dann entsprechend parsed und kopiert...
    ; _FileListToArray / fileexists() / filecopy() / filewrite() / fileread() / _filereadtoarray() / filewritefromArray() / _arraysearch() dürften dich da interessieren plus natürlich die string und regexp Funktionen.

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 to UBound($IEobj) - 1
    _IEQuit($IEobj[$i])
    Sleep(2000) ; nur zu demozwecken
    Next

    [/autoit]
  • SO,
    ich habe jetzt mal alles durchprobiert und es funktioniert auch irgendwie....
    Das Problem ist aber, erstens dauert es sehr lange und zweitens laden die Seiten ewig weiter, und da sie Flash-Movies beinhalten, ist die Bandbreite recht schnell verbraucht. Zudem sind seit neuestem weitere Seitenaufrufe geblockt, solange ein Movie läuft.. :thumbdown:
    ABER: nach längerem hin und herüberlegen und probieren, hab ich festgestellt, daß es reichen würde, wenn man die einzelnen Links nacheinander aufruft.
    Mit anderen Worten so:
    Zuerst die Hauptseite aufrufen, warten bis die geladen ist (30 Sekunden) und dann auf dieser Seite nacheinander die Links aufrufen. Quasi das anklicken simulieren. (Adressen sind bekannt)
    Also zuerst http://hauptseite/ link1..dann ca . 20 Sekunden warten, http://hauptseite/Link2 "anklicken" usw.
    Ich habs auch mal so probiert:

    [autoit]

    #include <IE.au3>
    $oIE = _IECreate("http://abc.com", 0, 1, 0) ;das ist die Homepage
    Sleep(30000)

    [/autoit][autoit][/autoit][autoit]

    ;Link1
    Send("^t") ;neuen Tab öffnen
    Send("http://abc.com/view#abc1") ;internetseite angeben
    Send("{ENTER}") ;enter
    Sleep(15000) ;warten
    Send("^w") ;Tab schließen

    [/autoit][autoit][/autoit][autoit]

    Sleep(1000)

    [/autoit][autoit][/autoit][autoit]

    ;Link2
    Send("^t")
    Send("http://abc.com/view#abc2")
    Send("{ENTER}")
    Sleep(15000)
    Send("^w")

    [/autoit][autoit][/autoit][autoit]

    Sleep(1000)

    [/autoit]


    Funktioniert allerdings nur solange das Fenster den Fokus behält.... :(
    Zweitens werden die Links in dem Format: "view#abc2" als "viewabc2" übermittelt, also unbrauchbar.
    Den Rest, das kopieren und auslesen, habe ich mittlerweile hinbekommen. es geht also nur noch um den Seitenaufruf

    Einmal editiert, zuletzt von vel2000 (30. April 2011 um 11:13)

  • servus vel2000

    Ich glaube schon das das sehr gut mit der TCP Methode möglich ist. Immerhin bekommst du ja alle Rohdaten die der Server schickt.
    Wenn dann da irgendwas als Cookie oder so abgelegt wird, kommt es ja mit dem Header mit...

    Den kannst du leicht mit der _INetGetSourcePostCookie() bekommen und verabeiten..
    Guck mal unter volgendem Link.. da ist ein login Bsp. zu wkw.

    Dieses _IECreate ist nicht schön ;)

    MFG chris :D

  • Zitat

    Zweitens werden die Links in dem Format: "view#abc2" als "viewabc2" übermittelt, also unbrauchbar.

    Wo wird was übermittelt? Redest du von den Links in dieser Cache Datei? Wenn ja musste halt noch bei jedem Link ein

    [autoit]

    stringreplace($link,"view","view#")

    [/autoit]

    machen bevor du das dann in deine Linkliste speicherst. Warum du nun mit Send Befehlen rum machst versteh ich auch nicht. Hatte dir doch Beispiele genannt wie man mit mehreren Fenstern arbeitet oder auch Tabs erzeugt.
    Da du das ganze ja sowieso unsichtbar laufen lässt ist es doch ziemlich wurscht ob Tabs oder Fenster verwendet werden. Anstatt einen Tab zu öffnen und zu schliessen kannst du auch _ienavigate verwenden, ausserdem gibt es eine Funktion namens ieloadwait wenn ich mich nicht irre dann wartest du nur solange bis wirklich alles geladen ist.

    Was deine Ladezeiten dank Flash (und vorallem wohl auch dank TOR) angeht... Alternativen wie inetget oder winhttp wurden ja schon genannt. Auch könntest du diverse Addons nutzen um Flash und Javascript teilweise oder auch komplett zu blocken. Die Frage ist doch was du eigentlich mit deinem Script erreichen willst. Um welche Seite geht es (wirklich abc.com) ?

  • Zitat

    Wo wird was übermittelt? Redest du von den Links in dieser Cache Datei? Wenn ja musste halt noch bei jedem Link ein

    nein, wenn wie im obigen Beispiel

    Code
    Send("http://abc.com/[color=#ff0000]view#abc1[/color]") geschickt wird, erhält der IE nur http://abc.com/[color=#ff0000]viewabc1[/color]


    Aber egal, da diese Methode nichts taugt.
    Separate Authentifizierung ist nicht nötig, erledigt der Browser automatisch.
    Separate Fenster/Tabs funktioniert auch nicht mehr, da alle anderen geblockt sind, sobalt das erste Fenster/Tab, die Authorisierung erhalten hat! (ging aber mal)
    Dh: Entweder müssen die Fenster ein nach dem anderen geöffnet und geschlossen werden (funktioniert, aber saulahm), oder am besten Mausklicks auf die entsprechenden Links simuliert werden.
    Wenn ich die Links manuell anklicke, habe ich die gewünschten Dateien nämlich innerhalb von 5-10 Sekunden pro Link. Bei der Seite handelt es sich um Zatt** Schweiz.
    Ein entsprechender Link sieht so aus. (Mit Firebug ermittelt):

  • Öhm naja wie gesagt verwende doch _ienavigate:

    [autoit]


    $myIE = _IECreate()
    _IENavigate($myIE,"www.google.de")
    Sleep(1000)
    _IENavigate($myIE,"www.chip.de")
    Sleep(1000)
    _IENavigate($myIE,"www.heise.de")
    Sleep(1000)
    _IENavigate($myIE,"http://autoit.de/index.php?page=Thread&postID=218320#post218320") ; geht auch wenn raute-zeichen in der url vorkommen
    Sleep(5000)
    _IEQuit($myIE)

    [/autoit]

    Send funktioniert oft nicht vernünftig und ist auch fehl am Platz beim IE, dafür gibt es ja spezielle Funktionen die nahezu alle Browseroperationen erledigen können.

  • Zitat

    Öhm naja wie gesagt verwende doch _ienavigate:


    Dein Beispiel mit google, heise etc. funktioniert.
    Bei meinen gewünschten Seiten, wird jedoch nur die erste geladen. Ich vermute mal wegen der Flash-Livestreams.

    [autoit]

    $myIE = _IECreate()
    _IENavigate($myIE,"zattoo.com/view#rtl")
    Sleep(1000)
    _IENavigate($myIE,"zattoo.com/view#prosieben")
    Sleep(1000)
    _IENavigate($myIE,"zattoo.com/view#ard")
    Sleep(1000)

    [/autoit]


    In der IE Eingabezeile, werden die anderen beiden zwar kurz angezeigt, aber nicht geladen
    EDIT: mir ist gerade was seltsames aufgefallen...
    Wenn z.B.: die Seite "zattoo.com/view#rtl" geladen ist, und ich paste "zattoo.com/view#prosieben" in die Eingabezeile und drücke "Enter", wird die Seite ebenfalls nicht geladen ?( . Nur wenn ich F5 drücke, oder den "aktualisieren" Button anklicke.
    Was ist das denn nun wieder? IE9

    Einmal editiert, zuletzt von vel2000 (1. Mai 2011 um 08:12)

  • Liegt nicht an IE9, habe ich auch im 8er wenn ich das per Hand versuche. Aber es gibt eine sehr schnelle Lösung mittels IE Funktion um die einzelnen Channel abzurufen:

    [autoit]


    $myIE = _IECreate()
    _IENavigate($myIE,"zattoo.com")
    ;Sleep(10000)
    _IEImgClick ( $myIE, "ZDF" , "alt" )
    Sleep(1000)
    _IEImgClick ( $myIE, "Das Erste" , "alt" )
    Sleep(1000)
    _IEImgClick ( $myIE, "Sport1" , "alt" )
    Sleep(1000)
    _IEImgClick ( $myIE, "KI.KA" , "alt" )
    Sleep(1000)
    _IEImgClick ( $myIE, "3sat" , "alt" )
    Sleep(1000)
    _IEImgClick ( $myIE, "PHOENIX" , "alt" )
    Sleep(1000)

    [/autoit]

    Da ich nachwievor nicht weiss was du da genau auslesen willst und warum du die Channel dafür aufrufst kann ich dir da denke ich auch nicht weiter helfen. Ich vermute du willst an die Stream Links rankommen um sie jederzeit auch extern nutzen zu können? Wie dem auch sei, mit obigem Beispiel kann man die Channel sehr schnell durchgehn, ob das so reicht damit die Streamlinks im Cache landen weiss ich nicht, ggf. musst du zwischen jedem chan wechsel eine Schleife laufen lassen die dann eben den Cache prüft und erst dann den Channel wechselt wenn der Link oder was auch immer ausgelesen werden konnte. Die einzelnen "ALT" Namen der Bilderlinks kannst du dem Quellcode entnehmen.

    Einmal editiert, zuletzt von misterspeed (1. Mai 2011 um 13:51)

  • Das funktioniert bei mir nicht, es wird Zattoo aufgerufen und dann gehts nicht weiter. Hatte ich aber auch schon ausprobiert. Liegts vielleicht am IE9?

    Zitat

    Ich vermute du willst an die Stream Links rankommen um sie jederzeit auch extern nutzen zu können?

    Richtig, ich habe mir eine kleine Batch geschrieben, über die ich die Programme im externen Programm (TvBrowser) umschalten und mit VLC abspielen kann. Und damit den unsäglichen Flash Mist loswerden kann.

    Würde das channel switching vielleicht mit FF einfacher gehen? Man könnte FF im Debug-Modus starten, dann landet eh alles in einer .log Datei. Die Logdatei mit grep auslesen...fertig ;)
    Habe ich allerdings erst vor kurzem gefunden, daher meine vorherigen Versuche mit dem IE

  • Ich habs jetzt mal mit der FF.au3 probiert, automatisches Link klicken funktioniert damit leider auch nicht.
    Hmm, scheint also keine Möglichkeit zu geben, die zattoo links automatisch "anzuklicken"
    Schade eigentlich

  • Bin mir sicher, dass das in FF ebenfalls geht. Poste doch mal dein Testscript und die Log Ausgabe der Console vom Scite Editor. Was die Sache mit IE9 angeht kann ich dir nicht sagen ob es daran liegt, benutze noch den 8er. Vielleicht liegt es auch schlichtweg an TOR und einer etwas langsamen Verbindung. Müsstest eben mal testen ob ein _ieloadwait zwischen den Seitenaufrufen hilft.

  • erstmal danke für eure Antworten, aber ich habs aufgegeben.
    Nach einigem testen, wäre das interessante an Autoit, das automatische anklicken von Links gewesen, ohne ein neues Fenster/Tab zu öffnen. (zu lange Ladezeiten)
    Das habe ich aber weder mit IE.au3 noch FF.au3 hinbekommen...
    Von daher ist der Thread-Titel jetzt eigentlich nicht mehr passend.
    Vielleicht eröffne ich einen neuen Thread.