Projektowanie stron WWW od podszewki

Artykuły na każdy temat

[PHP] Ściąganie demotywatorów na dysk

Dodano 16.11.2009r. o 05:11
Musiałem ostro na łeb spaść by to wyprodukować. No cóż takie życie.

Nowa wersja skryptu

Uwaga! Powstała nowa, lepsza wersja skryptu. Aby dowiedzieć się więcej skocz do artykułu Ripper grafiki czyli jak ściągnąć obrazki z dowolnej strony.

Wymagania

Po pierwsze idźcie po wiadro i stos papierowych ręczników bo możecie zaślinić cały dywan i klawiaturę. Nie odpowiadam za euforie i inne skutki uboczne tego co zrobicie i zobaczycie Wink Co nam będzie potrzebne? Naturalnie sprzęt, na którym wykonamy tą jakże brutalna operacje!

Wymagania na serio

Prędkość przeprowadzonego procesu będzie zależeć od paru czynników. Po pierwsze od naszego kochanego CPU. Musicie być świadomi, że indeksacja i ściąganie tych plików potrwa dłuższą chwilę, która to obciąży procesor do granic możliwości. Na wszelki wypadek przygotujcie także gaśnice. Proces, który wykonałem trwał ~2 godziny. Moim zdaniem jak na jakieś 6 tysięcy plików to całkiem względnie zważywszy na to, że nie mam super kombajnu na lewicy mojej nogi. Drugim istotnym parametrem jest prędkość łącza. To od niej będzie zależało jak szybko zassiemy to co naszej duszy potrzeba. Trzecim, dość istotnym parametrem jest obciążenie aktualne serwisu demotywatory. Radziłbym przeprowadzić tą operacje w nocy. Za dnia może ostro mulić ich serwer. Kolejnym parametrem może być konfiguracja serwera lokalnego. Upewniamy się, że w php.ini zmienna max_execution_time ma wartość 0! Bez tej czynności prawdopodobnie po chwili zobaczycie komunikat błędu o przekroczeniu limitu czasowego. Innym parametrem mogą być zasobożerne aplikacje działające w tle. Wyłączcie wszystko co zbędne. Naturalnie gadu-gadu możecie zostawić z opisem "Właśnie zasysam demotywatory na dysk". Poinformujmy także domowników o fakcie ściągania, ażeby to nie dostać przez przypadek patelnia w twarz bo "zamulasz neta" albo co gorsza "zabrałeś mi internet". Kolejną rzeczą miało być zaopatrzenie się w przeglądarkę, która nie blokuje dużej ilości odświeżeń. Docelowo skrypt odświeżał się po każdej zaindeksowanej stronie (proces pierwszy). Po chwili namysłu w momencie pisania tego artykułu doszedłem do wniosku, że lepiej jednym ciurkiem zaindeksować do bazy danych. Ostatnia rzeczą, na która wpadłem jest RAM. Jeżeli macie gdzieś pod łóżkiem bądź w szafie dodatkowe kości to włóżcie je do pieca dla szpanu.

Informacje dodatkowe

Skrypt, który zostanie za chwilę zademonstrowany ściąga tylko i wyłącznie zaakceptowane demotywatory ze strony. Łatwo będzie przerobić ten skrypt, ażeby to ściągał także te czekające na akceptacje. Wystarczy lekka korekta adresu z
Kod:
http://demotywatory.pl/page/
na
Kod:
http://demotywatory.pl/poczekalnia/page/
Myślałem także by przerobić skrypt tak aby ściągał amerykańską wersję demotywatorów lecz sobie darowałem! A przynajmniej nie na tą noc rezerwuje sobie tą operacje Wink
Jeżeli ktoś potrzebuje paczkę skryptu to znajduje się ona w dziale skrypty pod adresem Ripper demotywatorów. Uważam, że skrypt jest mało wydajny aczkolwiek wystarczający, ażeby dojść do celu. Mogłem pokusić się o drobna optymalizacje lecz darowałem sobie.

Źródło skryptu

struct.sql czyli struktura bazy danych
Kod:
CREATE TABLE `graphic` (
  `address` varchar(100) collate utf8_polish_ci NOT NULL default '',
  PRIMARY KEY  (`address`),
  UNIQUE KEY `address` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; 
config.php to chyba wiadomo do czego służy bo nazwa mówi sama za siebie?
Kod:
<?php
#--------------------------------------------+
# Author: CapaciousCore                      |
# Website: CapaciousCore.pl                  |
#                                            |
#               Wszystkie prawa zastrzeżone! |
#--------------------------------------------+

# Dir
$cfg['dir']['img'] = './graphic/'// Naturalnie możemy podać ścieżkę do innej partycji włącznie
# MySQL
$cfg['mysql']['host'] = 'localhost'// Host of database
$cfg['mysql']['database'] = 'demotywatory'// Name of database
$cfg['mysql']['login'] = ''// Login to database
$cfg['mysql']['password'] = ''// Password to database
# Other
$cfg['url_name'] = 'http://demotywatory.pl/page/'// Adres, z którego będziemy indeksować

// Łączenie z baza danych
mysql_connect($cfg['mysql']['host'], $cfg['mysql']['login'], $cfg['mysql']['password']);
mysql_select_db($cfg['mysql']['database']);
mysql_query("SET NAMES 'latin2'");
?>
indexing.php czyli plik odpowiedzialny za zaindeksowanie adresów obrazków graficznych
Kod:
<?php
#--------------------------------------------+
# Author: CapaciousCore                      |
# Website: CapaciousCore.pl                  |
#                                            |
#               Wszystkie prawa zastrzeżone! |
#--------------------------------------------+

include('./config.php');

/***********************************************************************************************
 * W dniu 16-11-2009 było 723 podstron demotywatorów,                                          *
 * patrz na dół Demotywatory.pl i sprawdź ostatnią zastronicowaną stronę                       *
 * dodałem kilka podstron (patrz warunek pętli głównej) celem wyeliminowania marginesu błędu   *
 ***********************************************************************************************/

for($h 1$h 730; ++$h)
{
 $tmp['url_address'] = $cfg['url_name'].$h;
 $content file_get_contents($tmp['url_address']);

 if(!empty($content))
 {
  // Wyciąganie adresów grafiki _^_
  preg_match_all('/<img.*src=\"(.*)\".*>/iU'$content$catch);

  for($i 0$tmp['how'] = count($catch[1]); $i $tmp['how']; ++$i)
  {
   $result mysql_query("SELECT address FROM graphic WHERE address = '".$catch[1][$i]."'");

   if(mysql_num_rows($result) === 0)
   {
    mysql_query("INSERT INTO graphic VALUES ('".$catch[1][$i]."')");
   }
  }
 }
}

echo 'finished step 1';
?>
download.php czyli plik odpowiedzialny za ściąganie grafiki na podstawie zaindeksowanych adresów
Kod:
<?php
#--------------------------------------------+
# Author: CapaciousCore                      |
# Website: CapaciousCore.pl                  |
#                                            |
#               Wszystkie prawa zastrzeżone! |
#--------------------------------------------+

include('./config.php');
// Pobieramy listę plików
$result mysql_query("SELECT address FROM graphic");

for($h 0$tmp['how'] = mysql_num_rows($result); $h $tmp['how']; ++$h)
{
 $row mysql_fetch_assoc($result);
 $tmp['file_name'] = explode('/'$row['address']);
 $tmp['file_location'] = $cfg['dir']['img'].end($tmp['file_name']);

 if(substr($row['address'], 07) == 'http://' && !file_exists($tmp['file_location']))
 {
  $content file_get_contents($row['address']);
  file_put_contents($tmp['file_location'], $content);
 }
}

echo 'finished step 2';
?>

Lista operacji

Pamiętajcie, że jeżeli już zaczęliście proces to skończcie go Razz
  1. ściągniecie skryptu
  2. skonfigurowanie
  3. zaimportowanie tabeli do bazy danych
  4. konfiguracja serwera
  5. przywiązanie się do krzesła
  6. odpalenie indexing.php
  7. odpalenie download.php
  8. długie czekanie
  9. cieszenie się i marnowanie czasu oglądając parę tysięcy demotywatorów, z których 5% jest czegokolwiek warta Wink

Rezultat

demotywatory.png

Nota

Gdy przeglądacie demotywatory.pl to w gruncie rzeczy zapisujecie grafikę na swoim dysku. Moje pytanie brzmi dlaczego by tego nie zrobić na masową skalę? Nie będę oglądał głupich reklam i innego chłamu. Nie będę także czytał komentarzy. Skupie się jedynie na kwintesencji. Dziękuję za uwagę i życzę miłego dnia.

PS
Kocham jak ktoś zrzyna zagraniczny pomysł przekładając go na polskie "standardy" plącąc za to małe pieniądze, a zyskując krocie.

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

CapaciousCore

Dodano 09.08.2010r. o 14:00
Dla potomnych:
Chodziło o to, że nazwy plików powtarzały się, stąd taka a nie inna ilość ściągniętej grafiki.

Ivek

Dodano 09.08.2010r. o 12:55
Nie ma najmniejszego problemu Smile
http://www.dj-ivan.info/baza.sql
Tutaj jest to co się zapisało w bazie.
Wszystko zaczęło się psuć od momentu kiedy adres z http://demotywatory.pl na http://statichg.demotywatory.pl, a przynajmniej tak mi się wydaje, bo wcześniej nie było tego problemu.

CapaciousCore

Dodano 09.08.2010r. o 12:49
@Ivek mógłbyś udostępnić bazę danych?

Ivek

Dodano 09.08.2010r. o 12:46
Znalazłem jeszcze jeden problem ze skryptem, ale teraz chodzi mi o oryginalny ripper demotów. Pobiera on max 8120 plików mimo, że w bazie jest wpisów 14 896. Co może być z tym nie tak ?

Ivek

Dodano 09.08.2010r. o 10:48
Dzięki bardzo Smile teraz już wszystko działa jak powinno Smile

CapaciousCore

Dodano 08.08.2010r. o 09:14
@Ivek poniżej zapodałem nieco zmieniony download.php. Na moje oko powinno działać.
Kod:
<?php
#--------------------------------------------+
# Author: CapaciousCore                      |
# Website: CapaciousCore.pl                  |
#                                            |
#               Wszystkie prawa zastrzeżone! |
#--------------------------------------------+

include('./config.php');
// Pobieramy listę plików
$result mysql_query("SELECT address FROM graphic");

for($h 0$tmp['how'] = mysql_num_rows($result); $h $tmp['how']; ++$h)
{
 $row mysql_fetch_assoc($result);
 $tmp['file_location'] = $cfg['dir']['img'].md5($row['address']).'.jpg';

 if(substr($row['address'], 07) == 'http://')
 {
  $content file_get_contents($row['address']);
  file_put_contents($tmp['file_location'], $content);
 }
}

echo 'finished step 2';
?>

Ivek

Dodano 06.08.2010r. o 15:33
No więc będzie problem z tym, żebym sam napisał, bo w PHP jestem zielonkawy Smile
Z innymi stronami nie ma takiego problemu, tylko właśnie z tą. Jeśli można to będę bardzo wdzięczny za informację/modyfikację Smile

CapaciousCore

Dodano 06.08.2010r. o 01:57
@Ivek myślę, że przy pobieraniu z konkretnej strony po prostu wystarczy wsiąść adres, wyjąć ID strony i wrzucić jako nazwę pliku Razz

Dasz rade sam czy napisać małą modyfikacje?

Ivek

Dodano 05.08.2010r. o 17:08
Witam.
Mam mały problem z przeróbką skrypty.
Dokładniej to potrzebuję ripper ze strony pornodemotywatory.pl. Indeksuje ładnie, ale problem jest w pliku download.php, bo w ich skrypcie wszystkie pliki mają nazwę pornodemotywatory.jpg i nie wiem jak ją zmienić, żeby wszystkie pliki miały inne nazwy np. link - http://content.pornodemotywatory.pl/w/f/wfTkeARJbA/pornodemotywator.jpg
preferowana nazwa, pod którą zapiszę się na dysku - w-f-wfTkeARJbA-pornodemotywator.jpg.
Z góry thx za pomoc.

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)