• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Inhalte in DB einlesen

Sunnyboy

Mitglied
Hallo zusammen

Ich habe eine Liste von Links und möchte auf den jeweiligen Seiten Inhalte nach gewissem Muster sortiert in verschiedene Zeilen einer Tabelle einer Datenbank kopieren.

Ich hoffe jemand hat eine Idee
Vielen Dank
Sunnyboy

PS: Um das schon von Anfang an zu klären: So wie ich das machen will ist es legal :)
 
Werbung:
Ich versteh die Frage nicht mal ganz. Hast Du vlt. mal ein Beispiel zur Erläuterung?
 
Ja klar...

Also da ist eine Website mit mehreren Seiten. Alle nach dem gleichen Schema aufgebaut. Die Links für jede davon habe ich in einer Liste.

Ziel ist es nun zu jedem der Links in der Liste:
1. Quellcode hohlen (cURL)
2. Info ausschneiden (preg_match)
3. Info zum aufgerufenen Link in DB einlesen

Mein Problem ist, dass ich das zwar für einen einzelnen Link machen kann, aber nicht automatsch für alle Links aus der Liste.

Der Code sieht so aus:
PHP:
<?php
$url = "http://www.xyz.html";
function blablabla ($url) {
  $ch = curl_init(); 

  curl_setopt ($ch, CURLOPT_URL, $url);  
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;
 MSIE 6.0; Windows NT 5.0)");
  curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
  curl_setopt ($ch, CURLOPT_HEADER, 0);

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

  return $result;
}
$content = blablabla($url);
//Inhalte auswählen...
preg_match('!itle>(.*)</title!sUi',$content,$info1);
preg_match('!ords" content="(.*), !sUi',$content,$info2);
preg_match('!ze:100%">(.*)</p>!sUi',$content,$info3);
echo $info1[1];
echo $info2[1];
echo $info3[1];
?>

Und dann anstelle von ausgeben mit echo, speichere ich sie in Variabeln und lese sie in die DB ein.
Einzeln geht dass, aber ich möchte es nun mit mehreren automatisch machen.

Vielen herzlichen Dank
Sunnyboy
 
Werbung:
Dann musst Du eigentlich "nur" eine Datenbanktabelle erstellen in der folgende Spalten enthalten sind:
- ID (für die Nummerierung)
- URL
- Quellcode

Dann musst Du auf diese Datenbanktabelle zugreifen. Ich nenn sie jetzt mal "links":

Code:
SELECT ID, URL FROM links

Das in PHP mit mysql_query() oder über mysqli oder PDO (je nachdem was Du für die Datenbankverbindung verwendest) ausführen und die Ergebnisse mit mysql_fetch_array() einlesen. Dann kann man durch diese in einer Schleife durchgehen:

PHP:
while( $row = mysql_fetch_array($ergebnismenge) ) {
 ..
}

Dort wo die 2 Punkte sind musst Du nun deinen schon vorhandenen Quellcode einfügen. Die Funktion mit dem schönen Namen "blablabla" solltest Du aber außerhalb unterbringen. Anstelle deiner echo-Ausgabe nimmst Du dann die Speicherung des Quellcodes in der Datenbanktabelle vor. Also z.B. per

PHP:
mysql_query("UPDATE links SET Quellcode = '".mysql_real_escape_string($info1[1])." WHERE id = '".mysql_real_escape_string($row[0])."'");

Meine Quellcodes hier sollen nur als Beispiel dienen. Du musst diese natürlich noch entsprechend absichern und an deine Bedürfnisse anpassen.
 
Vielen herzlichen Dank!

Ich bin aber noch ein wenig überfordert :)
Ich habe wie gesagt mit einem URL kein Problem aber mache viel zu wenig mit Funktionen wie Schleifen.

Für die Infos einer Seite einzulesen währe der Code ja wie folgend. Aber bei dem Einsetzen der Schnipsel bin ich überfordert.
PHP:
<?php
$url = "http://www.xyz.html";
//den Quellcode von $url hohlen
function blablabla ($url) {
  $ch = curl_init(); 
  curl_setopt ($ch, CURLOPT_URL, $url);  
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;
 MSIE 6.0; Windows NT 5.0)");
  curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
  curl_setopt ($ch, CURLOPT_HEADER, 0);
  $result = curl_exec ($ch);
  curl_close($ch);
  
  return $result;
}
$content = blablabla($url);
//aus dem Quellcode "$content" die verschiedenen Inhalte heraussortieren
preg_match('!ords" content="(.*), !sUi',$content,$xxx1);
preg_match('!<h1 style(.*)>(.*)</h1!sUi',$content,$xxx2);
preg_match('!ze:100%">(.*)</p>!sUi',$content,$xxx3);
preg_match('!>jv,.., (.*), !sUi',$content,$xxx4);
preg_match('!>p>, (.*)( *)<!sUi',$content,$xxx5);
$ortdatum = explode(", ", $xxx6[1]);
//MySQL verbinden (mithilfe der datei connect.php)
include 'connect.php'; 
//die Variabeln neu benennen um in die DB einzulesen
$url = $url;
$xxx1 = $xxx1[2];
$xxx2 = $xxx2[1];
$xxx3 = $xxx3[1];
$xxx4 = $xxx4[1];
$xxx5 = $xxx5[1];
//Inhalte in die DB-Tabelle "bliblablu" einlesen
$eintrag = "INSERT INTO bliblablu (url, xxx1, xxx2, xxx3, xxx4, xxx5) VALUES ('$url', '$xxx1', '$xxx2', '$xxx3', '$xxx4', '$xxx5')";
$result = mysql_query($eintrag) or die(mysql_error());
?>

Das Ganze sollte ja nun automatisch mit vielen URL's gemacht werden (nicht nur mit xyz.html) und jeweils eine neue ID in der DB bekommen.

Ich hoffe du hast noch einmal Geduld...
Nochmals vielen Dank
Sunnyboy
 
Vielleicht noch anzumerken...

Mit diesem Code müsste ja eigentlich nun nur noch erreicht werden, dass die Variabel $url bei jedem mal ausführen verschieden ist. Meine Linkliste müsste also einfach durchlaufen werden. Aber gerade eben dass weiss ich nicht wie machen :(

Merci fürs helfen.
Sunnyboy
 
Werbung:
Zunächst mal hast Du von dem was ich beschrieben habe offenbar lediglich die Speicherung umgesetzt. So kannst Du natürlich keine Liste von Einträgen durchgehen. Wenn Du das umsetzen willst, gehe meinen Eintrag oben Zeile für Zeile durch. Wenn du PHP noch nicht ausreichend beherrschst, schau dir ein PHP-Tutorial wie dieses hier an.

Um ein PHP-Script regelmäßig automatisch laufen zu lassen, ist es üblich cronjobs zu verwenden. Diese müssen entweder direkt auf deinem Server eingerichtet werden oder Du kannst auf cronjob-Dienste im Netz zurückgreifen. Welches davon für dich der beste Weg ist, hängt von deinem Webspace und dessen Eigenschaften ab. Frag im Zweifelsfall deinen Webhoster nach der Einrichtung von cronjobs.
 
Tschuldigung für meine Unkenntnisse, ich versuche mein Bestes :)

Entweder habe ich aber die Funktionen die du oben beschrieben hast nicht verstanden, oder ich meine etwas anderes.

Mein Ziel ist es, den Code, den ich als letztes gepostet habe mit 100 verschiedenen URL's durchlaufen zu lassen.
Die Variabel $url soll also einmal www.xxx.html und einmal www.ggg.html sein etc...

Meine Idee war deshalb eine Schleife einzusetzen, da meine Links in einem Array gespeichert sind. Das erste mal durchlaufen mit $url = "Array=>0", beim zweiten mal mit $url = "Array=>1".
Das scheint aber ja nicht zu funktionieren?

Ich hoffe ich nerve nicht zu fest, schon so früh im neuen Jahr :)

Vielen vielen Dank
Sunnyboy
 
Um eine Liste von X Einträgen zu durchlaufen brauchst Du die o.g. while-Schleife. Ich wusste natürlich nicht, dass Du die URLs zu den Webseiten nicht in einer Datenbank speichern willst. Das macht dein Vorhaben jedoch auch etwas komplexer als ich es oben beschrieben habe.

Du könntest, wie Du schon sagst, ein Array mit den URLs aufbauen und dieses per foreach()-Schleife durchlaufen. Innerhalb dieser foreach()-Schleife machst Du dann genau das was Du schon derzeit hast: Daten von URL runterladen, teilen, und in der DB den entsprechenden Teil speichern.

Komplex wird das nur aus meiner Sicht hinsichtlich der Zuordnung von Datensätzen in der Datenbank zu dem Array. Das wird dich irgendwann zur Verzweiflung führen, da es auch unübersichtlich ist. Daher auch mein o.g. Vorschlag mit der Speicherung aller URLs in der Datenbank zu denen Du dann nur noch die Inhalte runterladen musst.
 
Werbung:
Dankeschön.

Meine foreach() Schleife will leider noch nicht wie ich. So wie ich diese Funktion verstehe, müsste doch folgendes funktionieren?

PHP:
<?php
$array = array('http://www.xxx.html', 'http://www.yyy.html', 'http://www.zzz.html');
foreach ($array as $url) {
//Der ganze Code der schon gepostet ist
}
?>

Der Code macht das ganze aber lediglich für www.xxx.html, nicht aber für die anderen Links.

Tut mir leid, dass ich nicht einmal eine foreach Schleife überblicke.
Vielen herzlichen Dank
Sunnyboy
 
Was passiert denn dabei? Gibt es eine Fehlermeldung? Hast Du $url nachträglich hoffentlich nicht nochmal gesetzt? Und die angesprochene Funktion blabla() muss natürlich außerhalb dieser Schleife stehen!
 
Die Funktion war noch in der Schleife. Es geht jetzt.

Aber warum kann ich denn die Funktion rausnehmen? Weil die Variabel $url wird ja erst später vergeben aber muss in der Funktion blablabla gebraucht werden...

Danke viel viel mal
Sunnyboy
 
Werbung:
Funktionen dienen dazu einzelne Aufgaben zu kapseln. Sie dürfen pro PHP-Aufruf nur 1 Mal instanziert werden, können aber beliebig oft aufgerufen werden. Deshalb muss die Funktion außerhalb der Schleife stehen. Innerhalb der Schleife wird dann die Funktion so wie Du es geschrieben hast jeweils aufgerufen, wobei du $url ja als Parameter an die Funktion übergibst.

Da das absolute Grundlagen von PHP sind würde ich dir empfehlen dir auch nochmal diese genauer anzuschauen. Sonst stolperst Du immer wieder darüber.
 
Danke viel mal. Das werde ich machen. Aber wenn man nicht so oft programmiert, vergisst man die Dinge so verflixt schnell :)

LG Sunnyboy
 
Zurück
Oben