Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP][MySQL] Najszybszy sposób ściągania danych z innej strony
Forum PHP.pl > Forum > Przedszkole
iber
Do tej pory wyciągałem 10 różnych danych ze strony za pomocą preg_match (_all) i zapisywałem do bazy danych , po paru poprawkach w kodzie dla 25 stron długość wykonywania skryptu trwa ok. 70 sec. Niestety takich stron mam do sprawdzenia 530~ więc to trochę trwa.
I tu się rodzi pytanie czy w innym języku da się zrobić to dużo wydajniej?
Słyszałem o czymś takim jak pobieranie równoległe w jquery+ajax , jednak nigdy nie miałem z tymi językami doczynienia więc nie wiem z czym to się je.
Wujek google zawsze na posterunku tylko nie wiem czego mam szukać , więc proszę o wszelkie wskazówki. Język , nazwy bibliotek/funkcji, cokolwiek.
Gość
O ile nie robisz naprawde bardzo, bardzo skompikowanych regexpow nie jestes w stanie preg_matcha zajechac na 70 sekund na tak malym zestawie danych. Problemem weic nie jest jexzyk, bo kazdy sposob pobiera dane mniejwiecej tak samo szybko (i tak zapewne przez cURLa), a raczej serwer z ktorego pobierasz dane jest poprstu wolny. Lub może używasz do tego tora? W pierwszym przypadku nic juz z tym nie zrobisz, w drugim zainteresuj sie tym, lub innymi rozwiazaniami (nie tak trudno jest napisac swoje).

Napisz wiecej info to poradzę więcej.
Gość
Jezeli anprawde podejrzewasz ze tak dlugo rzeźbią się same regexpy , a nie dane z serwera to pokaż próbkę smile.gif
iber
  1. while ($ostatnieid+1>$id)
  2. {
  3. $query = mysql_fetch_array( mysql_query( "SELECT `linklolking` FROM `torgrating` WHERE `id` = '$id' "));
  4. $linklolking = $query['linklolking'];
  5. $query = mysql_fetch_array( mysql_query( "SELECT `linktorg` FROM `torgrating` WHERE `id` = '$id' "));
  6. $linktorg = $query['linktorg'];
  7. $strona = file_get_contents($linklolking);
  8. //score
  9. preg_match_all('#<div style="display: inline-block; margin-left: -8px; vertical-align: middle; font: bold 24px/32px &quot;Trebuchet MS&quot;;">(.*)</div>#iU', $strona, $wynik);
  10. $score = $wynik[1][1];
  11. //serwer
  12. preg_match('#<div style="margin-left: 3px; font-size: 14px; line-height: 12px; font-weight: normal; white-space: nowrap;">(.*)&nbsp;#iU', $strona, $wynik);
  13. $serwer = "$wynik[1]";
  14. //nick
  15. preg_match('/<div style="font-size: 36px; line-height: 44px; white-space: nowrap;">(.*)<\/div>/iU', $strona, $wynik);
  16. $lolnick = "$wynik[1]";
  17. //dywizja
  18. preg_match_all('#<div class="personal_ratings_rating" style="margin-bottom: 0; font-size: 20px; height: 30px; font: bold 20px \'Trebuchet MS\';">(.*?)</div>#iU', $strona, $wynik);
  19. $dywizja = $wynik[1][1];
  20. $dywizja = preg_replace('#</?span[^>]*>#is', '', $dywizja);
  21. preg_match('#<span class="member_username">(.*)</span>#iU', $strona, $wynik);
  22.  
  23. $strona = file_get_contents($linktorg);
  24. preg_match('#<li class="navbit lastnavbit"><span>(.*)</span>#iU', $strona, $wynik);
  25. $nicktorg = "$wynik[1]";
  26. mysql_query("UPDATE `torgrating` SET `score` = '$score' , `serwer` = '$serwer' , `lolnick` = '$lolnick' , `dywizja` = '$dywizja' , `nicktorg` = '$nicktorg' WHERE `id` = '$id' ");
  27. $id++;
  28. }


W skrócie : pobiera 2 linki z bazy danych , wyciąga dane z tych linków , zapisuje spowrotem do bazy. I tak dla 12 osób kod wykonuje się średnio 70 sec.

Pocięłem troche kod i okazało się że pobranie tej strony :
  1. $strona = file_get_contents($linklolking);

zajmuje 80% (!) czasu całego wykonywania kodu, ma ona 23tys. linijek kodu jak sprawdziłem.
Da się jakoś wyciągać dane bez pobierania całej?
Helid
Zamiast używać wyrażeń regularnych skorzystaj z obiektu dom (dane wczytaj jako HTML) oraz xpatha do wyszukiwania danych.

http://php.net/manual/en/simplexmlelement.xpath.php
flashdev
Cytat(iber @ 14.10.2013, 21:09:07 ) *
Do tej pory wyciągałem 10 różnych danych ze strony za pomocą preg_match (_all) i zapisywałem do bazy danych , po paru poprawkach w kodzie dla 25 stron długość wykonywania skryptu trwa ok. 70 sec. Niestety takich stron mam do sprawdzenia 530~ więc to trochę trwa.
I tu się rodzi pytanie czy w innym języku da się zrobić to dużo wydajniej?
Słyszałem o czymś takim jak pobieranie równoległe w jquery+ajax , jednak nigdy nie miałem z tymi językami doczynienia więc nie wiem z czym to się je.
Wujek google zawsze na posterunku tylko nie wiem czego mam szukać , więc proszę o wszelkie wskazówki. Język , nazwy bibliotek/funkcji, cokolwiek.


W js da się, ponieważ są tam funkcje działające asynchroniczncie. Ale w w curl, który jest w php, też można pobierać kilka plików równolegle. To na pewno może przyspieszyć ich ściągnięcie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.