Alle Medien einer Seite auslesen

ZodiacXP

Erfahrenes Mitglied
Nun möchte ich alle Dateien / Medien innerhalb eines Dokuments auslesen, die auch wirklich angezeigt werden und nicht nur verlinkt sind.

Hier nur mit src zu arbeiten wäre zu stumpf, da nicht jede Seite valides (X)HTML ist und es auch embeded seien kann. Besonders die Größe der Dateien interessiert mich.

Gibt es hierzu Ansätze oder Scripte in PHP?

EDIT: Dynamische Sachen die man nicht erfassen kann (durch AJAX etc.), seien außer acht gelassen.
 
Zuletzt bearbeitet:
Moin,

Ansätze dazu kenne ich nicht, aber soviele Möglichkeiten, Medien einzubinden, gibt es ja nicht.
Ich würde mir da wohl per RegExp alles Mögliche herausfiltern.

Was die Grösse betrifft, die kannst du per fsockopen bekommen, indem du Content-Length aus den Headern ausliest.(achte darauf, eine HEAD-Anfrage zu Stellen, damit nur die Header und nicht die ganzen Dateien angefordert werden)
 
Ok. Habe dazu Pattern teilweise gefunden teilweise erstellt. Ein Auszug (es wird eine Klasse draus):
PHP:
        /**
         * CSS
         */
        preg_match_all(
          "/<link[^>]+href[\040]*=[\040]*[\"|\'|\\\\]".
          "*([^\'|\"|>|\040]*(.*)\.css)[\"|\'|>|\040|\\\\]*/ie",
          $this->content,
          $css
        );
        /**
         * img, input, embeded, script
         */
        preg_match_all(
          "/[img|input|embed|script]+.*[\s]*(src|background)".
          "[\040]*=[\040]*\"?([^\"' >]+)/ie",
          $this->content,
          $a
        );
        $aLink = array_merge($css[1], $a[2]);

Innerhalb von CSS:
PHP:
        preg_match_all("/(url\(\"?([^\")]+))/ie", $css, $a);
        $aLink = $a[2];

Die "Downloadgröße" hole ich mir in PHP per cURL (curl_getinfo).
Das erwischt leider noch nicht alles aber bin schon mal glücklich so weit zu seien.
Zum Beispiel soll tutorials.de nach meinem Script: 466.56 Kbyte haben und nach http://analyze.websiteoptimization.com/wso 525.26 Kbyte.

Kann das daran liegen, das mein Script die Downloadgröße mit GZip feststellt und die besagte Seite unter Umständen die unkomprimierte Größe angibt?

Zusatz: Es wird die gleiche Anzahl an Elementen gefunden, wonach ich denke das die gleichen Elemente gefunden wurden. Muss nicht sein ist aber sehr wahrscheinlich.
 
Zuletzt bearbeitet:
Doppel-Woppeeeeerrrr!

Ich brauche mehr Performance. Mehrere Seiten mit curl auszulesen braucht knapp doppelt so lang wie mit fsockopen. Aber selbst fsockopen braucht für 50 Aufrufe relativ lang (auf diesem Rechner 6 bis 10 Sekunden). Geplant sind später mal bis zu 60 Aufrufe.

Gibt es schnellere Varianten?
Es wird Header und Inhalt benötigt und der Host ist dynamisch.

Hier mal mit 10 Aufrufen:
PHP:
<?php

$a = array(
	"www.wikipedia.de",
	"www.tutorials.de",
	"www.google.de",
	"www.studivz.net",
	"www.chip.de",
	"www.faz.net",
	"de.wikipedia.org",
	"www.myvideo.de",
	"www.youtube.com",
	"www.rofl.to",
);
$t = microtime(true);

for ($i = 0; $i < 11; $i++)
{
	$fp = fsockopen ($a[$i], 80, $errno, $errstr, 30);
	fwrite ($fp,
		"GET / HTTP/1.1\r\n".
		"Host: www.tutorials.de\r\n".
		"Connection: Close\r\n\r\n"
	);

	$result = '';
	while (!feof($fp))
	{
	    $result .= fgets($fp, 128);
	}
	fclose($fp);
}


echo "socke: " . (microtime(true) - $t) . "\n";

$t = microtime(true);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);

for ($i = 0; $i < 10; $i++)
{
	curl_setopt($ch, CURLOPT_URL, "http://".$a[$i]);
	$s = curl_exec($ch);
}

echo "curl: " . (microtime(true) - $t);
?>
 
Zuletzt bearbeitet:
Zurück