Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie strony - lista
Forum PHP.pl > Forum > PHP
sebax3x
Chciałbym zrobić ranking użytkowników z serwisu wrzuta.pl (kto ile plików dodał, jakie) i mam problem, muszę pobrać listę wszystkich użytkowników - ma ktoś pomysł jak to można zrobić?
Ranking ten służyłby późniejszemu zaznaczaniu użytkowników, którzy nielegalnie rozprowadzają moje piosenki w tym serwisie - jak wiadomo zgłaszanie wszystkich piosenek pojedynczo mija się z celem.
Dodam, ze mój zespół traci przez wrzutę i inne serwisy tego typu bardzo dużo, pewnie nie tylko ja mam z tym problem - pisałem do wrzuty w tej sprawie, jednak oni nie chcą kasować wszystkich plików z nazwą mojego zespołu w tytule ponieważ nie leży to w ich kompetencjach.
Dziękuję serdecznie za okazaną pomoc - oczywiście mile widziane są także rozwiązania w innych językach programowania.
Fifi209
Nie mam konta na wrzucie ale nie widzę opcji listowania wszystkich użytkowników serwisu.
Może poprosisz google o pomoc? smile.gif
Wpisz w google coś takiego (dla przykładu nirvana):
nirvana site:wrzuta.pl

Następnie odczytaj ile stron zostało znalezionych, później jeden po drugim wyłap z wyników google i wrzuć do siebie do tablicy, następnie możesz zrobić automatyczne raportowanie przez np. curl
sebax3x
Właśnie tak próbowałem, niestety google blokuje przed curlem (i file_get_contents) pokazuje tylko kilka stron wyników,
zespół który reprezentuję jest dość popularny - dodatkowo taki program służyłby nie tylko mi. Najlepiej jakby na bieżąco aktualizował listę użytkowników - dodam, że próbowałem parsować serwis wrzuta.pl - ale on bardzo szybko blokuje ip (gdy parsuje się wyniki wyszukiwania), co jest zresztą zrozumiałe z ich polityką - powstaje wiele wyszukiwarek "opartych na wrzucie". Pewnie trzeba stworzyć jakiś system (bota?) który przeszukiwałby kolejne strony serwisu i zapisywał unikalnych użytkowników do tablicy (skrypt sprawdzający zawartość katalogu użytkownika już mam).
Fifi209
Cytat(sebax3x @ 23.03.2010, 14:13:53 ) *
Właśnie tak próbowałem, niestety google blokuje przed curlem (i file_get_contents) pokazuje tylko kilka stron wyników,
zespół który reprezentuję jest dość popularny - dodatkowo taki program służyłby nie tylko mi. Najlepiej jakby na bieżąco aktualizował listę użytkowników - dodam, że próbowałem parsować serwis wrzuta.pl - ale on bardzo szybko blokuje ip (gdy parsuje się wyniki wyszukiwania), co jest zresztą zrozumiałe z ich polityką - powstaje wiele wyszukiwarek "opartych na wrzucie". Pewnie trzeba stworzyć jakiś system (bota?) który przeszukiwałby kolejne strony serwisu i zapisywał unikalnych użytkowników do tablicy (skrypt sprawdzający zawartość katalogu użytkownika już mam).


No dokładnie, musiałbyś mieć bota który chodzi po stronie i zapisuje użytkowników unikalnych.
sebax3x
Próbowałem coś takiego napisać, ale już rozkładam ręce - są użytkownicy do których praktycznie nikt nie linkuje. Próbowałem też korzystać z istniejących technologii wykorzystywanych min. przez serwis filestube.com - sphinx search engine, ale wydaje mi sie to strasznie skomplikowane. Zainstalowałem tez sphider search php - ale działa on bardzo wolno i szuka nieco "bezsensownie w kółko".
Jak twoim zdaniem najoptymalniej byłoby stworzyć bota - ja próbowałem "latać" po linkach do podobnych utworów, ale po pierwsze w końcu taki bot się zapętla, a po drugie to strasznie nieoptymalne.
Może jesteś na tyle biegły aby w jakiś sposób wylistować (xml?) tę listę, bo nie wierzę, żę nie ma takiej opcji, chociażby dla google bota.
mayu11
Zawsze można spróbować znaleźć artykuł na pozwanie ich do sądu :]
Myślę, że to dałoby się jakoś zrobić.
Fifi209
To tak przemyślałem temat... smile.gif

Tworzysz sobie bazę danych w moim przypadku o nazwie: wrzuta
A w niej tabelę: users
  1. CREATE TABLE `users` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL,
  4. `status` tinyint(1) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. UNIQUE KEY `name` (`name`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;


Plik php wygląda tak:
  1. <?php
  2.  
  3. $con = mysql_connect('localhostt', 'user', 'pass');
  4. mysql_select_db('wrzuta', $con);
  5.  
  6. function save($array) {
  7. foreach ($array as $row) {
  8. mysql_query('INSERT INTO `users` VALUES(null, "'.$row.'", 0)');
  9. }
  10. return true;
  11. }
  12.  
  13. function getUsers($url) {
  14. $site = file_get_contents($url);
  15.  
  16. $site = str_replace('http://www.wrzuta.pl/', '#', $site);
  17. $site = str_replace('http://c.wrzuta.pl/', '#', $site);
  18. $site = preg_replace('#http://c[0-9]+\.wrzuta\.pl/#', '#', $site);
  19. preg_match_all('#http://[^\.]+.wrzuta.pl/#is', $site, $matches);
  20.  
  21. $users = array_unique($matches[0]);
  22.  
  23. return $users;
  24. }
  25.  
  26. $select = mysql_query('SELECT `id`, `name` FROM `users` WHERE `status` = 0 LIMIT 20');
  27.  
  28. if (mysql_num_rows($select) > 0) {
  29. while ($data = mysql_fetch_assoc($select)) {
  30. if (!save(getUsers($data['name']))) {
  31. break;
  32. }else{
  33. mysql_query('UPDATE `users` SET `status` = 1 WHERE `id` = '.$data['id']);
  34. }
  35. }
  36. }else{
  37. save(getUsers('http://www.wrzuta.pl/'));
  38. }
  39.  
  40.  
  41.  
  42. ?>


Obok pliku php tworzysz sobie plik bat (zakładam że jesteś na windowsie)
W moim przypadku wygląda on tak:
Kod
@ECHO OFF
:start
php wrzuta.php
goto start

Może się zmienić ścieżka do php (możesz nie mieć dodanego w zmiennych środowiskowych) i nazwa pliku.

Teraz idąc dalej stworzyłem kod, który wykonuje to zadanie troszkę szybciej
  1. <?php
  2.  
  3. ini_set("memory_limit", "32M");
  4.  
  5. $con = mysql_connect('localhost', 'user', 'pass');
  6. mysql_select_db('wrzuta', $con);
  7.  
  8. function save($array) {
  9. foreach ($array as $row) {
  10. mysql_query('INSERT INTO `testy` VALUES(null, "'.$row.'", 0)');
  11. }
  12. return true;
  13. }
  14.  
  15. function getUsers($arr) {
  16. $ch = array();
  17. $m_h = curl_multi_init();
  18. $sites = array();
  19. $users = array();
  20.  
  21. foreach ($arr as $key => $val) {
  22. $ch[$key] = curl_init($val);
  23. curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, true);
  24. curl_multi_add_handle($m_h, $ch[$key]);
  25. }
  26. $running=null;
  27. do{
  28. curl_multi_exec($m_h,$running);
  29. }while($running > 0);
  30.  
  31. foreach ($ch as $key => $val) {
  32. $sites[$key] = curl_multi_getcontent($val);
  33. curl_multi_remove_handle($m_h, $val);
  34. }
  35.  
  36. curl_multi_close($m_h);
  37.  
  38. foreach ($sites as $key => $val) {
  39. mysql_query('UPDATE `testy` SET `status` = 1 WHERE `id` = '.$key);
  40. $val = str_replace('http://www.wrzuta.pl/', '#', $val);
  41. $val = str_replace('http://c.wrzuta.pl/', '#', $val);
  42. $val = preg_replace('#http://c[0-9]+\.wrzuta\.pl/#', '#', $val);
  43. preg_match_all('#http://[^\.]+.wrzuta.pl/#is', $val, $matches);
  44. $users = array_merge($users, $matches[0]);
  45. }
  46.  
  47. $users = array_unique($users);
  48. save($users);
  49. }
  50.  
  51.  
  52.  
  53. $select = mysql_query('SELECT `id`, `name` FROM `testy` WHERE `status` = 0 LIMIT 80');
  54.  
  55. if (mysql_num_rows($select) > 0) {
  56. $users = array();
  57. while ($data = mysql_fetch_assoc($select)) {
  58. $users[$data['id']] = $data['name'];
  59. }
  60. getUsers($users);
  61. }else{
  62. getUsers(array('http://www.wrzuta.pl/'));
  63. }
  64.  
  65.  
  66.  
  67.  
  68. ?>
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.