LINUX.ORG.RU

php и фильтр изображений по размеру

 


0

1

Возможно ли отфильтровать закачиваемые файлы (как вариант, не грузить файлы, чей размер меньше опр. значения)?
как пример

<?php
foreach (range(110001, 110005) as $topic) {

$doc = new DOMDocument;
$doc->loadHtml(file_get_contents("http://somesite.org/forum/viewtopic.php?t=$topic"));
$vars = $doc->getElementsByTagName("var");
$n = 0;
for ($i = 0; $i < $vars->length; $i++) {
    $var = $vars->item($i);
    $class = $var->attributes->getNamedItem('class')->textContent;
    if (strpos($class, 'postImg') !== false) {
        $img = $var->attributes->getNamedItem('title')->textContent;
        $ext = pathinfo($img, PATHINFO_EXTENSION);
        file_put_contents("{$topic}_{$n}.{$ext}", file_get_contents($img));
        $n++;
    }
}
}

В примере выдергиваются все картинки, находящиеся в теге var. Как их еще отфильтровать по размеру? Скажем, что бы качались только картинки, чей размер не менее 800x600 px.
И еще вопрос. В языках не силен, но интересно. Если картинка )другой файл) не встроена в сайт, а есть лишь линк на внешний сайт, то как тогда ее подцепить? getElementsByTagName(«a») как-то вообще не работает, хотя url есть линк на страницу с картинкой. Вернее понятно, что он не отработает, но как привязать внешнюю страницу к такой конструкции, если url такой внешней страницы указывается в стартовой страничке, которая меняется при цикле. Что бы уже на внешней страничке устроить подобные действия и оттуда стащить изображение (оно там может быть на fastpic etc)

★★★

Последнее исправление: ESTAF (всего исправлений: 1)

Ну, как пример

<a target="_blank" href="http://fastpic.ru/view/3/2009/1023/bb143331ad9684fb215daa3493dc1970.jpg.html" class="postLink">
<var class="postImg" title="http://i3.fastpic.ru/thumb/2009/1023/70/bb143331ad9684fb215daa3493dc1970.jpeg"><img style="" title="" src="http://i3.fastpic.ru/thumb/2009/1023/70/bb143331ad9684fb215daa3493dc1970.jpeg" class="postImg" alt="pic"></var></a>

Есть var, а есть «a href...»
Никак не пойму, как указать именно уровень на один выше, чем var. Захватить его, пройтись по нему на внешнюю ссылку и оттуда скачать изображение. Об этом.

ESTAF ★★★
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux
<a href=http://external.url.gde.original.html><var>http://a.moi.skript.zaberet.lish.eto.izobrazhenie</var></a>


На http://external.url.gde.original.html как бы есть big_original.jpg. Ну, есть всякие ресурсы, где выкладываются не оригинальные изображения, а лишь ссылка на сайты, где лежат эти оригиналы. Не прямые линки. fastpic, radical photo итц. Ну и понять хочется, как научить скриптик смотреть на уровень, что на одну ступень выше тега var. Не указывать же тег «a». их может быть тонна. А var лишь рядом с изображениями - миниатюрками.

ESTAF ★★★
() автор топика
Ответ на: комментарий от ESTAF

Слушай, там масса условий, давай больше инфы, откуда забирать, что там уникальное есть итп. Можно например по див блоку забирать нужную информацию.

$LOR = file_get_contents('https://www.linux.org.ru/forum/development/12409776');
if (preg_match_all('|<pre class="no-highlight">(.+)</pre>|isU', $LOR, $arr)) { 
  echo $arr[0][2];
}

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 1)
Ответ на: комментарий от VictimOfLoveToLinux

С сайзом разобрался

<?php
ini_set('memory_limit', '-1');
foreach (range(3561, 3562) as $topic) {

$doc = new DOMDocument;
$doc->loadHtml(file_get_contents("http://someurl.org/forum/viewtopic.php?t=$topic"));
$vars = $doc->getElementsByTagName("var");
$n = 0;
for ($i = 0; $i < $vars->length; $i++) {
    $var = $vars->item($i);
    $class = $var->attributes->getNamedItem('class')->textContent;
    if (strpos($class, 'postImg') !== false) {
        $img = $var->attributes->getNamedItem('title')->textContent;
        $ext = pathinfo($img, PATHINFO_EXTENSION);
                //как-то так
		$size = getimagesize($img);
		if($size[0]>=1000&&$size[1]>=600){
        file_put_contents("{$topic}_{$n}.{$ext}", file_get_contents($img));
        $n++;
    }
}}}

2 VictimOfLoveToLinux Как вариант, есть такая страница:
http://rutracker.org/forum/viewtopic.php?t=2129884
На ней, в посте раздачи есть спойлера со скриншотами-миниатюрками. Не прибегая к клику по миниатюрке, что бы открылся фастпик, нужно утянуть оригинальные изображения с фастпика. Есть набор регекспов у imagus аддона к ff для таких делов, но блин глупо тупо - не получается распаковать xpi. Найду, чем - продолжу тему что ли. а то вообще мегачайниковопросы пошли с моей стороны.

ESTAF ★★★
() автор топика
Последнее исправление: ESTAF (всего исправлений: 2)
Ответ на: комментарий от ESTAF

Тебе нужен механизм чего?

Разобрать картинку на примере рутрекера можно вот так например:

$rutraker_img = '<img src="http://i3.fastpic.ru/thumb/2009/1023/46/46d4073bcba042808e5c491906659446.jpeg" class="postImg" alt="pic">';
$dom = new DOMDocument();
$dom->loadHTML($rutraker_img);
$imgs = $dom->getElementsByTagName('img');
$PRE_RUTRAKER = [];
foreach($imgs as $img) {
      if($img->attributes->getNamedItem('class') && $img->attributes->getNamedItem('class')->nodeValue = 'postImg') {
         $PRE_RUTRAKER[] = $img->attributes->getNamedItem('src')->nodeValue;
         print_r($PRE_RUTRAKER);
     }
}

Картинка у них уже загружена в блок sp-body который сразу есть в коде и в нём же ссылка на картинку с фаспика. Просто при клике div элемент получает display: block;.

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 2)
Ответ на: комментарий от ESTAF

треднечитайсразуотвечай

нужно утянуть оригинальные изображения с фастпика.

Этого я не прочитал, тогда тебе надо разобрать

На рутрекере:

«sp-body»

из него забрать

href из «postLink»

потом разобрать href

Это уже на фастпике:

в нём найти

«picContainer»

забрав src из img с id «image»

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 1)
Ответ на: комментарий от VictimOfLoveToLinux

мда. не пример с мой стороны был. бывает, что прямой ссылки нет. лишь url.html. Пока не откроешь fastpic. не вычислишь урл самого изображения. как здесь

<div style="display: block;" class="sp-body clearfix inited">
        <a target="_blank" href="http://fastpic.ru/view/59/2014/0209/e9b74d7d0b64c9c409a7e1274b08da88.png.html" class="postLink"><var class="postImg" title=""><img style="" title="" src="http://i57.fastpic.ru/thumb/2014/0209/d3/d044c5b8746c48ee894619534ada60d3.jpeg" class="postImg" alt="pic"></var></a><a target="_blank" href="http://fastpic.ru/view/57/2014/0209/d044c5b8746c48ee894619534ada60d3.png.html" class="postLink"><var class="postImg" title="http://i59.fastpic.ru/thumb/2014/0209/88/e9b74d7d0b64c9c409a7e1274b08da88.jpeg"><img style="" title="" src="http://i59.fastpic.ru/thumb/2014/0209/88/e9b74d7d0b64c9c409a7e1274b08da88.jpeg" class="postImg" alt="pic"></var></a><a target="_blank" href="http://fastpic.ru/view/33/2014/0209/e252caa01f409ecedde5f4f0303495fe.png.html" class="postLink"><var class="postImg" title="http://i33.fastpic.ru/thumb/2014/0209/fe/e252caa01f409ecedde5f4f0303495fe.jpeg"><img src="http://i33.fastpic.ru/thumb/2014/0209/fe/e252caa01f409ecedde5f4f0303495fe.jpeg" class="postImg" alt="pic"></var></a>

        <div class="sp-fold clickable">
            [свернуть]
        </div>
    </div>

http://rutracker.org/forum/viewtopic.php?t=4664700

про ловлю класса хорошо. если этот класс не повторяется еще где, кроме блока с изображениями и юрл на них.

ESTAF ★★★
() автор топика
Последнее исправление: ESTAF (всего исправлений: 2)
Ответ на: комментарий от ESTAF

Мое сообщение выше описывает как разобрать твой пример.

Мб напишу сейчас пример на основе моего предложения #comment-12410096.

VictimOfLoveToLinux
()
Ответ на: комментарий от ESTAF

если этот класс не повторяется еще где

Дык они вложены в sp-head folded, я от этого и пляшу что мы этот блок разбираем.

Работай только на уровне sp-head folded, зачем тебе всю страницу разбирать.

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 1)
Ответ на: комментарий от ESTAF

А вот тебе и фастпик и рутрекер одновременно:

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
?>

<?php


$rutraker_block = '
<div style="display: block;" class="sp-body clearfix inited">
        <a target="_blank" href="http://fastpic.ru/view/59/2014/0209/e9b74d7d0b64c9c409a7e1274b08da88.png.html" class="postLink"><var class="postImg" title=""><img style="" title="" src="http://i57.fastpic.ru/thumb/2014/0209/d3/d044c5b8746c48ee894619534ada60d3.jpeg" class="postImg" alt="pic"></var></a><a target="_blank" href="http://fastpic.ru/view/57/2014/0209/d044c5b8746c48ee894619534ada60d3.png.html" class="postLink"><var class="postImg" title="http://i59.fastpic.ru/thumb/2014/0209/88/e9b74d7d0b64c9c409a7e1274b08da88.jpeg"><img style="" title="" src="http://i59.fastpic.ru/thumb/2014/0209/88/e9b74d7d0b64c9c409a7e1274b08da88.jpeg" class="postImg" alt="pic"></var></a><a target="_blank" href="http://fastpic.ru/view/33/2014/0209/e252caa01f409ecedde5f4f0303495fe.png.html" class="postLink"><var class="postImg" title="http://i33.fastpic.ru/thumb/2014/0209/fe/e252caa01f409ecedde5f4f0303495fe.jpeg"><img src="http://i33.fastpic.ru/thumb/2014/0209/fe/e252caa01f409ecedde5f4f0303495fe.jpeg" class="postImg" alt="pic"></var></a>

        <div class="sp-fold clickable">
            [свернуть]
        </div>
    </div>
';
$dom = new DOMDocument();
$dom->loadHTML($rutraker_block);
$urls = $dom->getElementsByTagName('a');
$URL_FROM_RUTRAKER = [];
         echo "<br>Рутрекер:<br>"; 
foreach($urls as $url) {
      if($url->attributes->getNamedItem('class') && $url->attributes->getNamedItem('class')->nodeValue = 'postLink') {
         $URL_FROM_RUTRAKER[] = $url->attributes->getNamedItem('href')->nodeValue;

         print_r($URL_FROM_RUTRAKER);
     }
}


echo "<br>";  
$fastpic_block = '
<div id="picContainer" style="text-align: center; width: 620px; float: left; background-color: #2B2B2B; text-align: center; padding-top: 10px; padding-bottom: 10px; min-height: 300px;" class="rounded-corners">
        <a href="http://i57.fastpic.ru/big/2014/0209/d3/d044c5b8746c48ee894619534ada60d3.png" title="Нажмите для увеличения изображения"><img src="http://i57.fastpic.ru/big/2014/0209/d3/d044c5b8746c48ee894619534ada60d3.png" border="0" id="image" style="max-width: 600px;"></a>
        <div style="margin: 10px;">
            <a href="" class="jslink_orange" id="show-code">[ показать коды изображения ]</a>
            <a href="mailto:info@fastpic.ru?subject=Abuse report&body=Здравствуйте, хочу пожаловаться на изображение http://fastpic.ru/view/57/2014/0209/d044c5b8746c48ee894619534ada60d3.png.html" class="jslink_orange" id="abuse">[ пожаловаться на изображение ]</a>
        </div>
        
        
        
        
    </div>
    
';
$dom = new DOMDocument();
$dom->loadHTML($fastpic_block);
$urls = $dom->getElementsByTagName('a');
$URL_FROM_FASTPIC = [];
foreach($urls as $url) {
      if($url->attributes->getNamedItem('title') && $url->attributes->getNamedItem('title')->nodeValue = 'Нажмите для увеличения изображения') {
         $URL_FROM_FASTPIC[] = $url->attributes->getNamedItem('href')->nodeValue;
         echo "<br>А это пример с фастпика:<br>";
         print_r($URL_FROM_FASTPIC);
     }
}


?>

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

я не могу указывать руками fastpic блок. оп том и речь. скрипт сам должен, исходя из первого подхода, лезть по каждому линку на фастпик. эдак бы я всеми правдами и не правдами изучил фастпик, посмотрел на линки исходного урл на рутрекере и забил их туда руками. представьте, что урл есть не стаический линк, а что-нибудь в духе

foreach (range(1700001, 1800000) as $topic);
... 
$dom->loadHtml(file_get_contents("http://rutracker.org/forum/viewtopic.php?t=$topic"));

конечно, не так экстремально с диапазоном, но как пример, когда нужно пройтись по тысяче страниц. +это может быть не обязательно фастпик. ну тут всякие if, else etc да. на подход под каждый имж хостинг. но вот с ручным указанием фастпика,, - это как можно просто два скрипта создать.
механизм передачи эстафеты. до общего действия file_put_contents(«{$topic}_{$n}.{$ext}», file_get_contents($img));
наверное, как-то сначала собрать линки.jpg, что не кончаются на html. затем по url.html собрать страницы как бы в одну. обдолбить их getElementsByTagName функцией и иже с нею, а уже потом file_put_contents(«{$topic}_{$n}.{$ext}», file_get_contents($img)). ну для теста echo. посмотреть на приготовленные линки. статически грепить url, указывая блоки/скопипастенные полные url - нет. только в первом случае, если. когда скрипт заходит на базовую страницу, если только в этом случае.

ESTAF ★★★
() автор топика
Ответ на: комментарий от ESTAF

блин. кто-то говорил, большой кусок можно усмотреть в imagus. логику. ищу - там одни мордоустановщики.

ESTAF ★★★
() автор топика
Последнее исправление: ESTAF (всего исправлений: 1)
Ответ на: комментарий от ESTAF

Это похоже на дай мне то не знаю что.

Как же собрать пикчи не указывая что это за пикчи и в каких контейнерах они живут или хотя бы на каком хостинге лежат.

Я бы делал как показал выше только сделал бы из своего кода функции где мог бы указывать урл который надо обработать, название блока в котором лежит картинка, и блок на хостинге с хайсайз картинкой.

И так на каждый нужный сайт, всего 3-5 параметров на функцию на каждый сайт.

Всё равно же урл указывается в исходом ТЗ, понимаю если бы была полная автоматизация и нужен был бы паук который собирал бы сам эти пикчи по всему интернету.

VictimOfLoveToLinux
()
Ответ на: комментарий от ESTAF

Суть вопроса в том как автоматизировать мой пример скармливая ему ссылку вместо блока что-ли?

Если проблема в этом то я завтра напишу функцию на основе ссылки.

Но при этом ключ в виде класса или id див блока всё равно будет необходим.

VictimOfLoveToLinux
()

Как их еще отфильтровать по размеру? Скажем, что бы качались только картинки, чей размер не менее 800x600 px

Никак, тебе всё равно нужно сначала скачать файл, чтобы потом определять размер картинки.

$size = getimagesize($img);

Тут у тебя неявно скачивается картинка, а потом определяется её размер. А потом ты скачиваешь её ещё раз. Не надо так, просто скачай её заранее, если размер не подходит, не используй её.

Есть вариант более быстрый - нужно скачать только начало файла картинки, т.к. там содержится информация о размере, и, если размер подходит, то докачать остаток. Но для этого нужен fread, а лучше curl.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от VictimOfLoveToLinux

Суть вопроса в том как автоматизировать мой пример скармливая ему ссылку вместо блока что-ли?

Ну да. Скрипт ловит url.html, что рядом с var тегами (только те, что рядом/выше на иерархию), и эти url.html (они уже с fastpic в том случае) снова обрабатываются функцией file_get_contents и getElementsByTagName, пока на хвосте у них не отобразится уже .jpg. Своего рода, скрипт внутри того скрипта (для каждого такого найденного url, что выше тега var, что в шапке этого топика. Вопрос в том, как правильно это все разместить.

ESTAF ★★★
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux

Нет конечно. На движках в духе рутрекера и ему подобным да. На других иначе. Но они и не нужны. Просто на фастпиках и ему подобным существует такой момент, как «срок хранения» изображений. Если к ним не идет обращение в течении опр. времени. Ну и идея, серфить их таким ботом. Только те, что привязаны к рутрекеру. Нумеровать, что бы знать, на каких топиках рутрекера уже ссылки померли. Ну, генерилку скринлистов потом сделаю. На imagemagick очень красиво все можно сделать.

ESTAF ★★★
() автор топика
Ответ на: комментарий от VictimOfLoveToLinux

Так, а по другому-то как решить вопрос? wget, httrack, они не переименуют файлы так. Да и потом как ими определить размеры изображений (не файлов). Если через конвейер уже другой программы, то не проще ли вернуться к способу с php.

ESTAF ★★★
() автор топика
Ответ на: комментарий от drull

Ойойой. Не нужно такое советовать.

Вы правы, кэп. Я должен был прежде, чем задать тему, добротно знать язык php и фактически :) уже знать решение. То есть, приходит такой пользователь на форум, где могут помочь и говорит: «Люди. Я один фик знаю, как мне решить свою проблему» и выкладывает тонну скриптов. Дает определения и пишет комменты к ним. А ему в ответ: «да! все верно чел - ты все знаешь. молодец!!! штамп на лоб тебе!!!». А он их и спрашивает: «а не подскажете, как сделать скрипт по закачке вот того ресурса?». Ему, «да не вопрос».

ESTAF ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.