Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Skrapowanie obrazków
wiedzma92
post 12.07.2016, 17:31:47
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Witajcie! Próbuję stworzyć funkcję, która zwróci główne obrazki ze strony http://jbzd.pl. TYLKO główne obrazki, nie jakieś loga czy inne pierdoły. Niestety mój twór wywala kilka błędów. Zerknijcie, proszę, na te hieroglify i powiedzcie, co w nich nie gra.

  1. <?php
  2.  
  3. function getImages($url, $referrer)
  4. {
  5. $ch = curl_init($url);
  6.  
  7. if (curl_errno($ch))
  8. {
  9. echo 'Error ' . curl_errno($ch) . ': ' .curl_error($ch);
  10. }
  11.  
  12. curl_setopt($ch, CURLOPT_REFERER, $referrer);
  13.  
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  16.  
  17. $content = curl_exec($ch);
  18.  
  19. $doc = new DOMDocument();
  20. $doc->loadHTML($content);
  21.  
  22. $xpath = new DOMXPath($doc);
  23. $images = $xpath->query('//span[@class = "image rolled"]/img');
  24.  
  25. return $images;
  26. }
  27.  
  28. echo getImages('http://jbzd.pl', 'http://localhost/img.php');
Go to the top of the page
+Quote Post
markuz
post 12.07.2016, 17:52:19
Post #2





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


Podzielisz się z nami treścią tych błędów?


--------------------
Go to the top of the page
+Quote Post
wiedzma92
post 12.07.2016, 17:59:54
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Oczywiście, oto te straszydła:

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 35 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Unexpected end tag : script in Entity, line: 220 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Unexpected end tag : script in Entity, line: 226 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 487 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 487 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Tag video invalid in Entity, line: 554 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Tag source invalid in Entity, line: 555 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Unexpected end tag : p in Entity, line: 800 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Warning: DOMDocument::loadHTML(): Unexpected end tag : p in Entity, line: 816 in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 20

Catchable fatal error: Object of class DOMNodeList could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 28
Go to the top of the page
+Quote Post
Pyton_000
post 12.07.2016, 18:19:16
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Kod
$content = file_get_contents('http:/...');

preg_match_all('/image rolled.*?src="(.*?)"/s', $content, $match);
var_dump($match);


Ten post edytował Pyton_000 12.07.2016, 18:19:25
Go to the top of the page
+Quote Post
wiedzma92
post 13.07.2016, 19:19:39
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Poprawiłam mój kod. Chciałabym teraz, żeby powstała tablica ze wszystkimi ścieżkami oraz info, czy jest to jpg, czy gif, bo teraz pojawia się tylko wskaźnik (liczba obrazków). Podpowiedzcie, proszę, jak to zrobić. Będę wdzięczna smile.gif

  1. libxml_use_internal_errors(true);
  2.  
  3. function getImages($url, $referrer)
  4. {
  5. $ch = curl_init($url);
  6.  
  7. if (curl_errno($ch))
  8. {
  9. echo 'Error ' . curl_errno($ch) . ': ' .curl_error($ch);
  10. }
  11.  
  12. curl_setopt($ch, CURLOPT_REFERER, $referrer);
  13.  
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  16.  
  17. $content = curl_exec($ch);
  18.  
  19. $doc = new DOMDocument();
  20. $doc->loadHTML($content);
  21.  
  22. $xpath = new DOMXPath($doc);
  23. $images = $xpath->query('//div[@class="image rolled"]/a/img[@src]');
  24.  
  25. return $images;
  26.  
  27. foreach ($images as $image)
  28. {
  29. $src = $image->getAttribute('src');
  30. }
  31. }
  32.  
  33. print_r(getImages('http://jbzd.pl', 'http://localhost/img.php'));

Go to the top of the page
+Quote Post
mlawnik
post 13.07.2016, 21:00:03
Post #6





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Funkcja substr($src, -3);

Pobiera ostatnie 3 znaki atrybutu src (rozszerzenie pliku).
Możnaby też explode z kropką i wtedy ostatni ciąg.


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wiedzma92
post 13.07.2016, 21:16:38
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Cytat(mlawnik @ 13.07.2016, 22:00:03 ) *
Funkcja substr($src, -3);

Pobiera ostatnie 3 znaki atrybutu src (rozszerzenie pliku).
Możnaby też explode z kropką i wtedy ostatni ciąg.

Przepraszam, pewnie wyjdę na debilkę, ale nie za bardzo rozumiem :/
Go to the top of the page
+Quote Post
mlawnik
post 14.07.2016, 06:13:32
Post #8





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Lepiej nie rozumieć i zapytać o wyjaśnienie niż nie rozumieć i błądzić wink.gif

Funkcja substr zwraca część ciągu podanego jako argument.
Skoro masz już adres obrazka, można wyciągnąć jego rozszerzenie.
  1. <?php
  2. $src = 'http://img.jbzd.pl/2016/07/1501aae12527847eb4e7f0eabdd93b0a.jpg';
  3.  
  4. $rozszerzenie = substr($src, -3);
  5. echo $rozszerzenie;
  6. ?>


Tu uruchomione:
https://3v4l.org/fOdBM

Albo też możemy użyć funkcji explode, która dzieli ciąg w miejscu gdzie znajduje się podany znak:
  1. <?php
  2. $src = 'http://img.jbzd.pl/2016/07/1501aae12527847eb4e7f0eabdd93b0a.jpg';
  3.  
  4. $rozszerzenie = explode('.', $src);
  5. var_dump($rozszerzenie);
  6.  
  7. echo 'Rozszerzenie: ' . end($rozszerzenie);
  8.  
  9. ?>


Tu uruchomione:
https://3v4l.org/oHe33

Mam nadzieję że teraz na przykładzie wyda się to prostsze.
Jeżeli umiesz angielski to polecam szukać w google i na stackoverflow, a jak Ci się nie uda, to zapraszamy z powrotem tutaj wink.gif.


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wiedzma92
post 14.07.2016, 12:47:43
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Dziękuję za wyjaśnienie i pomoc, Przyjacielu! smile.gif Mniej więcej o coś takiego mi chodziło, chciałabym jednak, żeby wyrzuciło mi na ekran tablicę ze wszystkimi plikami z rozszerzeniem .gif i .jpg, do których prowadzi ścieżka $src, oraz info o na ich temat - że gif to gif, a jpg to jpg. Zaczęłam więc kombinować z wyrażeniami regularnymi, ale pozytywnego efektu narazie brak. Stworzyłam coś takiego, ale nie wiem czy mój tok rozumowania jest słuszny i czy ma choć trochę sensu :/

  1. libxml_use_internal_errors(true);
  2.  
  3. function getImages($url, $referrer)
  4. {
  5. $ch = curl_init($url);
  6.  
  7. if (curl_errno($ch))
  8. {
  9. echo 'Error ' . curl_errno($ch) . ': ' .curl_error($ch);
  10. }
  11.  
  12. curl_setopt($ch, CURLOPT_REFERER, $referrer);
  13.  
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  16.  
  17. $content = curl_exec($ch);
  18.  
  19. $doc = new DOMDocument();
  20. $doc->loadHTML($content);
  21.  
  22. $xpath = new DOMXPath($doc);
  23. $images = $xpath->query('//div[@class="image rolled"]/a/img[@src]');
  24.  
  25.  
  26. foreach ($images as $image)
  27. {
  28. $src = $image->getAttribute('src');
  29. }
  30.  
  31. preg_match_all('/gif/i', $src, $gif);
  32. preg_match_all('/jpg/i', $src, $jpg);
  33.  
  34. print_r($gif);
  35. print_r($jpg);
  36.  
  37. return $images;
  38.  
  39. }
  40.  
  41. print_r(getImages('http://jbzd.pl', 'http://localhost/img.php'));
Go to the top of the page
+Quote Post
trueblue
post 14.07.2016, 13:09:22
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. $images = $xpath->query('//div[@class="image rolled"]/a/img[contains(@src,".jpg") or contains(@src,".gif")]');


  1. $images = $xpath->query('//div[@class="image rolled"]/a/img[substring(@src,string-length(@src)-string-length(".gif")+1)=".gif" or substring(@src,string-length(@src)-string-length(".jpg")+1)=".jpg"]');


--------------------
Go to the top of the page
+Quote Post
wiedzma92
post 14.07.2016, 13:23:53
Post #11





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Niestety rezultat jest podobny do tego z mojego kodu. Czyli wypluwa tablicę z liczbą elementów, bez ścieżek do obrazków i bez informacji, czy to jpg, czy gif… sadsmiley02.gif
Go to the top of the page
+Quote Post
trueblue
post 14.07.2016, 13:28:25
Post #12





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Tyle, że tym zapytaniem nie zastąpisz tego o czym piszesz, ale wyciągasz tylko jpg i gif.
Po nim stosujesz foreach, który podałaś wyżej, a w nim wystarczy sprawdzić czy rozszerzenie to jpg, jeśli nie to gif (przykład podał mlawnik).


--------------------
Go to the top of the page
+Quote Post
wiedzma92
post 14.07.2016, 13:49:06
Post #13





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


No, teraz wszystko pięknie śmiga. Dzięki za pomoc i cierpliwość, Chłopaki smile.gif
Go to the top of the page
+Quote Post
mlawnik
post 14.07.2016, 17:18:48
Post #14





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Takim osobom jak ty przyjemnie się pomaga, dlatego że potrafią czytać ze zrozumieniem i wytłumaczyć o co im chodzi wink.gif


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wiedzma92
post 15.07.2016, 15:47:39
Post #15





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Miło mi to słyszeć happy.gif Raz jeszcze, z całego serduszka, dziękuję za pomoc heart.gif

Myślałam, że dalej dam sobie radę sama, ale za cienka jestem jeszcze w kodzie, by nie zadawać głupich pytań. Założyłam, że mój skrypt będzie sprawdzał, czy obrazek to .jpg czy nie, dlatego w wyrażeniu regularnym tylko .jpg uwzględniłam. Dodatkowo chciałabym, żeby mój skrypt pobrał wszystkie obrazki z 5 stron i zapisał je na dysku oraz informację, czy są jpg.

Wiem, że w poniższym kodzie jest bajzel i wszystko źle, ale uczę się dopiero i jeszcze błądzę, dlatego tak często szukam pomocy. Z góry bardzo dziękuję za rady, jak to ugryźć, żeby działało smile.gif

  1. libxml_use_internal_errors(true);
  2.  
  3. function getImages($url, $referrer)
  4. {
  5. $ch = curl_init($url);
  6.  
  7. if (curl_errno($ch))
  8. {
  9. echo 'Error ' . curl_errno($ch) . ': ' .curl_error($ch);
  10. }
  11.  
  12. curl_setopt($ch, CURLOPT_REFERER, $referrer);
  13.  
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  16.  
  17. $content = curl_exec($ch);
  18.  
  19. $doc = new DOMDocument();
  20. $doc->loadHTML($content);
  21.  
  22. $xpath = new DOMXPath($doc);
  23. $images = $xpath->query('//div[@class="image rolled"]/a/img[@src]');
  24.  
  25. foreach ($images as $image)
  26. {
  27. $src = $image->getAttribute('src');
  28.  
  29. preg_match('/.jpg$/', $src, $ext);
  30. $imagesInfo = ['src' => $src, 'ext' => $ext];
  31.  
  32.  
  33. print_r($imagesInfo);
  34. file_get_contents($src, set_include_path('/usr/downloads'));
  35. }
  36.  
  37. return $images;
  38. }
  39.  
  40. print_r(getImages('http://jbzd.pl', 'http://localhost/img.php'));


EDIT:

Już chyba wszystko ogarnęłam, poza jednym. Za nic nie potrafię stworzyć pętli, która będzie powtarzać wyżej wymienione operacje między stroną główną a piątą podstroną. Nie mam pojęcia, jak inkrementować adres… :/

Ten post edytował wiedzma92 15.07.2016, 15:48:45
Go to the top of the page
+Quote Post
markuz
post 15.07.2016, 16:27:46
Post #16





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


  1. $pages = 5;
  2. for($p = 0; $p < $pages; $p++)
  3. print_r(getImages('http://jbzd.pl' . ($p > 0 ? '/strona/' . ($p + 1) : ''), 'http://jbzd.pl'));


--------------------
Go to the top of the page
+Quote Post
wiedzma92
post 16.07.2016, 12:58:02
Post #17





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Niestety ten sposób nie działa, wywala mi milion warningów tego typu: Warning: DOMDocument::loadHTML(): Empty string supplied as input in /Applications/XAMPP/xamppfiles/htdocs/img.php on line 22

Zaraz pokręci mnie przy tym skrypcie. Powiedzcie, mi proszę, co w tym fragmencie kodu nie gra, że obrazki nie chcą pobrać się na dysk, tylko to cholerstwo mi wyskakuje: „Warning: file_put_contents(/Users/agnieszka/Downloads/): failed to open stream: Is a directory in /Applications/XAMPP/xamppfiles/htdocs/img.php”.

Wrzucam tylko foreach, bo reszta kodu jest bez zmian smile.gif

  1. foreach ($images as $image)
  2. {
  3. $src = $image->getAttribute('src');
  4. preg_match('/.gif$/', $src, $ext);
  5. $imagesInfo = ['src' => $src, 'ext' => $ext];
  6.  
  7. $con = file_get_contents('http://jbzd.pl/obr/');
  8. file_put_contents('/Users/agnieszka/Downloads/', $con);
  9.  
  10. print_r($imagesInfo);
  11. }


Ten post edytował wiedzma92 16.07.2016, 12:59:24
Go to the top of the page
+Quote Post
markuz
post 16.07.2016, 13:22:43
Post #18





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


W funkcji file_get_contents musisz podać url obrazka tj. $src a nie 'http://jbzd.pl/obr/'.
W file_put_contents podajesz pełną ścieżkę wraz z nazwą pliku, albo samą nazwe pliku żeby zapisać do tego samego folderu gdzie jest skrypt.


--------------------
Go to the top of the page
+Quote Post
wiedzma92
post 16.07.2016, 13:33:11
Post #19





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 17.03.2016

Ostrzeżenie: (0%)
-----


Pozmieniałam to, oczym wspomniałeś. Teraz pojawia się inny komunikat: „Warning: file_put_contents(/Applications/XAMPP/xamppfiles/htdocs/img.php): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/img.php”.

Skrypt wygląda teraz tak:

  1. foreach ($images as $image)
  2. {
  3. $src = $image->getAttribute('src');
  4. preg_match('/.gif$/', $src, $ext);
  5. $imagesInfo = ['src' => $src, 'ext' => $ext];
  6.  
  7. $con = file_get_contents($src);
  8. file_put_contents('/Applications/XAMPP/xamppfiles/htdocs/scrap_img.php', $con);
  9.  
  10. print_r($imagesInfo);
  11. }
Go to the top of the page
+Quote Post
markuz
post 16.07.2016, 13:49:35
Post #20





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


Ok. A więc jeszcze raz, file_put_contents zapisuje do pliku podanego w 1 argumencie, zawartość która jest w 2 argumencie. W 2 argumencie tj. $con masz zawartość obrazka i chcesz go zapisać do skryptu PHP o nazwie scrap_img.php? Raczej nie.

Utwórz sobie katalog o nazwie images zaraz obok pliku scrap_img.php a następnie zmień argument tej funkcji na:
  1. file_put_contents(dirname(__FILE__) . 'images/' . uniqid() . '.' . $ext, $con);


Co oznacza:
dirname(__FILE__) - ścieżka do tego pliku, u Ciebie będzie to "(.....)/XAMPP/xamppfiles/htdocs/"
images/ - nowo utworzony katalog images do którego chcesz zapisać te obrazki
uniqid() - losowa nazwa obrazka, unikalna
$ext - rozszerzenie obrazka

Ten post edytował markuz 16.07.2016, 13:51:52


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 06:57