Crawler?

julia123

Erfahrenes Mitglied
Hi Leute,

ich wollte ein kleines Programm schreiben das eine Seite einlies.
.

Mein Problem ist dass ich es nicht schafe über die URL einfach die nächste Seite auf zu rufen. also in dem ich am ende der URL einfach z.b eine 2 anhänge. "https://www.gulp.de/gulp2/projekte/suche?2"
Das funktioniert aus irgendeinem Grund nicht.

Daher such ich jetzt eine Methode mit der man einfach auf z.B. den Pfeil klicken kann und so die nächste Seite auf zu rufen.

Habt ihr eine paar vorschläge wie man es besser machen kann oder so?

Beste Grüße

julia
 
Zuletzt bearbeitet:
Ich versteh das nicht. Es funktioniert immer noch nicht. ich hab das mal so ausgeführt.

Code:
<?php
      
          
        include('simple_html_dom.php');
        // Create DOM from URL
        $html = file_get_html('https://www.gulp.de/gulp2/projekte/suche?23-3.ILinkListener-projectSearch-resultListContainer-pagingNavigatorTop-navigation-0-pageLink&scope=projects');
      
       
           
?>

Leider bekomm ich diese Meldung:

Warning: file_get_contents(https://www.gulp.de/gulp2/projekte/...gatorTop-navigation-0-pageLink&scope=projects): failed to open stream: Redirection limit reached, aborting in C:\xampp\htdocs\testphp\simple_html_dom.php on line 75




Ps: Ich werd dem Betreiber wegen der Zulassung anschreiben und Ihn auch in meinen Quellcode nennen.
 
Weil es eine Redirection ist, aber noch irgendwas mit den
Cookies passiert, damit du die anderen Seiten auch erreichen darst.
=> Mit file_get_html wird das nichts.
CUrl, Firebug usw.usw.
 
Ich bin leider nicht wirklich voran gekommen, hier mein ergebnis:
Code:
    <?php
function file_get_contents_curl($url)
    {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
    }
 
    $html = file_get_contents_curl('https://www.gulp.de/gulp2/projekte/suche?23-3.ILinkListener-projectSearch-resultListContainer-pagingNavigatorTop-navigation-0-pageLink&scope=projects');
 
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
 
    $nodes = $doc->getElementsByTagName('p');
    $text = $nodes->item(0)->nodeValue;
    echo  $text;
 
?>

Was ich jetzt versucht hab ist die Session mit curl einzulesen. Und es soll den $text (Zu wenige oder nicht die richtigen Treffer?) ausgeben, welcher auf der Webseite unter der Trefferzahl angezeigt wird.

Ich hab im grunde nur versucht von der Seite GULP den Text("Zu wenige oder nicht die richtigen Treffer?") auszugeeben.Hier der Link:https://www.gulp.de/gulp2/projekte/suche?0&scope=projects

Hier die Quelle an diesem Beispiel hab ich mich orientiert http://stackoverflow.com/questions/3711357/getting-title-and-meta-tags-from-external-website

Zwei sachen die ich nicht verstehe ist einfach das ich Visuell ein Ergenis bekomme und die andere ob ich in den richtigen Tag navigiert habe.

Ansonsten bekomme ich noch diese Fehlermeldung
Notice: Trying to get property of non-object in C:\xampp\htdocs\testphp\cralwer.php on line 95
Das ist bei mir die Zeile
Code:
$text = $nodes->item(0)->nodeValue;


Hier ist ein zweiter Versuch von mir mit cURL welches mich auch nicht wirklich weiter gebracht hat. Hier müsste er wenn es logisch ist alle Links ausgeben was er jedoch nicht tut.
Code:
<?php
    include('simple_html_dom.php');

  
    $base = 'https://www.gulp.de/gulp2/projekte/suche?23-3.ILinkListener-projectSearch-resultListContainer-pagingNavigatorTop-navigation-0-pageLink&scope=projects';
  
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_URL, $base);
    curl_setopt($curl, CURLOPT_REFERER, $base);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    $str = curl_exec($curl);
    curl_close($curl);

    // Create a DOM object
    $html_base = new simple_html_dom();
    // Load HTML from a string
    $html_base->load($str);

    //get all category links
    foreach($html_base->find('a') as $element) {
        echo "<pre>";
        print_r( $element->href );
        echo "</pre>";
    }

    $html_base->clear();
    unset($html_base);



?>
 
Zuletzt bearbeitet:
Das ist schon eher ein schwierigeres Thema, gerade wenn man gerade erst anfängt mit PHP (teilweise muss man für die Pagination bestimmte Cookies und/oder Header mitschicken, damit man überhaupt etwas zurückbekommt.). Vieleicht hast du Glück und es funktioniert mit den default-Einstellungen mit fertigen Crawlern ( https://github.com/FriendsOfPHP/Goutte ), ansonsten musst du erstmal alle Header mitschicken und gucken welche du auf jedenfall brauchst. Ist ein bisschen Arbeit und als Anfänger kaum zu schaffen, sag ich mal. Mit ein bisschen Geduld aber machbar. Daneben solltest du unbedingt auch @sheel s Hinweis bezühlich der rechtlichen Implikationen beachten.
 
Ok, Danke.

Also dann taste ich mich jetzt einfach ran.

1.
Zu erst Probier ich mal diese library die du erwähnt hast.Und stosse bei der Installation schon auf ein Problem. Es wird gesagt :
Add fabpot/goutte as a require dependency in your composer.json file:

composer require fabpot/goutte

Kann mir jemand erkären wie ich das mache.

2. Gibt es vielleicht mehr zu dieser library. Mehr Beispiele oder eine erkärung. Ich weiss nehmlich nicht wie ich es es anwenden kann, an meinem Projekt.

3.Ok, gehen wir davon aus ich hab kein Plan. Kann man mir vielleicht mehr Typ s geben. Würd mich auf ein paar gute Links freuen um mein Problem lösen zu können und hinter die Logik zu kommen.
Quellcode Beispiele...

4. Und aus diesem cURL wurde ich ehrlich gesagt auch nicht schlauer. Ich weiss das es Zustände(Sessions) erzeugt und man damit halt Webseiten local ausführen kann, Transaktionen ausführen, Datenaustausch(Alles sehr schwamisch ich wiess). Aber wie geht dass, im bezug auf das was ich möchte einfach eine Webseite parsen, und dass auch am bessten am Quellcode erklärt. Ich erwarte keine Lösung aber vielleicht kann mir jemand weiter helfen.
 
1.) https://getcomposer.org/
Du solltest PHP bei dir lokal installiert haben. Dann kannst du Composer installieren. Dann kannst du diese Bibliothek installieren.

2.) Eigentlich macht die Library garnicht soviel, außer das ganze cURL Gedöns was du oben auch schon probiert hast. Nur benutzt es sehr viel mehr Einstellungsmögichkeiten und verwaltet vorallem Cookies für dich. Das hast du oben NICHT gemacht.

3,) Ein guter Trick ist es, sich die Unit-Tests anzuschauen um zu sehen, was die Software so alles kann. Wie gesagt, das sind schon eher fortgeschrittene Themen, ich gehe mal davon aus das du PHP OOP beherrschst, sonst brauchen wir garnicht weiter machen. In diesem Fall interessant: https://github.com/FriendsOfPHP/Goutte/blob/master/Goutte/Tests/ClientTest.php#L63 Ich würde aber erstmal mit den einfachsten Aufrufen wie unter "Usage" beschrieben anfangen und schauen, was du da zurückbekommst. (Tipp: Was du da zurückbekommst siehst du mit $crawler->getClient()->getResponse() ) Es lohnt sich auch, sich mal die Quellcodes anzugucken. Das kannst du aber eigentlich auch nur machen, wenn du das Abhängigkeitsmanagement von Composer kennst. Weitere Alternative: Eine andere Bibliothek suchen, die vielleicht noch ohne Composer arbeitet. Solche Projekte sind aber meistens veraltet...

4.) cURL ist eigentlich das: https://de.wikipedia.org/wiki/CURL Es existieren aber erweiterungen für viele Programmiersprachen die cURL eben auch in den jeweiligen Sprachumgebungen vefügbar machen. So auch für PHP. Und dann gibt es wiederum Biblitheken, die dir die Arbeit damit erleichtern, wie zB Goutte.
 
hi ich hab mich jetzt mehr mit dem Thema auseinandern gesetzt. Ich hab mal versucht dieses Video https://www.youtube.com/watch?v=_kQN-3aNCeI um zusetzten. Was ich einfach nicht verstanden hab wieso bei dem im Video die Seite 1 zu 1 angezeigt wird und bei mir nicht. Bei Minute 2:09 kann man sehen wie er die Methode grab_page() ausführt. Ich hab das Ganze auch probiert und zwar auf Wikipedia.

Bei mir wird kein Fehler angezeigt sonderen einfach nur eine weisse Seite. Wenn ich die Seite untersuche steht da so etwas:

<html>

<head></head>
<body>
</body>
<script id="dnt-inject-js" src="https://sc1.checkpoint.com/dev/abine/scripts/inject.js" type="application/x-javascript"></script>
<script id="dnt-inject-js" src="https://sc1.checkpoint.com/dev/abine/scripts/inject.js" type="application/x-javascript"></script>
<script id="dnt-inject-js" src="https://sc1.checkpoint.com/dev/abine/scripts/inject.js" type="application/x-javascript"></script>
.
.
.

Meine Konsole zeigt mir diese Fehler:

Bei der Methode "echo grab_page('https://de.wikipedia.org/wiki/Kempten_(Allgäu)');"
Die Zeichenkodierung des HTML-Dokuments wurde nicht deklariert. Das Dokument wird in manchen Browser-Konfigurationen mit verstümmeltem Text dargestellt, wenn das Dokument Zeichen außerhalb des US-ASCII-Bereichs enthält. Die Zeichenkodierung der Seite muss im Dokument oder Transferprotokoll deklariert werden.



Bei der Methode login()
TypeError: dntPageEvents is not a function


getPreventDefault() sollte nicht mehr verwendet werden. Verwenden Sie stattdessen defaultPrevented.


TypeError: dntPageEvents is not a function
 

Neue Beiträge

Zurück