Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 19

Thema: Crawler optimieren (Schneller!?)

  1. #1
    Senior Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158

    Crawler optimieren (Schneller!?)

    Hallo zusammen,

    hat jemand eine Idee, um den Crawler zu optimieren?
    PHP-Code:
    function get_data($url)
    {
        
    /* do some curl magic */
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT3);
        
    $data curl_exec($ch);
        
    curl_close($ch);
        return 
    $data;
    }

    function 
    get_match($regex$content$pos 1)
    {
        
    /* do your job */
        
    preg_match($regex$content$matches);
        
    /* return our result */
        
    return $matches[intval($pos)];
    }

    echo 
    "Naruto-Tube Crawler Test<br />";

    function 
    pageSearch()
    {
        
    $html file_get_contents('http://naruto-tube.org/boruto-episoden-streams'); //get the html returned from the following url

        
    $pokemon_doc = new DOMDocument();

        
    libxml_use_internal_errors(true); //disable libxml errors

        
    if (!empty($html)) {
            
    //if any html is actually returned

            
    $pokemon_doc->loadHTML($html);
            
    libxml_clear_errors(); //remove errors for yucky html

            
    $pokemon_xpath = new DOMXPath($pokemon_doc);

            
    //get all the h2's with an id
            
    $pre_link $pokemon_xpath->query('//tr/@onclick');

            if (
    $pre_link->length 0) {
                foreach (
    $pre_link as $row) {

                    
    $search     = array("window.location.href = '""'");
                    
    $replace    = array("""");
                    
    $clean_link str_replace($search$replace$row->nodeValue);

                    
    // Grab Name
                    
    $name        get_data("http://naruto-tube.org" $clean_link);
                    
    $grabed_name = @get_match('/<td class="contentheading" width="100%">([^\"]*)<\/td>/'$name);

                    
    // Search Video URL
                    
    $search_vid_url       get_data("http://naruto-tube.org" $clean_link);
                    
    $search_vid_url_found = @get_match('!var S1 = \'<iframe width="735" height="414" src="(.+)" frameborder="0" scrolling="no" allowfullscreen></iframe>\'!iUm'$search_vid_url);

                    
    // Grab Video File
                    
    $founded_vid_url get_data($search_vid_url_found);
                    
    $grab_video      = @get_match('!file: "(.+)",!iUm'$founded_vid_url);

                    
    $stream_file .= '<a href="' $grab_video '">' $grabed_name '</a><br />';
                }

            }
        }
        
    $array = array(
            
    $stream_file,
        );
        return (
    $array);
    }

    $boruto pageSearch();
    echo 
    $boruto[0]; 
    Ich finde, er sucht (zu)lange!?
    Kann auch an der Seite liegen, aber wnen jemand Optimierungsvorschläge hat, würde ich mich über Hilfe freuen.

    LG
    LG - Uranjitsu
    Simple Szene BBcode Generator ( TOT :/ )

    [CODESCHNIPSEL]

  2. Werbung - Hier werben?
  3. #2
    Avatar von syrius
    Registriert
    Mar 2015
    Beiträge
    2,124
    Gefällt mir!
    1,233
    Du gefällst: 2,816
    Aufs maximum optimieren und dann mit Threads arbeiten.
    SzeneBox.org bei Telegram https://t.me/szenebox

  4. #3
    Senior
    THEMENSTARTER

    Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158
    Richtig.
    Wenn jemand dafür Ansätze hat, bin ich um das teilen ebenfalls sehr dankbar.

  5. #4
    Junior
    Registriert
    Mar 2015
    Beiträge
    87
    Gefällt mir!
    11
    Du gefällst: 45
    Hilfe zur Selbsthilfe: Hast du mal einen performance profiler damit beschäftigt? Wenn ein solcher fehlt einfach mal nen paar aktuelle DateTime jeweils vor und nach den einzelnen funktionsaufrufen speichern und anschließend auswerten. Somit weisst du anschließend, wo ggf. ein performance-engpass besteht. Das sollte die grundlage für weitere optimierungen sein.
    Ich vermute, dass die teuersten aufrufe irgendwo im Laden der Webseiten liegt.

    Eine generelle Frage: Benötigst du wirklich einen DOM und Regex? Mir scheinen alle deine Regex auch als XPath abbildbar zu sein.

  6. #5
    Junior Avatar von 4nn8
    Registriert
    Apr 2018
    Beiträge
    63
    Gefällt mir!
    15
    Du gefällst: 89
    Diese angesprochenen "Optimierungen" sind völlig egal.
    Nur dein "get_data" muss asynchron gemacht werden oder du erstellst pro Iterationsschritt einen neuen Thread, der get_data aufruft.
    Threads sind in hier in jeder Hinsicht wiedermal die schlechtere Wahl.
    Ich denke mit ReactPHP's HTTPClient sollte die asynchrone Variante gut lösbar sein.

  7. #6
    Junior
    Registriert
    Mar 2015
    Beiträge
    87
    Gefällt mir!
    11
    Du gefällst: 45
    @4nn8: Was macht einen Asynchronen aufruf denn schneller? Ist ein Asynchroner vorgang in PHP kein gesonderter Thread für das OS? Du bekommst den Callback vom Server nach seiner response - egal ob async oder nicht.
    Ich möchte noch einmal betonen, dass es nicht sinnvoll ist optimierungen durchzuführen, wenn man nicht weiss, was konkret die Performance so schlecht macht.
    Ohne diese Performance-Messungen (vor und nach der Optimierung) existiert kein erfolgsindikator.

    Hinzufügen möchte ich auch noch, dass noch garnicht gesagt ist, dass das Script ein performance Problem hat - es kann durchaus der remote Server die Ursache für das Problem sein - oder die eigene Kiste.

  8. #7
    Junior Avatar von 4nn8
    Registriert
    Apr 2018
    Beiträge
    63
    Gefällt mir!
    15
    Du gefällst: 89
    Asynchron macht es nicht schneller, sondern sorgt dafür, dass deine HTTP-Requests in get_data gleichzeitig ausgeführt werden und nicht hintereinander.
    In der jetzigen Foreach wird jedes mal gewartet, bis der eine HTTP-Aufruf fertig ist, damit die Schleife weiterlaufen kann.
    Pro Iteration sind das also bestimmt acht Round-Trip-Times je nach Größe der Seite.
    Bei einer Paketumlaufzeit von 40ms sind das schon 320ms. Und das ist der Best-Case würde ich sagen ^^

    Wenn du es asynchron machst, dann läuft die Schleife sofort durch und im Hintergrund werden alle HTTP-Aufrufe gleichzeitig durchgeführt.
    Umgesetzt wird es durch eine Event Loop und läuft im selben Thread ab.

  9. Diesen Mitgliedern gefällt dieser Beitrag:


  10. #8
    Senior
    THEMENSTARTER

    Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158
    Danke @y0l0sw4gg3r und 4nn8 für die Infos:
    Kann man mir eventuell anhand des obigen Codes ein Beispiel aufzeigen?
    LG - Uranjitsu
    Simple Szene BBcode Generator ( TOT :/ )

    [CODESCHNIPSEL]

  11. #9
    Junior Avatar von ToLinkTo
    Registriert
    Oct 2017
    Beiträge
    28
    Gefällt mir!
    5
    Du gefällst: 39
    Hallo,
    bevor du dich mit React beschäftigst solltest du die einfachste Lösung in Betracht ziehen. Einen multi curl handle zu nutzen.
    Es gibt unendliche viele PHP Libs dafür: https://github.com/search?q=php+multi+curl
    Da bei dir bereits Curl läuft sollte dies ohne großen Aufwand in dein Projekt zu integrieren sein.
    Grüße
    ToLink.to - Linkcrypter und URL Shorter - 100% Bot Schutz + eigene Werbung / Refs + 1€ TKP

    "Die schwierigste Aufgabe, die jeder Mensch zu bewältigen hat, ist die, nie aufzugeben." - Ernst Ferstl

  12. Diesen Mitgliedern gefällt dieser Beitrag:


  13. #10
    Senior
    THEMENSTARTER

    Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158
    Offensichtlich rotieren die Links. Das Wrong IP ist nach einer gewissen Zeit wieder weg.
    Kann mir jemand da was funktionierendes bauen? Natürlich entlohne ich das ganze auch, ich komme einfach nicht weiter.
    LG - Uranjitsu
    Simple Szene BBcode Generator ( TOT :/ )

    [CODESCHNIPSEL]

  14. #11
    Senior
    THEMENSTARTER

    Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158
    Hallo zusammen,

    Danke noch einmal an alle Beteildigten, die Hilfestellung angeboten haben.

    Ich habe nun eine Möglichkeit gefunden, die Seiten schnell und unkompliziert zu durchsuchen:
    !Allerdings ist das Wrong IP damit auch nicht gelöst: https://github.com/joshfraser/rollin...er/example.php

    Diesen Code nutze ich:
    PHP-Code:
    <?php

    function get_match($regex$content$pos 1)
    {
        
    /* do your job */
        
    preg_match($regex$content$matches);
        
    /* return our result */
        
    return $matches[intval($pos)];
    }

    require 
    "RollingCurl.php";

    if (isset(
    $_GET['action'])) {
        
    $action $_GET['action'];
    } else {
        
    $action "";
    }

    if (
    $action == "") {
        
    $action "intro";
    }

    if (
    $action == "intro") {
        echo 
    "<b>Episoden: </b> <a href=\"boruto.php?action=episoden\">boruto.php?action=episoden</a><br />";
        echo 
    "<b>Movies: </b> <a href=\"boruto.php?action=movies\">boruto.php?action=movies</a><br />";
    }

    /***************************
    *
    *      EPISODEN
    *
    ***************************/

    if ($action == "episoden") {
        
    $html file_get_contents('http://naruto-tube.org/boruto-episoden-streams'); //get the html returned from the following url

        
    $pokemon_doc = new DOMDocument();

        
    libxml_use_internal_errors(true); //disable libxml errors

        
    if (!empty($html)) {
            
    //if any html is actually returned
            
    $pokemon_doc->loadHTML($html);
            
    libxml_clear_errors(); //remove errors for yucky html

            
    $pokemon_xpath = new DOMXPath($pokemon_doc);

            
    //get all the h2's with an id
            
    $pre_link $pokemon_xpath->query('//tr/@onclick');

            if (
    $pre_link->length 0) {
                foreach (
    $pre_link as $row) {

                    
    $search     = array("window.location.href = '""'");
                    
    $replace    = array("""");
                    
    $clean_link str_replace($search$replace$row->nodeValue);
                    
    $urls[]     = "http://naruto-tube.org" $clean_link// Clan Link to array
                
    }

            }
        }

    // a function that will process the returned responses
        
    function request_callback($response$info)
        {

            
    // parse the page title out of the returned HTML
            
    $embed = @get_match('/<iframe.*src="((https?|http):\/\/)?((www).)ani-stream.com\/([^\"]*)".*><\/iframe>/i'$response5);
            
    $title = @get_match('/<td class="contentheading" width="100%">([^\"]*)<\/td>/'$response);

            
    //print_r($info);
            
    echo '<a href="boruto.php?action=grab-video&url=' $embed '">' $title '</a><br />';
        }

    // create a new RollingCurl object and pass it the name of your custom callback function
        
    $rc = new RollingCurl("request_callback");

    // the window size determines how many simultaneous requests to allow.
        
    $rc->window_size 20;

        foreach (
    $urls as $url) {
            
    // add each request to the RollingCurl object
            
    $request          = new RollingCurlRequest($url);
            
    $request->options = array(CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
            
    $rc->add($request);
        }

        
    $stream substr($rc->execute(), 0, -1);
    }

    /***************************
    *
    *      MOVIES
    *
    ***************************/

    if ($action == "movies") {
        
    $html file_get_contents('http://naruto-tube.org/boruto-movie-streams'); //get the html returned from the following url

        
    $pokemon_doc = new DOMDocument();

        
    libxml_use_internal_errors(true); //disable libxml errors

        
    if (!empty($html)) {
            
    //if any html is actually returned
            
    $pokemon_doc->loadHTML($html);
            
    libxml_clear_errors(); //remove errors for yucky html

            
    $pokemon_xpath = new DOMXPath($pokemon_doc);

            
    //get all the h2's with an id
            
    $pre_link $pokemon_xpath->query('//tr/@onclick');

            if (
    $pre_link->length 0) {
                foreach (
    $pre_link as $row) {

                    
    $search     = array("window.location.href = '""'");
                    
    $replace    = array("""");
                    
    $clean_link str_replace($search$replace$row->nodeValue);
                    
    $urls[]     = "http://naruto-tube.org" $clean_link// Clan Link to array
                
    }

            }
        }

    // a function that will process the returned responses
        
    function request_callback($response$info)
        {

            
    // parse the page title out of the returned HTML
            
    $embed = @get_match('/<iframe.*src="((https?|http):\/\/)?((www).)ani-stream.com\/([^\"]*)".*><\/iframe>/i'$response5);
            
    $title = @get_match('/<td class="contentheading" width="100%">([^\"]*)<\/td>/'$response);

            
    //print_r($info);
            
    echo '<a href="boruto.php?action=grab-video&url=' $embed '">' $title '</a><br />';
        }

    // create a new RollingCurl object and pass it the name of your custom callback function
        
    $rc = new RollingCurl("request_callback");

    // the window size determines how many simultaneous requests to allow.
        
    $rc->window_size 20;

        foreach (
    $urls as $url) {
            
    // add each request to the RollingCurl object
            
    $request          = new RollingCurlRequest($url);
            
    $request->options = array(CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
            
    $rc->add($request);
        }

        
    $stream substr($rc->execute(), 0, -1);
    }

    if (
    $action == "grab-video") {

        if (isset(
    $_GET['url'])) {
            
    $url "http://www.ani-stream.com/" $_GET['url'];
        } else {
            
    $url "FAIL";
        }

    // a function that will process the returned responses
        
    function request_callback($response$info)
        {

            
    // parse the page title out of the returned HTML
            
    $video = @get_match('/file: "([^\"]*)",/'$response);

            
    //print_r($info);
            
    echo '<a href="' $video '">Stream starten</a>';
        }

        
    $rc = new RollingCurl("request_callback");
        
    $rc->request($url);

        
    $stream substr($rc->execute(), 0, -1);
    }

    echo 
    $stream;
    Ich habe keine Ahnung, wie ich das nach Zeit auftretene WrongIP umgehen kann. Da ich zwischenzeitlich teste, generiere ich natürlich alleine von mir aus, sehr viele Anfragen. Eigentlich dachte ich, dass ich das mit der Class von GitHUB umgehen kann.

    Ausserdem, kann mir jemand sagen, wie ich die Ausgabe sortiert geliefert bekomme? Die Links kommen zwar alle an, aber durcheinander :/

    LG
    LG - Uranjitsu
    Simple Szene BBcode Generator ( TOT :/ )

    [CODESCHNIPSEL]

  15. #12
    badloader
    Gast
    Disclaimer: Nur halb qualifizierter Kommentar, da ich immer noch zu faul bin dein Script und deine Aufgabenstellung genau zu lesen.

    Kannst du mir erklären was du mit "WrongIP" meinst? Ist das ein CURL error oder ein HTTP (Response) Error?
    Umformuliert: Antwortet dir die Seite mit "WrongIP" oder sagt dir das dein Script?

  16. #13
    Senior
    THEMENSTARTER

    Avatar von Uranjitsu
    Registriert
    May 2016
    Beiträge
    207
    Gefällt mir!
    223
    Du gefällst: 158
    Die Seite antwortet damit. Auch mal mit 404 nginx... Obwohl die Datei online ist.

    Das grabbe ich:
    HTML-Code:
    <script>
    	var playerInstance = jwplayer('player');
    	function loadplayer(){
            
            $('#video_thumb').hide();
            $('#video_fdva').hide();
            $('#video_player').show();
            
            playerInstance.setup({
                autostart: true,
    			file: "https://node04.ani-stream.com/d/qk5pofc4whfxuqe6sng2fpfntgd4daond3qol7hqhe4rjzpf6anl6md7/video.mp4",
                type: 'mp4',
                height: window.innerHeight,
                image: '//cdn.ani-stream.com/thumb/1gqzfnjpqhje.jpg',
                
                startparam: 'start',
                width: window.innerWidth,
                abouttext:'ANI-STREAM Player - VIDEO ID: 1gqzfnjpqhje',
                aboutlink: 'https://www.ani-stream.com/1gqzfnjpqhje',
    			logo: {
                    hide: true,
                    file: '//cdn.ani-stream.com/images/logo.png'
                },
    			advertising: {
                   client: 'vast',
                   schedule: {
                       ads: {
                          offset: 'pre',
                          'tag': ['https://spl1.yumenetworks.com/yvp/20/1846kmCVgOTZ/secured_anistream_vpaid_as3.xml','https://spl1.yumenetworks.com/yvp/21/1846jDCeHjPH/secured_anistream_vpaid_html5.xml']
                       }
                   }
                },
                sharing: {
                   code: encodeURI('<iframe width="640" height="360" src="https://ani-stream.com/embed-1gqzfnjpqhje.html" frameborder="0" scrolling="no" allowfullscreen></iframe>'),
                   link: 'https://www.ani-stream.com/1gqzfnjpqhje'
                },
            });
    		
    	playerInstance.on('adComplete', function(event){
    			ga('send', 'event', 'Ad Complete', event.tag, event.message);
    	});
    	playerInstance.on('adError', function(event){
    			ga('send', 'event', 'Ad Error', event.tag, event.message);
    	});
    	playerInstance.on('error', function(event){
    			ga('send', 'event', 'Media Error', 'Errors (4)', event.message);
    	});
    	playerInstance.on('ready', function(){
    			$(window).on('resize orientationChange', function(event) {
    				var width = $(window).width();
    				var height = $(window).height();
    				window.playerInstance.resize(width, height);
    			});
    	});
    	}
        </script>
    Dort ziehe ich mir die Datei:
    Code:
    file: "https://node04.ani-stream.com/d/qk5pofc4whfxuqe6sng2fpfntgd4daond3qol7hqhe4rjzpf6anl6md7/video.mp4",
    Das wäre die Seite: ANI-STREAM.COM - Naruto Shippuuden Movie 08 GER SUB by naruto-tube.mp4.mp4

    Selbst wenn ich Proxys verwende, passiert das gleiche.

    Für eine Weile kann ich grabben und Videos schauen und dann taucht das "WrongIP" auf und selten ein erlogenes "404". Mit und ohne Proxy.
    Wenn ich das Video aber dann im Player abspiele: Boruto Movie 1 GER SUB | Boruto: Naruto The Movie
    Geht das ohne Probleme... wo ich dann davon ausgehe, dass ich nicht gesperrt bzw. geblockt bin.
    Muss ich eventuell einen Referrer mit übergeben, wie könnte diese aussehen?
    Ich habe auch versucht die User-Agent als Google Bot zu tarnen, auch kein Erfolg.

    LG
    Geändert von Uranjitsu (22.08.2018 um 17:42 Uhr)
    LG - Uranjitsu
    Simple Szene BBcode Generator ( TOT :/ )

    [CODESCHNIPSEL]

  17. #14
    Senior Avatar von Nimbus
    Registriert
    Oct 2015
    Beiträge
    561
    Gefällt mir!
    96
    Du gefällst: 573
    Also ich bekomme das Video-File, sofern ich die selbe IP nutze mit dem ich den File Not Found Link aufgerufen habe. User-Agent kann sich ändern. Referrer habe ich keinen gesetzt.

  18. #15
    Junior Avatar von pythonfreak
    Registriert
    Apr 2017
    Beiträge
    112
    Gefällt mir!
    50
    Du gefällst: 61
    Mal von einem anderen Server aus testen Uranjitsu , ob da der selbe Fehler auftritt? Oder mal mit weniger threads versuchen? ich hab das mal in python nachgebaut (ohne threads), kein wrong ip oder 404 Fehler, User-Agent immer von einem browser, also kein bot. https://pastebin.com/Xh2trmK1

    Edit:
    Das Video hab ich nicht abgespielt, nur die links ausgelesen...
    Geändert von pythonfreak (23.08.2018 um 05:44 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Rclone / Plex optimieren
    Von ChAiN SaW im Forum Technik / Hardware & Software
    Antworten: 23
    Letzter Beitrag: 11.03.2023, 13:16
  2. Filmwiedergabe optimieren (NAS, Apple TV)
    Von Anteil im Forum Technik / Hardware & Software
    Antworten: 14
    Letzter Beitrag: 30.06.2021, 07:20
  3. (Suche) - Webseite: Script Bugs entfernen und optimieren (PHP?)
    Von Blackbird im Forum Entwickler / IT-Techniker
    Antworten: 2
    Letzter Beitrag: 02.12.2018, 19:07
  4. Temp ordner - was ist schneller?
    Von DrNice im Forum IntelliTool.it
    Antworten: 3
    Letzter Beitrag: 04.10.2017, 10:02
  5. (PHP) - Crawler optimieren?
    Von Nightmare im Forum Entwicklung / Programmierung
    Antworten: 8
    Letzter Beitrag: 18.02.2016, 01:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
SzeneBox.org... im Mittelpunkt der Szene!
© since 2015 szeneBOX.org - All Rights Reserved
Domains: www.szenebox.org