Jump to content

Darmowy Moduł do porównywania cen sklepu z cenami konkurencji na CENEO


eman.tuchola

Recommended Posts

Witam wszystkich.

Choć zdaję sobie sprawę że jeszcze dużo nie wiem, postanowiłem stworzyć moduł, dzięki któremu będzie można w łatwy sposób porównyać ceny na produkty w swoim sklepie z cenami konkurencji Ceneo, który chcę udostępnić za darmo na tym forum. Pierwsze próby swoimi siłami już wykonałem i wiem, że jest to możliwe i nawet nie aż tak skomplikowane do zrobienia, a właściciele sklepów internetowych z branży w których trzeba porównywać ceny z konkurencją przy bazie produktów 500 produktów wiedzą co to jest za męczarnia.

 

Jednak napotkałem jeden problem którego nie moge rozgryźć, i to prawdopodbnie banalny problem, a mianowicie:

 

Porównywanie cen miałoby się odbywać na zasazie takiej, iż w panelu administracyjnym w konfiguracji porduktu podaje sie link do produktu na ceneo.

 

Następnie moduł pobierać ma z bazy danych link do tego produktu i wyszukiwać w nim frazy odpowiedziale za najniższą cenę, zdjęcie itd. tj. na ceneo kolejno np. lowPrice i js_image-product.

 

Teraz wszystko wyświetlać ma się w formie tabeli: tj.

 

Id produktu | Zdjęcie produktu | Nazwa produktu | Link do Ceneo| Cena w sklepie | Najniższa cena na Ceneo

 

Id produktu, link do ceneo, i cene w sklepie pobiera z bazy danych. proste

 

Zdjecie produktu, nazwe produktu, najniższa cene wyszukiwać ma w ceneo na podstawie linku do produktu na Ceneo który jest w bazie danych w tabeli ps_product

 

Wie ktoś może jak skonsturować zapytanie w php, bym osiągnał mój efekt który wyszukiwać ma wskazane dane?

 

Chciałem wykonać to w ten sposób:

$zapytanie = "SELECT * FROM `ps_product`";
 //wykonujemy zdefiniowane zapytanie na bazie mysql
 $wynik = mysql_query($zapytanie);
 $ceneo = $_POST['ceneo'];
 $zdjecie = $_POST['zdjecie'];
 $nazwa = $_POST['nazwa'];
 $cena = $_POST['cena'];
 if ($tfield1==''&&$tfield2==''&&$tfield3==''){
        $tfield1=$row[46];$tfield2='js_product-image';$tfield3='product-Name';$tfield4='lowPrice';
    }
 

 echo "<p>";
 echo "<table boder=\"1\"><tr>";
 echo "<td bgcolor=\"ffff00\"><strong>Zdjęcie produktu</strong></td>";
 echo "<td bgcolor=\"ffff99\"><strong>ID Produktu</strong></td>";
 echo "<td bgcolor=\"ffff00\"><strong>Nazwa produktu</strong></td>";
 echo "<td bgcolor=\"ffff99\"><strong>Link do Ceneo</strong></td>";
 echo "<td bgcolor=\"ffff00\"><strong>Cena w sklepie</strong></td>";
  echo "<td bgcolor=\"ffff99\"><strong>Najniższa cena na Ceneo</strong></td>";
 echo "</tr>";
 
 while ( $row = mysql_fetch_row($wynik) ) {
    echo "</tr>";
    echo "<td bgcolor=\"ffff00\"> 

foreach($ceneo as $zdjecie => $image)

{

        echo $image;    

}
 </td>";
    echo "<td bgcolor=\"ffff99\">" . $row[0] . "</td>";
    echo "<td bgcolor=\"ffff00\">" . $row[2] . "</td>";
    echo "<td bgcolor=\"ffff99\">" . $row[46] . "</td>";
		echo "<td bgcolor=\"ffff00\">" . $row[13] . "</td>";
    echo "</tr>";
 }
 echo "</table>";

Ale niestety nie działa... W polu gdzie chciałem by pobrało zdjęcie wyświetla mi się: foreach( as js_product-image => ) { echo ; } 

 

Proszę niech ktoś pomoże! 

 

Pozdrawiam

 

P.S. Przepraszam jeżeli nie zrozumiale wytłumaczyłem.

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

No i nie o to chodzi Moderatorze :D

 

Moduł Price Wars z tego co wiem działa też pod 1.5 i jest taki, ale to jest moduł do integracji a nie do porównywania cen .

Chodzi o to że na przykład sprzedaje iPhony.

 

U mnie iPhone kosztuj 1000 zł. W sklepie konkurencji 990 zł. Sprawdzam by być najtańszym i zmieniam u siebie cenę na 989

Ale potem konkurent zmienia i tak w kółko. Problem w tym ze przy 500 produktach ciągłe sprawdzanie czy jest się konkurencyjnym staje się uciążliwe, tym bardziej że za każdy klik na ceneo trzeba płacić.

 

I ten moduł pokazywałby w jakich produktach jesteśmy najtańsi, a w jakich nie i jaka jest najtańsza cena.

 

Mój problem jest taki.

Jak wyszukać na postawie linka do produktu na ceneo, cenę tego produktu.

W polu powiedzmy "ceneo" tabeli ps_product mam link: http://ceneo.pl/IDProduktu

 

I teraz jak skryptem wywołać wyszukanie na stronie o podanym adresie URL w bazie frazy "lowPrice", która odpowiada za najniższą cenę.

 

Wiem jak to zrobić własnie, ale nie pobierając linku z bazy danych, tylko to nie jest rozwiązanie. Musi być z bazy danych.

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

Z bazy danych na której postawiony jest sklep, nad tym kodem, który podałem mam zdefiniowane połączenie z bazą danych. wiem że nie pisze tego jak moduł, ale projektuje to na zasadzie wtyczki, rozszerzenia, pluginu...

tabela ps_product

pole tab_ceneo

 

pole utworzyłem. dane które mają być pobrane bezpośrednio z bazy danych wyświetlają się prawidłowo.

Ale dane które mają być wyszukiwane w linku z pola tab_ceneo juz nie,.

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

Produkt jest w jednym sklepie - Najniższa cena wyświetla sie zawsze pod nazwą produktu. to jest to "lowPrice" , które trzeba wyszukać. I z tą ceną zawsze konkurujemy.

 

Czyli powinno zadzwiałać coś takiego?


<?php
    $url = $row[46];
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url); /
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);   curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
    $result = curl_exec($ch); 
    curl_close($ch);
     
    preg_match('/<ul class="lowPrice">(.+?)<\/ul>/ism', $result, $wyjscie);        ?>


Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

Czyli tak jak mówi vekia musisz zastosowac cURL. Możesz zapoznać się z tym kurdem: http://www.php.pl/Wortal/Artykuly/PHP/Biblioteki/cURL-cz.-1-Podstawy-i-protokol-HTTP

Rozumię, że najpierw będziesz musiał powiązać produkty z twojego sklepu z adresami stron w ceneo. Po tym wywołujesz funkcję cURL-a, która pobiera ci zawartość strony (czyli wygenerowany HTML). Dzięki wyrażeniu regularnemu wyciągasz z tej zawartości cenę i porównujesz ją z bazą danych.

Link to comment
Share on other sites

Dokładnie o taki efekt mi chodzi, myslę że jest to najprostsze rozwiązanie na ten problem.

 

Słuchajcie, a link w bazie danych powinien być zapisany jako:

 

a) http://ceneo.pl/produkt

B) "http://ceneo.pl/produkt"

 

Dziękuję Wam za pomoc. I za link do kursu, bardzo mi się to przyda!

 

    $url = $row[46];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); /
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);   curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    $result = curl_exec($ch);
    curl_close($ch);
     
    preg_match('strong.price', $result, $wyjscie);       
 

mam taki kod, tylko że wyświetla mi tylko

 

= 'http://www.ceneo.pl/26326612'; = curl_init(); curl_setopt(, CURLOPT_URL,); / curl_setopt(, CURLOPT_RETURNTRANSFER,1); curl_setopt(, CURLOPT_TIMEOUT, 3); = curl_exec(); curl_close(); preg_match('strong.price', , );

 

Wiecie co może być nie tak? Przepraszam że zarzucam pytaniami. Jak nikt mi nie pomoże to i tak jakoś do tego kiedys dojdę, tylko że jakby ktoś wiedział to proszę o nakierowanie.

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

regexpy działają "trochę" inaczej ;)

gotowy kod, na przykładzie: http://www.ceneo.pl/26326612

 

<?PHP
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);   curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    $result = curl_exec($ch);
    curl_close($ch);
    $a=preg_match('/lowPrice\"\>(\d*\,\d*)\<\/strong\>/', $result, $wynik);
    echo $wynik[1];
?>
 
 
 
 
 
regexpów to się kiedyś używało ....  :ph34r:
Link to comment
Share on other sites

Mógłbyś jeszcze mi powiedzieć co tu jest nie tak?

(jestem grafikiem który bierze się za to co nie powinien jak widać)


 //Ustanawiamy połączenie z serwerem mysql
 if ( !mysql_connect($adres_ip_serwera_mysql_z_baza_danych,
 
              $login_bazy_danych,$haslo_bazy_danych) ) {
    echo 'Nie moge polaczyc sie z baza danych';
 	 exit (0);
 }
 //Wybieramy baze danych na serwerze mysql ktora zawiera tabele
 //newsletter gdzie sa dane osob z listy dystrybucyjnej
 if ( !mysql_select_db($nazwa_bazy_danych) ) {
    echo 'Blad otwarcia bazy danych';
 	 exit (0);
 }
 
 //Definiujemy zapytanie pobierające wszystkie wiersze z wszystkimi
 //polami z tabeli newsletter
 $zapytanie = "SELECT * FROM `ps_product`";
 //wykonujemy zdefiniowane zapytanie na bazie mysql
 $wynik = mysql_query($zapytanie);
 


 
 //Wyświetlamy w tabeli html dane pobrane 
 //z tabeli newsletter bazy mysql
 //Najpierw definiujemy nagłówek tabeli html
 echo "<p>";
 echo "<table boder=\"1\"><tr>";
 echo "<td bgcolor=\"ffff00\"><strong>Zdjęcie produktu</strong></td>";
 echo "<td bgcolor=\"ffff99\"><strong>ID Produktu</strong></td>";
 echo "<td bgcolor=\"ffff00\"><strong>Nazwa produktu</strong></td>";
 echo "<td bgcolor=\"ffff99\"><strong>Link do Ceneo</strong></td>";
 echo "<td bgcolor=\"ffff00\"><strong>Cena w sklepie</strong></td>";
  echo "<td bgcolor=\"ffff99\"><strong>Najniższa cena na Ceneo</strong></td>";
 echo "</tr>";

    echo "</tr>";
    echo "<td bgcolor=\"ffff00\"> "<?PHP
    $url = "http://www.ceneo.pl/26326612";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);   curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    $result = curl_exec($ch);
    curl_close($ch);
    $a=preg_match('/lowPrice\"\>(\d*\,\d*)\<\/strong\>/', $result, $wynik);
    echo $wynik[1];
?>"


 </td>";
    echo "<td bgcolor=\"ffff99\">" . $row[0] . "</td>";
    echo "<td bgcolor=\"ffff00\">" . $row[2] . "</td>";
    echo "<td bgcolor=\"ffff99\">" . $row[46] . "</td>";
		echo "<td bgcolor=\"ffff00\">" . $row[13] . "</td>";
    echo "</tr>";
Link to comment
Share on other sites

Twój host pozwala na korzystanie z cURL ?

poza tym składnia leży.

 

echo "<td bgcolor=\"ffff00\"> "<?PHP
$url = "http://www.ceneo.pl/26326612";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$result = curl_exec($ch);
curl_close($ch);
$a=preg_match('/lowPrice\"\>(\d*\,\d*)\<\/strong\>/', $result, $wynik);
echo $wynik[1];
?>"

</td>";

Link to comment
Share on other sites

tak jeszcze zapytam, bo pomysł jest na tyle ciekawy, że mnie wciągnał ;)

to wszystko będzie modułem? czy jako osobny "skrypt", ceny będą aktualizowane z automatu?

 

uwagi:

- produkty wyciągaj z tabeli ps_product_shop

- co jak produkt będizesz miał w promocji? wówczas trzeba uwzględnić tabele ps_specific_price

Link to comment
Share on other sites

Docelowo ma być modułem, najpierw chcę żeby mi zadziałał.

O, a o cenach w promocji nie pomyślałem nawet, kurcze... ale coś muszę wymyślić.

Też mi się wydaje że to jest ciekawy pomysł i strasznie przydatny, ponadto jeżeli uda się już zrobić ceneo to w łatwy sposób będzie można go rozbudować o nokaut czy skąpiec.

 

Dzięki wielkie za pomoc. Mam nadzieję że uda mi się udostępnić tutaj projekt jako gotowy i działający moduł - trochę robię to metoda prób i błędów, ale i tak się nie poddam i skończę dzieło.

 

Zainspirował mnie do tego pewien serwis gdzie w abonamencie (moim zdaniem dużo za wysokim) można właśnie w ten sposób porównywać ceny z konkurencją. Jako że jestem skąpy i wolę najpierw spróbować sam coś zrobić a potem jak mi nie wychodzi dopiero za coś płacić, buduję właśnie ten moduł i mam nadzieję że się uda

Link to comment
Share on other sites

to ja mam pytanie - dlaczego ten moduł opierasz o ceneo ??

moim skromnym zdaniem jest to trochę pójście na skróty - nie wiem jak to wygląda w innych branżach - natomiast w tej w której działam na ceneo jest raptem kilka sklepów które cenowo ni jak się nie mają do cen obowiązujących na rynku (drodzy)

 

nie prościej byłoby zrobić coś takiego że określasz w skrypcie gdzie na danej konkurencyjnej stronie znajduje się cena produktu (typu <h1>cena 5zł</h1> i to zapisujesz sobie do jakiejś tabeli ?

takie rozwiązanie pozwala ci porównywać ceny we wszystkich sklepach a nie tylko obecnych na ceneo

 

 

takie moje 3 grosiki ;)

Link to comment
Share on other sites

serwer się zajedzie gdy trzeba by było sprawdzić np. kilkanaście sklepów, do tego potrzebny byłby vps lub dedyk. Kilkanaście sklepów x kilka tysięcy produktów = zwykły shared szybko wyłapie bana ;) 

 

jak zauważyłeś, wszystko zalezy od branży, dla elektroniki ceneo itp. są idealne

Link to comment
Share on other sites

niby fakt

ale może w takim razie nie robić tego przeszukiwania cen na sztywno

wtedy taki moduł byłby jeszcze bardziej funkcjonalny

 

moja propozycja na funkcjonowanie

dodaję sobie np. ceneo, 2 sklepy konkurencji i np. nokaut do modułu który przeszukuje takie strony

potem określam (np. za pomocą styli) gdzie jest ukryta cena dla każdej ze stron

wyniki umieszczam w tabeli (np. csv)

tak przygotowaną tabelę porównuję z moją bazą

 

Moim zdaniem najbardziej funkcjonalne rozwiązanie

dla osób które potrzebują tylko porównywarki

i dla tych którzy chcą się oprzeć tylko na sklepach konkurencji

a przy takim przeszukiwaniu ban jest mało prawdopodobny

Edited by swiatsmoka (see edit history)
Link to comment
Share on other sites

  • 1 year later...
  • 1 month later...

Cześć, witam.

A więc tak, miałem już napisaną taką aplikację. Jako, że korzystam również z Magento zdecydowałem o tym, że nie będę tego integrował tylko pod jeden system, żeby łatwo i szybko można było z niego korzystać i na Magento i na Preście. Niestety popełniłem jeden błąd - napisałem o tym na forum. Miesiąc później Ceneno zmieniło regulamin że nie można pobierać nic z ich z strony z pominięciem ich API (które jest płatne i to nie mało). Zlikwidowali też mój punkt odniesienia, z którego pobierałem najniższą cenę - takie coś jak najniższa cena nie wyświetla się już wgl. Może sobie dodaję, ale uważam że właśnie to ja jestem przyczyną tych zmian, bo rozwijanie tej aplikacji mogło doprowadzić do uszczuplenia ich portfela za API. Ja się poddałem - mam za małą wiedzę żeby zrobić to pobierając ze wszystkich cen i wyświetlanie najniższych. Raczej to prosta sprawa, ale ja i nie miałem już potem czasu żeby się w to zagłębiać.

 

Na dzisiaj zrobiłbym to prawdopobnie tak, żeby pobierać wszystkie ceny do bazy danych raz dziennie za pomocą Crona (bo tylko raz dziennie jest aktualizowana standardowo oferta) i potem porónywać poprzez filt te najniższe z naszymi ze sklepu. Żeby było to prosto zrobić to ze sklepu wyświetliłbym 2 ceny - normlana i promocyjna . No i ceny ze sklepy zrobiłbym jako pole, w którym tą cenę mozna edytować, żeby również rozwiązać problem szybkiej aktualizacji cen. Żeby szybko aktualizować te ceny, przydałoby się również mieć szybko pod ręką również ceny swojego zakupu, żeby na produktach nie tracić, ale to również móżna jednokrotnie pouzupełniać, a potem tylko aktualizować ceny.

 

 

Moduł dla ludzi opierających swoją sprzedaż o Ceneo - bardzo bardzo potrzebny.

Jednak ja sam nie dam rady go chyba stworzyć. Planuję się tym zająć raz jeszcze, ale już nic nie obiecuję.

My sami spędzamy tygodniowo kilkadziesiąt godzin na aktualizacji cen. To jest nasza zmora, dlatego chcę to zrobić.

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

Witam,

 

myślałem o podobnym module, tylko płatnym ;) wiem doskonale jaka to zmora dostosowywanie cen do rynku, bo robiłem to przez 2 lata w zupełnie innym systemie, ale zawsze było to czasochłonne. 

 

Jeśli chodzi o moduł, używanie regex jest dobre, jeśli nie potrafisz używać DOMXPath ;) XPath jest lepsze do modyfikacji, może być też bardziej precyzyjne, bo opiera sie na drzewie DOM strony i klasach/id w htmlu a nie na wyrażeniu regularnym, wiem, bo zaczynałem swoje przygody z parsowaniem stron właśnie za pomocą regexa, a dopiero później pojawił się przeskok jakościowy do XPath.

 

Co do ceneo, oni od dawna blokowali już takie masowe zaciągania danych sugerując ich API jako jedyne słuszne rozwiązanie (swoją drogą dobre w teorii, ale  w praktyce strasznie wolne potrafi być).

Ryzyko jest, bo mogą Ci zbanować IP i oczywiscie porblemy natury prawnej, rozwiązaniem nieidealnym jest stosowanie Proxy, które utrudni wykrycie przy kilkuset zapytaniach dziennie, ale samo proxy jest już rozwiązaniem platnym (bo mówimy tu o czymś dobrym, darmowe proxy jest ble) ponadto, gdyby stworzyć z tego moduł i wszyscy pracowaliby na ograniczonej liczbie proxy, to wykrycie byłoby prostsze.

 

Dlatego, niestety najlepiej byloby stworzyć moduł płatny w oparciu o api ceneo, legalnie i bez problemów w przypadku aktualizacji.

 

ale jakbyś chciał się bawić z ceneo po cichu, to sprawdź ten kod php poniżej, który pokaze Ci najniższą cenę dla danego produktu podanego w $url (zauważ, że podałem linka do strony z sortowaniem od najtanszej ceny [#tab=click_scroll]):

 



<?php


$url = 'http://www.ceneo.pl/32504000;0280-0.htm#tab=click_scroll';


$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTMLFile($url);
$xpath = new DOMXpath($doc);


$cena = $xpath->query('//a[@class="product-price go-to-shop"]');
echo trim($cena->item(0)->nodeValue);
?>


 

wyciągnięcie danych co to za sklep, koszt przesyłki, jest równie łatwy i sprowadzałby się do dodanie kilku linijek kodu, a nie męczenia się z wymyślaniem regexu ;)

Link to comment
Share on other sites

  • 5 months later...

Akurat mam czas i znowu wróciłem do tematu.

Jash_Tech

Dzięki za wkład, lecz metoda którą podałeś podaje nie najniższą cenę, a pierwszą z góry na liście :)

Co to oznacza ? no na przykładzie tego produktu:

http://www.ceneo.pl/19716367#mh=s2w7DrmH38004smegpCnmu5PjKDp_ewytp5CpmiEkyhOQpTqyy1nJYHGmpIkXPryFxoYITWoG5mEMcA5gA4OUTHgXTrUuNRyqJDr7JH8gqF9s9EYXmdalCCkHbzSLXhAIuV9SLuE2IoUGlHAtj_uuH_-LPag6BWVyWzJv5JdJVTXog8w9zU9Gx56Qx6O3vWdkSE6cZA2

 

wyświetla cenę 4879,00 zĹ a najniższa to 4600 na ten moment :)

 

Zaraz zaczynam analizę Twojej wskazówki, i z niej skorzystam prawdopodbnie :)

 

EDIT:

Zwracam honor - doczytałem to o sortowaniu i działa :D

Edited by eman.tuchola (see edit history)
Link to comment
Share on other sites

Nooo, bo już chciałem pisać reprymendę za niedoczytanie ;)

 

Tak teraz myślę o tym, że może lepiej byłoby używać standardowego linka, zczytać wszystkie ceny ze strony do tablicy, posortować ją i dopiero wyciągnąć najniższą cenę z tablicy?

dzięki temu nie będzie złych cen, jeśli jakaś cena będzie promowana jako pierwsza pomimo sortowania ;)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...