Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Crawler - SQLite database nutzen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Crawler - SQLite database nutzen

    Hallo,

    ich habe - wie diverse andere hier im Forum - einen Crawler zusammengebastelt. Der Crawler durchsucht Webseiten nach Links. Ich habe jetzt das Problem, dass der Crawler für eine Webseite mit 20 Links ca. 30-60 Sekunden benötigt. Bei größeren Webseiten kommt manchmal sogar kein Ergebnis. Das Ergebnis sieht dann so aus, dass er alle gefundenen Links auflistet.

    Nach eigenen Recherchen habe ich nun gelesen, dass der Prozess des Crawlens im Arbeitsspeicher stattfindet. Diese Variante soll nicht die schnellste und beste sein. Daher soll es die Möglichkeit geben, für den Prozess die Variante mit SQLite Database zu nutzen.
    Ich würde gern diese Möglichkeit ausprobieren. Jedoch habe ich die Erwartung, dass ihr mir bitte keine fertige Lösung auf dem Silbertablett liefert (sofern es sowas gibt). Am liebsten wäre eine Anleitung, damit ich jeden Schritt auch nachvollziehen und es selber machen kann. Wie und wo muss ich das Script umschreiben, damit es funktioniert.




  • #2
    Was soll hier eine SQLite-Datenbank bringen?

    Kommentar


    • #3
      Das Crawlen / Bearbeiten von größeren Seiten ermöglichen. Ich hoffe und vermute, dass dadurch vielleicht der ganze Prozess schneller werden könnte. Falls ich total auf dem Holzweg sein sollte, dann lege ich mich wieder hin.

      Kommentar


      • #4
        Schneller ist es auf jeden Fall im Speicher. Und wenn du nicht vor hast eine Webseite mit Millionen von Seiten zu crawlen, sollt es auch zu keiner Speicherknappheit kommen.

        Kommentar


        • #5
          20 Seiten in 30-60 Sekunden, das sind pro Seite 1,5 bis 3 Sekunden - je nach der Latenz der Seiten klingt das erstmal nicht aussergewöhnlich viel. Ohne zu Wissen, was dein Crawler genau macht oder wie es implementiert ist kann man ohnehin keine Tipps geben. Welche Verarbeitungsgeschwindigkeit erhoffst du dir denn?
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Der Crawler durchsucht Webseiten nach Links. Ich habe jetzt das Problem, dass der Crawler für eine Webseite mit 20 Links ca. 30-60 Sekunden benötigt. Bei größeren Webseiten kommt manchmal sogar kein Ergebnis. Das Ergebnis sieht dann so aus, dass er alle gefundenen Links auflistet.
            Wie ist das denn genau gemeint? Geht es darum, den Links zu folgen (also noch mehrere HTTP-Requests während der erwähnten Zeitdauer auszuführen), oder dauert die Verarbeitung des HTML-Codes einer einzigen Seite (ohne weitere Requests) so lange?

            Kommentar


            • #7
              Vielen Dank schon einmal für die vielen Antworten. Ihr könnt den Crawler unter: http://www.bebom.com/index.php ausprobieren. Ihr werdet feststellen, dass ein Ergebnis für eine Seite, wie http://www.Audi.de zum Beispiel, sehr lange dauert. Webseiten ohne hhtp:// vorneweg nimmt er irgendwie noch nicht an.

              @Mermshaus
              Im Moment wird nur in der ersten Ebene gearbeitet, ohne das der Crawler den Links oder Unterseiten folgt. Er listet lediglich die gefundenen Links auf. Diese Funktion, über die Ebene 1 hinaus zu suchen, sprich den Links folgen und die Unterseiten ebenfalls zu Crawlen, möchte ich demnächst versuchen zu implementieren.

              Ich zeig euch mal den Code, vielleicht habt ihr ja Ideen. Ich möchte ausdrücklich erwähnen, dass ich den Crawler übernommen und meinen Vorstellungen entsprechend angepasst habe.

              PHP-Code:
              <?php


              $to_crawl 
              $_POST["ziel"];         #DIE WEBSEITE, WELCHE DURCHSUCHT WIRD
              $c = array ();

              function 
              get_links($url) {    
                  global 
              $c;
                  
              $input = @file_get_contents($url);
                  
              $regexp "<a\s[^>]*href=("??)([^" >]*?)\\1[^>]*>(.*)<\/a>";    #Filter
                  
              preg_match_all("/$regexp/siU"$input$matches);
                  
              $base_url parse_url($urlPHP_URL_HOST);
                  
              $l $matches[2];
                  
                  foreach(
              $l as $link) {
                  
                  if (
              strpos($link"#")) {
                      
              $link substr($link0strpos($link"#"));
                  }
                  
                  if (
              substr($link,0,1) == ".") {
                      
              $link substr($link1);
                  }    
                  
                  if (
              substr($link07) == "http://") {
                      
              $link $link;
                  } else if (
              substr($link08) == "https://") {
                      
              $link $link;
                  } else if (
              substr($link02) == "//") {
                      
              $link substr($link2);
                  } else if (
              substr($link01) == "#") {
                      
              $link $url;
                  } else if (
              substr($link07) == "mailto:") {
                      
              $link "[".$link."]";
                  } else if (
              substr($link01) == "'") {
                      
              $link "'".$link."'";    
                  } else {
                      if (
              substr($link01) != "/") {
                          
              $link $base_url."/".$link;
                      } else {
                          
              $link $base_url.$link;
                      }
                  }
                          
                      if (
              substr($link07) != "http://" && substr($link08) != "https://" && substr($link,1    ) != "[" && substr($link,1    ) != "'") {
                          if (
              substr($url08) == "https://") {
                              
              $link "https://".$link;
                          } else {
                              
              $link "http://".$link;
                      }            
                  }

                  
              #echo $link."<br />";
                  
              if (!in_array($link$c)) {
                      
              array_push($c$link);
                      
              $c array_unique $c );
                  }
                  }
              }
                  
                  
              get_links($to_crawl);



              foreach (
              $c as $page) {
                  
              get_links($page);
              /* }
              foreach ($c as $page) { */
                  
                  
              echo $page."<br />";
              }
              ?>

              Kommentar


              • #8
                Gibts eigentlich einen besonderen Grund, warum du einen Crawler selber programmieren willst, statt einfach einen fertigen zu verwenden?

                Eins gleich mal vorweg: Regex eignet sich nicht für die Verarbeitung von HTML-Daten. Du solltest dich mal mit XPath beschäftigen.

                global ist böse und sollte nicht verwendet werden.

                Kommentar


                • #9
                  Erklär mal, was die erste Anweisung in der foreach-Schleife ganz unten tut.

                  Kommentar


                  • #10
                    Zitat von mermshaus Beitrag anzeigen
                    Erklär mal, was die erste Anweisung in der foreach-Schleife ganz unten tut.

                    Ich weiß leider nicht genau, ob du mich damit auf einen Fehler hinweisen möchtest oder mein PHP-Wissen - welches als Anfänger eingestuft werden kann - abfragen möchtest, um mir, dir oder anderen zu zeigen, dass ich es nicht kann?


                    Nun zu deiner Frage:
                    PHP-Code:
                     if (strpos($link"#")) {
                            
                    $link substr($link0strpos($link"#")); 
                    Ich denke diese Anweisung sagt, dass wenn er ein Raute findet, dieses als Link definieren soll und alles ab dem Raute dann als Link ausgibt. Du wirst mich sicher korrigieren.





                    Zitat von hellbringer Beitrag anzeigen
                    Gibts eigentlich einen besonderen Grund, warum du einen Crawler selber programmieren willst, statt einfach einen fertigen zu verwenden?

                    Eins gleich mal vorweg: Regex eignet sich nicht für die Verarbeitung von HTML-Daten. Du solltest dich mal mit XPath beschäftigen.

                    global ist böse und sollte nicht verwendet werden.

                    Zum Einen möchte ich dadurch PHP lernen und zum Anderen, ist es ein feines Gefühl, wenn man selbst etwa auf die Beine gestellt hat. Ich danke dir für deine Tipps in Sachen Xpath und die Sache mit Global. Ich werde mal versuchen zu googlen, was du damit meinst!

                    Gruß

                    Kommentar


                    • #11
                      Ne, ich meinte die foreach-Schleife ganz unten im Code:

                      PHP-Code:
                      foreach ($c as $page) {
                          
                      get_links($page);
                      /* }
                      foreach ($c as $page) { */
                          
                          
                      echo $page."<br />";

                      Also den get_links-Aufruf innerhalb dieser Schleife.

                      Der sorgt dafür, dass zu jedem Link im eigentlich analysierten Code zumindest noch mal die verlinkte Seite geladen wird. Das verursacht die lange Laufzeit.

                      Kommentar


                      • #12
                        Okay, danke für die Hilfe. Ich habe im nächsten Schritt vor, dass alle gefundenen Links mit dem Google-Ranking abgeglichen werden und dann entsprechend ihres Rankings eine Note erhalten. Daher hatte ich die Funktion eingebaut. Wenn du wissen möchtest, was ich damit genau vorhabe, dann würde ich dir das per PM erklären.

                        Nun zurück zu der Funktion. Ich hatte vor die get_links Funktion eben später zu erweitern und die angesprochene Funktion einzubauen. Da ich aber wirklich ein Anfänger bin, muss ich mir immer stets alles anlesen. Sollte ich mit meinem Vorhaben (Abgleich Google-Rankings) bereits jetzt auf dem Holzweg sein, dann würde ich um entsprechende Bemerkung von dir hoffen.

                        Nochmals Danke für deine Ausführung zu get_links.

                        Kommentar


                        • #13
                          Zitat von razghul Beitrag anzeigen
                          PHP-Code:
                           if (strpos($link"#")) {
                          $link substr($link0strpos($link"#")); 
                          Ich denke diese Anweisung sagt, dass wenn er ein Raute findet, dieses als Link definieren soll und alles ab dem Raute dann als Link ausgibt. Du wirst mich sicher korrigieren.
                          Warum rätst Du was das macht? Programmiersprachen haben so eine Eigenheit. Die definieren ganz genau was wo passieren soll. Da gibt es eigentlich keinen Bedarf da was zu raten.
                          Wenn man nicht weis was eine funktion genau macht sucht man sich diese einfach mal im PHP-Manual raus, liest sich durch was genau diese nun macht und kann dann aufhören zu raten.

                          Mal im Ernst: Gib in der adresszeile Deines Webbrowsers http://php.net/ gefolgt vom Funktionsnamen der Funktion die Du suchst ein (in Deinem Fall also http://php.net/strpos und http://php.net/substr) und schon hast Du alle Infos die Du brauchst.

                          Nur zur Erklärung damit es etwas einfacher wird.

                          an der Stelle steht in $link, wenn alles bis dahin so geklappt hat wie Du es Dir vorstellst eine Webadresse/URL
                          mit der Bedingung prüfst Du dann ob in der Zeichenkette der Variable $link irgendwo ab dem 2. Zeichen aufwärts eine Raute drin vorkommt.

                          Warum ist das von Interesse? Dazu must Du erst mal rausfinden für was die Raute in URLs genutzt wird. Um es kurz zu machen auch wenn ich Dich gern auf die Suchmaschine Deiner Wahl verweise, diese wird genutzt um auf einen HTML Dokument internen Ankerpunkt zu verweisen. Also man kann innerhalb eines HTML Dokumentes verschiedene Ankerpunkte wie <a name="foo"></a> definieren die dann über ihren Namen damit direkt angesprungen werden werden können.

                          Naja und wenn man das mal in Deinem Kontext einer "Suchmaschine" setzt erkennt man das der Anker (der immer am Ende einer URL stehen muss) da einfach mal weg soll weil er die Eindeutigkeit der URL verfälschen würde.

                          Mist jest hat ich Dir schon alles verraten.

                          TIps? Keine Ahnung lern erst mal die Grundlagen der Dinge mit denen Du Dich befassen willst. Lern HTML, HTTP, und natürlich PHP Grundlagen. Aber hau nicht HTML und PHP zusammen. Auch wenn es in den meisten Fällen zusammen anzutreffen sein wird. Sind vollkommen unterschiedliche Techniken. DU kannst auch wunderbar mit PHP scripts schreiben die in der Shell auszuführen sind. Und Bilder, PDF, Excel, usw., usf. kannste mit PHP ausgeben.

                          Gruß, Ulf
                          PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                          Kommentar


                          • #14
                            Hallo Ulf,

                            auch dir ein Dank für deine Ausführungen und Erläuterungen. Es ist nicht so, dass ich nicht gegooglet habe. Ich suche grundsätzlich nach allem, was ich nicht verstehe, bevor ich andere damit belästige.
                            Das ist für mich ein Selbstgänger.
                            Hier der Nachweis meiner Google-Suche:
                            php.JPG




                            Das ich mit manchen Aussagen eher rate, statt konkrete Aussagen zu treffen, liegt eben dadran, dass ich ein PHP-Neuling bin. Viele von euch haben jahrelange Erfahrung, wenn nicht sogar, PHP zu ihrem Beruf gemacht. Ich möchte ja keine Abkürzung nehmen, indem ihr alles für mich macht. Aber solche Hinweise und Tipps von euch sind für einen Anfänger so wichtig.


                            Ich habe unter anderem auf schattenbaum.net mich in PHP eingearbeitet. Da ich Grundkenntnisse in HTML und CSS besitze, bin ich davon ausgegangen, dass es ausreicht, um solch ein Projekt anzugehen. Stets nach dem Motto: learning by doing.

                            Falls ihr Bücher empfehlen könnt, um PHP zu richtig und vernünftig zu erlenen, würde ich mich über Empfehlungen sehr freuen.

                            Kommentar


                            • #15
                              Ich verweise einmal auf die Wissensammlung, da findest du sehr viel schönes. - Persönlich rate ich dir von Büchern ab, halte ich im Computerkontext schlichtweg für ein ungünstiges Medium.
                              http://php-de.github.io/jumpto/grund...len/#tutorials

                              Außerdem verlinke ich dir mal noch die Seite von Codeacademy, dort ist das ganze noch interaktiver und du kannst immer direkt ausprobieren. - Das kann man ganz gut mal durcharbeiten und hat dann eine brauchbare Grundlage.
                              https://www.codecademy.com/learn/php

                              Viel Spaß beim Lernen,

                              Liebe Grüße
                              ChromOxid

                              Kommentar

                              Lädt...
                              X