Jak usprawnić program i jego wynik wyświetlić w excelu?

0

Witam!

Moje pytanie dotyczy programu utworzonego w oparciu o PHP i cURL, a dokładniej zastanawiam się w jaki sposób mógłbym usprawnić działanie programu i wynik przerzucić do tabeli w excelu? Wracając do programu, ma on za zadanie pobieranie informacji na temat wymagań gry. Potrzebuje do tego programu ponieważ tych danych jest ogrom, a muszę utworzyć bazę danych do projektu. Program chciałbym usprawnić pod takim względem, że jak pobiera mi te wszystkie dane ze strony, to są one podzielone osobno na procesor, GPU, RAM itd. i każda informacja jest wpisywana od razu do odpowiedniej komórki w excelu, czy coś takiego jest możliwe? Dziękuje za wszelkie rady.

<?php

$curl = curl_init();

for( $i = 23800; $i<23850; $i++)
{
$url = "https://www.game-debate.com/games/index.php?g_id=$i&game=";

curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //dezaktywuje ssl
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //magazynuje 


$result = curl_exec($curl);



preg_match_all('!<div class="devDefSysReqMin">\n<ul class="devDefSysReqList">\n<li>(.*?)<\/li>.<li>\n(.*?).<\/li>\n<li>\n(.*?).<\/li>\n<li>\n(.*?)\n<\/li>\n<li>\n(.*?)\n<\/li>\n<li>(.*?)<\/li>\n<\/ul>\n<\/div>!', $result, $matches);


$CPU = array($matches[0]); //bez powtórzeń


print_r($CPU);

}



curl_close($curl);
?>
0

nie jest możliwe, możesz oczywiście utworzyć, zapisać lub wysłać do pobrania plik. ale nie, że pisząc w php będziesz edytować okno excela no takiej magii nie ma.

0

Ale w sensie, że Excel jako silnik bazy danych? :D

0

Możesz zrobić tak: program przez cURL pobiera dane, zapisuje do bazy danych, następnie w Excelu robisz sobie, np. przez ODBC połączenie z ta bazą i ciągniesz dane. Do tego jakieś makra, visual basic, etc. i można wszystko elegancko zrobić.

0

W sensie to wygląda tak, że tworzę bazę danych w MySQL, ale nie wiem jak zrobić program tak, żeby z takiego odcinka kodu:

<div class="devDefSysReqMin">
<ul class="devDefSysReqList">
<li>MINIMUM PC REQUIREMENTS: 720P 30 FPS AT LOW SETTINGS</li>
<li>O/S: Windows 7 64-bit, 8.1 64-bit or Windows 10 64-bit</li>
<li>CPU: Intel core i3-2100T @ 2.5GHz/AMD FX 6100, or better</li>
<li>RAM: 8GB</li>
<li>GPU: NVIDIA GeForce GTX 650Ti 2GB, AMD Radeon HD 7750 2GB</li>
<li>DirectX: 11 Compatible video card or equivalent</li>
<li>Hard Drive: 25GB</li>
<li>Input: At least one Xbox-compatible/PlayStation-compatible controller</li>
<li>Online connection requirements: 256KBPS or faster Internet connection</li> </ul>
</div>

pobierał mi dane "Procesor", "Karta Graficzna" i było to podzielone w miarę estetycznie, w sensie przypominało kolumny i wiersze jak w excelu, bądź udało się od razu po pobraniu treści wrzucić ją do excela, bazy w MySQL itp.

Może zmienić język, na jakiś JavaScript i tam próbować zrobić ten web scrapping?

0

Prawdę mówiąc opcja bazy danych była by dla mnie bardzo przydatna jeżeli by bardzo dobrze program działał i od razu wpisywał odpowiednią nazwę gry do odpowiednich podzespołów w sensie w odpowiednim rekordzie wszystko. Myślałem o Excelu jedynie pod względem bardziej technicznym żeby sprawdzić później te wszystkie dane :)

0

Robisz tabelę SQL, i wrzucasz do niej dane, to jest dość proste. Kwestia tylko jak / w czym to chcesz przeglądać - można podpiąć do excela, można oglądać w jakimś kliencie bazy danych - np. darmowy MySQL Workbench, albo PhpMyAdmin, albo samemu sobie zrobić skrypty w PHP do pobierania rekordów z bazy i wyświetlania, opcji masz wiele.

0

Ogólnie to chciałbym żeby to działało tak, że pobiera mi dane do zmiennej np. Porc-Min przypisze mi do zmiennej $PROCMIN no i później tą zmienną włożę do bazy w MySQL, a przeglądać ją chcę na stronie, ponieważ muszę stworzyć stornę internetową która wyświetla te wszystkie dane które włożę do niej :) Jedyny problem który teraz napotkałem, to że jak mam pętle for to każdy preg_match_all tworzy mi się w nowej tabeli, a jest możliwość żeby kilka wynikó z preg_match_all było w jednej tabeli w sensie array() i można było się dostać do danego wyników przez numer co ma przypisany, jest to chyba numer rekordu w tablicy jeżeli się nie mylę?

0

Zamiast robić skomplikowane długie wzorce zrób dwa proste:

preg_match_all('/<ul\s+class="devDefSysReqList">(.*?)<\/ul>/ims', $result, $result2);
  
preg_match_all('/<li>(.*?)<\/li>/ims', $result2[1][0], $matches);
  
print_r($matches[1]);
0

Dziękuję Tom, świetny sposób na wyciąganie danych, ale napotkałem jeszcze jeden problem w trakcie, zacząłem wyciągać dane, i np. dane procesora nie zawsze są pod tym samym indeksem :/ czyli wychodzi na to ze zostało mi szukać przypadków i rozpisywać każdy z osobna? W załączniku przesyłam wynik z wykorzystaniem kodu.

0

Musisz dokonywać dodatkowych detekcji, np. czy jest slowo CPU, etc. a i tak mogą się znaleźć nietypowe przypadki, plus nigdy nie masz gwarancji, że coś się nie zmieni na stronie z której ciągniesz dane.

Dlatego musisz mieć system powiadamiania o błędach i raportowania ich, oraz dwa: musisz mieć system który nie będzie za bardzo atakował strony tylko odpalał nie więcej niż np. jedno zapytanie na 3 sekundy. Inaczej w końcu ktoś się tam u nich zorientuje i zablokuje IP Twojego serwera, albo i gorzej - zgłosi abuse do firmy gdzie masz serwer lub do providera który dostarcza CI net, jeżeli robisz to np. z domu. Nie wolno spamować za bardzo takimi robotami.

0

Dziękuję za radę, w takim razie zostało mi teraz stworzenie funkcji która opóźnia wykonania zapytań :) błędy i raportowanie ich to wyższa szkoła jazdy, tego nie potrafię, ale wystarczy mi tylko to, żeby przesyłało wszystko do odpowiedniej tableki w MySQL i będę szczęśliwy. program na ten moment wygląda tak:


<?php
$curl = curl_init();



for ($i = 35275; $i < 35290; $i++){
$url = "https://www.game-debate.com/games/index.php?g_id=$i&game=";

curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //dezaktywuje ssl
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //magazynuje 


$result = curl_exec($curl);

preg_match_all('/<div class="devDefSysReqMin">(.*?)<\/div>/ims', $result, $result2);

// pętla system
if(preg_match_all('/<li>O.S:(.*?)<\/li>/ims', $result2[1][0], $OS)){
}
elseif(preg_match_all('/<li>OS:(.*?)<\/li>/ims', $result2[1][0], $OS)){    
}
elseif(preg_match_all('/<li>\sO.S:(.*?)<\/li>/ims', $result2[1][0], $OS)){    
}
elseif(preg_match_all('/<li>\sOS:(.*?)<\/li>/ims', $result2[1][0], $OS)){    
}
elseif(preg_match_all('/<li>\sO.S:(.*?)\s<\/li>/ims', $result2[1][0], $OS)){    
}
elseif(preg_match_all('/<li>\sOS:(.*?)\s<\/li>/ims', $result2[1][0], $OS)){    
}
//elseif(preg_match_all('/<li>Windows(.*?)<\/li>/ims', $result2[1][0], $OS)){    
//}
else{
    
    preg_match_all('/<li>Windows(.*?)<\/li>/ims', $result2[1][0], $OS);
}

//pętla procesor
if(preg_match_all('/<li>CPU:(.*?)<\/li>/ims', $result2[1][0], $CPU)){
}
elseif(preg_match_all('/<li>\sCPU:(.*?)<\/li>/ims', $result2[1][0], $CPU)){    
}
elseif(preg_match_all('/<li>\sCPU:(.*?)\s<\/li>/ims', $result2[1][0], $CPU)){    
}
elseif(preg_match_all('/<li>Processor:(.*?)<\/li>/ims', $result2[1][0], $CPU)){    
}
elseif(preg_match_all('/<li>\sProcessor:(.*?)<\/li>/ims', $result2[1][0], $CPU)){    
}
elseif(preg_match_all('/<li>\sProcessor:(.*?)\s<\/li>/ims', $result2[1][0], $CPU)){    
}
//elseif(preg_match_all('/<li>Intel(.*?)<\/li>/ims', $result2[1][0], $CPU)){
//}
else{
    
    preg_match_all('/<li>Intel(.*?)<\/li>/ims', $result2[1][0], $CPU);
}

//pętla RAM
if(preg_match_all('/<li>RAM:(.*?)<\/li>/ims', $result2[1][0], $RAM)){
}
elseif(preg_match_all('/<li>\sRAM:(.*?)<\/li>/ims', $result2[1][0], $RAM)){    
}
elseif(preg_match_all('/<li>\sRAM:(.*?)\s<\/li>/ims', $result2[1][0], $RAM)){    
}
elseif(preg_match_all('/<li>Memory:(.*?)<\/li>/ims', $result2[1][0], $RAM)){    
}
elseif(preg_match_all('/<li>\sMemory:(.*?)<\/li>/ims', $result2[1][0], $RAM)){    
}
elseif(preg_match_all('/<li>\sMemory:(.*?)\s<\/li>/ims', $result2[1][0], $RAM)){    
}
//elseif(preg_match_all('/<li>(.*?)RAM<\/li>/ims', $result2[1][0], $RAM)){    
//}
else{
   
    preg_match_all('/<li>(.*?)RAM<\/li>/ims', $result2[1][0], $RAM);
}

//pętla GPU
if(preg_match_all('/<li>GPU:(.*?)<\/li>/ims', $result2[1][0], $GPU)){
}
elseif(preg_match_all('/<li>\sGPU:(.*?)<\/li>/ims', $result2[1][0], $GPU)){    
}
elseif(preg_match_all('/<li>\sGPU:(.*?)\s<\/li>/ims', $result2[1][0], $GPU)){    
}
elseif(preg_match_all('/<li>Video:(.*?)<\/li>/ims', $result2[1][0], $GPU)){    
}
elseif(preg_match_all('/<li>\sVideo:(.*?)<\/li>/ims', $result2[1][0], $GPU)){    
}
elseif(preg_match_all('/<li>\sVideo:(.*?)\s<\/li>/ims', $result2[1][0], $GPU)){    
}
//elseif(preg_match_all('/<li>NVidia(.*?)<\/li>/ims', $result2[1][0], $GPU)){    
//}
else{
    preg_match_all('/<li>NVidia(.*?)<\/li>/ims', $result2[1][0], $GPU);
}

//pętla HDD
if(preg_match_all('/<li>Hard\sDrive:(.*?)<\/li>/ims', $result2[1][0], $HDD)){
}
elseif(preg_match_all('/<li>\sHard\sDrive:(.*?)<\/li>/ims', $result2[1][0], $HDD)){    
}
elseif(preg_match_all('/<li>\sHard\sDrive:(.*?)\s<\/li>/ims', $result2[1][0], $HDD)){    
}
//elseif(preg_match_all('/<li>Storage:(.*?)<\/li>/ims', $result2[1][0], $HDD)){    
//}
else{
    preg_match_all('/<li>Storage:(.*?)<\/li>/ims', $result2[1][0], $HDD);
}

print_r($OS);
print_r($CPU);
print_r($GPU);
print_r($RAM);
print_r($HDD);

}

?>

I właśnie zastanawiam się, jak zrobić taki myk, żeby za każdym wykonaniem pętli, wypełniała mi się tabela w MySQL, służy do tego funkcja insert into jeżeli się nie mylę, jedyny problem jaki mam to z zalogowaniem się do bazy i wybraniem tabeli której ma używać :) A jeżeli chodzi o tą funkcję opóźniającą, to jest na to jakaś konkretna komenda?

0

Można to zrobić lepiej

preg_match_all('/<ul\s+class="devDefSysReqList">(.*?)<\/ul>/ims', $result, $result2);
  
preg_match_all('/<li>(.*?)<\/li>/ims', $result2[1][0], $matches);

foreach ($matches[1] as &$found) {


}

I teraz w pętli analizujesz $found

Do opóźnienia możesz użyć funkcji sleep - np. sleep(3) uśpi program na 3 sekundy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1