[PHP] Hämta data från en annan hemsida?

Permalänk

[PHP] Hämta data från en annan hemsida?

Hallåj!

Jag skulle vilja veta hur man hämtar data från en annan hemsida, som ex Sweclockers gör här:

Jag antar att det uppdateras med Prisjakts hemsida?
Jag har googlat och hittat att man ska använda "file_get_contents"? Dock så får man ju med hela sida. Jag vill bara ha själva en sträng i ett element. Hur gör man detta?

Hoppas ni förstod, och tack för att ni tar och läser min värdelösa förklaring

Visa signatur
Permalänk
Medlem

Oftast så har sidor som t.ex. Wikipedia (http://www.mediawiki.org/wiki/API:Main_page) olika APIer som man kan anropa för att få den data man efterfrågar utan en massa onödig html.

Men finns det inga APIer att ansluta till så får du göra som du skrev ovan och sedan antingen använda regex eller xdocument (eller vad det nu heter i PHP) för att få fram den info du vill ha

Skickades från m.sweclockers.com

Permalänk

simplehtmldom.sourceforge.net/

Permalänk
Legendarisk

Det första du bör göra är att kontrollera om siten du vill hämta data från tillhandahåller denna via någon form av API. Detta kommer vara stabilare och effektivare än att försöka filtrera HTML eftersom att du då får enbart den information du behöver i ett format där du kan lita på att strukturen inte ändras. Laddar du ner vanliga sidor kommer ditt program riskera att gå sönder varje gång källan gör en layoutändring. Prisjakt har ett sådant för att exportera produkt-/prisinformation till andra: Vi laddar inte ner deras HTML utan hämtar priserna direkt.

Finns det ingen sådan tjänst får du ladda ner hela sidan och hämta ut den information du behöver därifrån. file_get_contents() samt stream_context_create() brukar räcka fint. När du väl har sidans innehåll måste du parsa ut datan, för HTML görs detta lämpligen genom att läsa in det i ett DOMDocument som du sedan kan querya med xpath för att hitta de element vars innehåll du behöver. Om dokumentet inte är tillräckligt välformaterat för att använda XML-tolkar kan regex vara ett alternativ, men du bör generellt sett undvika det för att försöka tolka XML.

<?php // Exempel på att hämta texten i ett element från en websida $doc = new \DOMDocument(); @$doc->loadHTML(file_get_contents("http://www.sweclockers.com/")); $xpath = new \DOMXPath($doc); echo $xpath->query("//title/text()")->item(0)->wholeText; ?>

När du har fått din data, på ett eller annat sätt, bör du spara och isolera denna på ett sådant sätt att resten av ditt program inte känner till hur eller i vilket format den hämtades. På detta sätt kan du vid ett senare tillfälle byta källa utan att andra delar slutar fungera.

Visa signatur

Abstractions all the way down.

Permalänk
Skrivet av jonke:

Oftast så har sidor som t.ex. Wikipedia (http://www.mediawiki.org/wiki/API:Main_page) olika APIer som man kan anropa för att få den data man efterfrågar utan en massa onödig html.

Men finns det inga APIer att ansluta till så får du göra som du skrev ovan och sedan antingen använda regex eller xdocument (eller vad det nu heter i PHP) för att få fram den info du vill ha

Skickades från m.sweclockers.com

Skrivet av spot_1337:

simplehtmldom.sourceforge.net/

Skrivet av Biberu:

Det första du bör göra är att kontrollera om siten du vill hämta data från tillhandahåller denna via någon form av API. Detta kommer vara stabilare och effektivare än att försöka filtrera HTML eftersom att du då får enbart den information du behöver i ett format där du kan lita på att strukturen inte ändras. Laddar du ner vanliga sidor kommer ditt program riskera att gå sönder varje gång källan gör en layoutändring. Prisjakt har ett sådant för att exportera produkt-/prisinformation till andra: Vi laddar inte ner deras HTML utan hämtar priserna direkt.

Finns det ingen sådan tjänst får du ladda ner hela sidan och hämta ut den information du behöver därifrån. file_get_contents() samt stream_context_create() brukar räcka fint. När du väl har sidans innehåll måste du parsa ut datan, för HTML görs detta lämpligen genom att läsa in det i ett DOMDocument som du sedan kan querya med xpath för att hitta de element vars innehåll du behöver. Om dokumentet inte är tillräckligt välformaterat för att använda XML-tolkar kan regex vara ett alternativ, men du bör generellt sett undvika det för att försöka tolka XML.

<?php // Exempel på att hämta texten i ett element från en websida $doc = new \DOMDocument(); @$doc->loadHTML(file_get_contents("http://www.sweclockers.com/")); $xpath = new \DOMXPath($doc); echo $xpath->query("//title/text()")->item(0)->wholeText; ?>

När du har fått din data, på ett eller annat sätt, bör du spara och isolera denna på ett sådant sätt att resten av ditt program inte känner till hur eller i vilket format den hämtades. På detta sätt kan du vid ett senare tillfälle byta källa utan att andra delar slutar fungera.

Jag tackar så mycket för era utförliga svar
Ska se om jag kan knåpa ihop detta nu!

Visa signatur
Permalänk
Medlem

Skulle rekommendera att använda cURL för detta ändamål.

Visa signatur

Mina poster är en illusion. Det som står skrivet här över står i själva verket inte där så inget av det som du läser är sant. Inte ens den här texten. Jag har själv ingen kunskap om det jag skriver och ingen bör således läsa eller ta in den information som står skrivet.

Permalänk
Medlem
Skrivet av rumpnisse:

Skulle rekommendera att använda cURL för detta ändamål.

Försökte göra en liknande sak med cURL för ett tag sedan, vill minnas att det i slutändan krävdes att sidan man ville hämta ifrån också körde cURL. Kan ha fel men vill minnas att jag stötte på detta problem.

Permalänk
Medlem
Skrivet av Massy:

Försökte göra en liknande sak med cURL för ett tag sedan, vill minnas att det i slutändan krävdes att sidan man ville hämta ifrån också körde cURL. Kan ha fel men vill minnas att jag stötte på detta problem.

Mja då vet jag inte vad du gjort. Men det ska inte behövas.
Fördelen med cURL är att den är snabbare och har mer funktioner.

Exempel för att hämta in en sida med cURL:

// Initiera en cURL session $curl_handle = curl_init(); // sätt lite inställningar - http://www.php.net/manual/en/function.curl-setopt.php curl_setopt($curl_handle, CURLOPT_URL, 'http://example.com'); // sätter url curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE); // säger åt curl att returnera och inte echo ut resultatet (så vi kan ta emot den i $content) // Kör curl sessionen, källkoden för den sidan vi skrev in i CURLOPT_URL hamnar i $content $content = curl_exec($curl_handle); // Stäng curl sessionen curl_close($curl_handle);

Visa signatur

Mina poster är en illusion. Det som står skrivet här över står i själva verket inte där så inget av det som du läser är sant. Inte ens den här texten. Jag har själv ingen kunskap om det jag skriver och ingen bör således läsa eller ta in den information som står skrivet.

Permalänk
Medlem
Skrivet av rumpnisse:

Mja då vet jag inte vad du gjort. Men det ska inte behövas.
Fördelen med cURL är att den är snabbare och har mer funktioner.

Exempel för att hämta in en sida med cURL:

// Initiera en cURL session $curl_handle = curl_init(); // sätt lite inställningar - http://www.php.net/manual/en/function.curl-setopt.php curl_setopt($curl_handle, CURLOPT_URL, 'http://example.com'); // sätter url curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, TRUE); // säger åt curl att returnera och inte echo ut resultatet (så vi kan ta emot den i $content) // Kör curl sessionen, källkoden för den sidan vi skrev in i CURLOPT_URL hamnar i $content $content = curl_exec($curl_handle); // Stäng curl sessionen curl_close($curl_handle);

Löste det på annat vis så småningom, när jag körde cURL fungerade det endast på ett fåtal sidor, dock helt perfekt på dessa

Permalänk
Medlem
Skrivet av Massy:

Löste det på annat vis så småningom, när jag körde cURL fungerade det endast på ett fåtal sidor, dock helt perfekt på dessa

Kanske finns dom sidor som blockerar onormala requests. Man kan ju skicka med useragent, cookies och annat som gör curl lite mer lik en vanlig användare.

Visa signatur

Mina poster är en illusion. Det som står skrivet här över står i själva verket inte där så inget av det som du läser är sant. Inte ens den här texten. Jag har själv ingen kunskap om det jag skriver och ingen bör således läsa eller ta in den information som står skrivet.