Jump to content

slo_nik

User
  • Posts

    142
  • Joined

  • Last visited

Everything posted by slo_nik

  1. Добрый день. Возникла необходимость написать парсер сайтов, универсальный. Задача в следующем. Пользователь вводит адрес сайта в поле формы, через cURL получают содержимое сайта, выделить из выдачи только текст(из div, p, table, span и т.д.). Но вот вопрос. Каждый сайт, это индивидуальная структура. Как в этом случае, настроив парсер только раз, получать данные с любого сайта, не меняя настройки парсера под каждый сайт? Возможно ли это? Сейчас использую php, cUrl, htmlpurifier для получения текста с сайта. Попытался решить таким образом: <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'); $dirty_html = curl_exec($ch); $response = (object)curl_getinfo($ch); if(stripos($response->content_type, 'windows-1251')){; $dirty_html = mb_convert_encoding($dirty_html, 'utf-8', 'cp1251'); } curl_close($ch); $prf = new HTMLPurifier(); $clean_html = $prf->process($dirty_html,[ 'AutoFormat.AutoParagraph' => true, 'AutoFormat.RemoveEmpty' => true, 'AutoFormat.RemoveEmpty.RemoveNbsp' => true, 'HTML.AllowedElements' => ['p','a','br','table','tbody','tr','th','td','h1','span','big'], 'HTML.ForbiddenAttributes' => [ 'a@href', 'a@style', 'a@rel', 'a@class', 'a@title', 'p@class', 'p@style', 'table@style', 'table@border', 'table@width', 'td@class', 'th@class', 'td@valign', 'td@style', 'td@width', 'td@colspan', 'td@align', 'td@rowspan', 'span@class' ] ]); $search = ['<p>','</p>','&amp;','<a>','</a>','<table>','<tbody>','</tbody>','</table>','<tr>','</tr>','<th>','</th>','<td>','</td>','<h1>','</h1>','<span>','</span>','<big>','</big>']; $replace = ['',"\r\n",'','',"\r\n",'','','','','',"\r\n",'',' ','','','',"\r\n",'',' ','',' ']; $clean_html = preg_replace("#(?:<p>\s+</p>)#", '', $clean_html); $clean_html = str_replace(["\r","\n","\r\n","\t",' '], '', $clean_html); $clean_html = str_replace($search, $replace, $clean_html); $clean_html = preg_replace("#(?:\r\n?|\n){2,}#", "\r\n", $clean_html); $clean_html = str_replace(['<br>', '<br />'], " ", $clean_html); $clean_html = preg_replace("#(?:\"\'\+;)+#", '', $clean_html); echo $clean_html; ?> Или я слишком намудрил? Некоторые сайты парсит нормально, на некоторых сливаются некоторые слова/фразы, на некоторых вообще часть сайта не парсится. Результат надо записать в отдельный текстовый файл и в бд. Можно ли найти "золотую середину" которая будет нормально работать с любым сайтом, не меняя настроек скрипта? Единственная настройка, которая должна меняться это адрес сайта.
  2. Благодарю. Мне надо чтобы не считалось, если вводятся латинские символы. Сам я придумал такое решение, может не так красиво как у Вас, но... https://jsfiddle.net/slo_nik/xx7dfax0/8/
  3. Доброй ночи. Есть текстовая область в которой надо подсчитать символы. Но подсчёт нужно начинать тогда, когда не вводится адрес сайта. Например, если пользователь вводит http://site.com/index/post, то подсчёт не должен вестись, но если после адреса есть хотя бы один пробел и текст, то начинать считать символы с учётом введённого адреса. Я попытался решить задачу таким образом https://jsfiddle.net/slo_nik/xx7dfax0/5/ Но есть одна проблема. Если пользователь решил удалить/стереть текст и начал вводить заново адрес сайта, то функция сразу же начинает считать с первого символа. Если обновить страницу, то функция опять работает как надо, то есть не ведёт подсчёт символов, если вводится адрес сайта. Подскажите, пожалуйста, как решить данную проблему?
  4. Добрый вечер. Прошло достаточно времени, но чтобы не создавать новую тему продолжу здесь. Поискал немного информации, посмотрел другие сайты, почитал документацию. Дело немного сдвинулось. Получилось сделать для fb и vk шаринг разных изображений с одной страницы, через get параметр передаю путь к изображению, url к изображению формируется динамически, в зависимости от того, какая картинка выбрана. // для fb <a target="_blank" title="Опубликовать в Facebook" id="fb" href="https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(murl) + '&picture=' + url + '"></a> // для vk '<a target="_blank" title="Опубликовать в ВК" id="vk" href="http://vk.com/share.php?url=' + encodeURIComponent(murl) + '&image=' + url + '"></a> вот рабочий пример Но надо сделать для twitter и для google+. Для этих сетей не получается подставить динамическое изображение. Нашёл пример в сети, на этом сайте как раз то, что мне нужно. С одной и той же страницы можно расшарить разные изображения для twitter и google+. Самостоятельно я не смог разобраться, как там всё работает. Если кто-то может помочь, пожалуйста, подскажите, как это работает? Заранее благодарю.
  5. Получается, что в заголовках может и не быть информации об изменении файла?
  6. Добрый день. Нужно определить дату последней модификации файла на удалённом сервере. Если использовать cUrl, то есть константа CURLINFO_FILETIME, но насколько это будет эффективно если страница сайта динамическая, данные берутся из БД? Смысл в том, чтобы не привязываясь к данным на странице просто определить, изменялась страница за последнее время или нет.
  7. Изображений много, тег один, это понятно... А если при помощи js менять значение meta тега, чтобы разные люди, каждый кликнув по своей, выбранной картинке, расшаривали именно её? Не только для разных сетей, а и для одной и той же, но разные картинки, дать возможность расшарить несколько изображений одним и тем же посетителем сайта для выбранной соц. сети. Вот это главное, что надо сделать. Возможно ли такое реализовать или нет? Или только одно изображение с сайта?
  8. Получается, что нет возможности при помощи кнопки "поделиться" для какой-либо сети шарить разные изображения? P.S. Ваша ссылка не помогла((( Требует авторизации, а не зарегистрирован в facebook)))
  9. Добрый вечер. На сайте требуется разместить блок социальных кнопок, самые популярные сети(facebook, google+, twitter, pinterest). Перепробовал несколько готовых решений, от "Яндекс"(https://tech.yandex.ru/share/), "Pluso"(https://share.pluso.ru/) и парочки готовых плагинов для framework yii. Но меня не устроила работа данных решений. Нет возможности менять изображение, которое крепится к посту в соц. сети. Прочитал в нете, что соц. сеть кэширует изображение и данные о сайте и нет возможности изменить эту информацию. Можно изменить только в том случае, если разные страницы(разные адреса) одного и того же сайта расшариваются в соц. сети. Мне надо установить share кнопки на одной странице, где расположен слайдер с изображениями и сделать возможным расшаривать отдельно взятое изображение. В конкретном случае, для "Pluso" сделал: 1) Прописал meta теги. 2) Разместил js код на странице Выглядит это так: HTML <meta property="og:title" content="Название сайта" /> <meta property="og:description" content="Описание, лучший художник на свете!!!" /> <meta property="og:url" content="http://address_site/photoyii" /> <meta property="og:image" content="http://address_site/photoyii/image/download/75" /> <meta name="title" content="Название сайта" /> <meta name="description" content="Описание, лучший художник на свете!!!" /> <link rel="image_src" href="http://address_site/photoyii/image/download/75" />JS <script type="text/javascript">(function() { if (window.pluso)if (typeof window.pluso.start == "function") return; if (window.ifpluso==undefined) { window.ifpluso = 1; var d = document, s = d.createElement('script'), g = 'getElementsByTagName'; s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true; s.src = ('https:' == window.location.protocol ? 'https' : 'http') + '://share.pluso.ru/pluso-like.js'; var h=d[g]('body')[0]; h.appendChild(s); }})();</script><div class="pluso" data-background="#ebebeb" data-options="medium,round,line,horizontal,nocounter,theme=04" data-services="facebook,pinterest,google,twitter"></div>В независимости от того, руками или при помощи jquery, менял значение атрибутов для <meta property="og:image"> и <link rel="image_src">, изображение оставалось одним и тем же. Как можно обойти эту проблему? Что бы находясь на одной и той же странице можно было "делиться" изображением в соц. сетях.
  10. Попробуйте посмотреть здесь , живой пример... Я понимаю, что проблема связана с привязкой fotorama + stackblur, для этого сделал setInterval(), не хотел скрипт без этого работать. Сейчас работает всё, fotorama + stackblur, но ошибка раздражает, хотелось бы её убрать...
  11. Так в том-то и дело, что тестил я в firefox и на localhost(Apache/2.4.7). Имена файлов хранятся в БД, сначала формируется строка с изображениями для слайдера, потом применяется stackblur. Формирую строку: $allImg = ''; foreach($images as $val) : if($val->itemId != 0) : $allImg .= "{img : '" . Url::to(['/images/default/download/', 'id' => $val->id]) . "', caption: '" . $val->title . ", " . $val->description . ", " . $val->year . " год.'},"; endif; endforeach;$script = <<<JS var fotoDiv = $('.fotorama').fotorama({ width: '100%', height: '75%', data: [ $allImg ] })JS;Скрипт stackblur расположен в самом низу документа. Наверное проблема в том, что скрипт stacklur расположен перед(!) скриптом fotorama... Поменяю местами и проверю работу, может ошибка уйдёт. Сразу не обратил на это внимание. P.S Проверил, проблема осталась(((
  12. Добрый вечер. Помогите решить проблему. Есть слайдер с картинками, фоном блока, где размещён слайдер, является текущая картинка. При загрузке страницы выводится ошибка: TypeError: Argument 1 of CanvasRenderingContext2D.drawImage could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageBitmap.ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height);Изначально код был таким: <div id="wrap"> <img src="2.jpg" alt="" id="img"> </div> <div id="canvasInner"> <canvas id="canvas"></canvas> </div> <script> var canvas = document.getElementById('canvas') var ccimg = canvas.getContext('2d') var img = document.getElementById('img') img.onload = function(){ ccimg.drawImage(img, 0, 0, canvas.width, canvas.height) StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 10) } </script>Я его немного переделал. setInterval(function(){ $('.fotorama__stage__shaft') .find('.fotorama__active:first') .find('.fotorama__img') .attr('id', 'imgCanvas') /* добавляем первому изображению атрибут id */ var canvas = $('#canvas').get(0) var ccimg = canvas.getContext('2d') var Img = $('#imgCanvas').get(0) ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height); StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8); }, 150)Вот этот участок кода: var Img = $('#imgCanvas').get(0)ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height);StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8);сделал так: var Img = $('#imgCanvas').get(0)Img.onload = function(){ ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height); StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8);}и получил ошибку в firebug "TypeError: Img is undefined", a без "Img.onload = ...." получаю ошибку, которую указал выше "TypeError: Argument 1 of CanvasRenderingContext2D". Подскажите, пожалуйста, как избавиться от ошибки?
  13. Не сомневаюсь, чем больше строк кода, тем больше понимаешь)))
  14. Ну в данном случае это для наглядности. $ перед именем переменной символизирует, что в ней хранится объект jQuery. А в другой переменной, которая без доллара и с которой, в итоге, и нужно работать — объект АПИ, полученный из объекта jQuery Вот постоянно в этом путаюсь))) Благодарю за ответ, буду вникать в написанное Вами.
  15. Нет, этой строки вообще не должно было быть. Вы тут второй раз пытаетесь инициализировать фотораму, а нужно было сначала инициализировать её один раз, потом из уже инициализированной фоторамы получить объект АПИ через .data, и вот с ним уже манипуляции производить. http://fotorama.io/customize/api/— в самом начале статьи пример кода, с помощью которого можно получить доступ к АПИ. Тогда мне не понятна разница между var fotorama = fotoramaDiv.data('fotorama') - var $fotorama = fotoramaDiv.data('fotorama') и var fotoramaDiv = $('.bill').fotorama() - var $fotoramaDiv = $('.bill').fotorama() Что именно даёт "$" перед fotoranaDiv? Работает с ним и без него...
  16. Благодарю, всё заработало. Получается, что изначально была ошибка в этой строке? Не в том месте?
  17. Благодарю за подсказку, буду разбираться. Только мне надо, чтобы было не по одной ссылке, а целый список. Надо вывести в строку список годов (1999, 2000, 2001...) и кликая по определённому году получать нужный слайд. Надеюсь, что смогу разобраться сам используя Вашу подсказку. Ну там ещё проще тогда, если годы по порядку совпадают со слайдами — просто по клику получать индекс этого года и подставлять его параметром в fotorama.show(): http://jsfiddle.net/hypnocolor/wayuyL28/4/. Благодарю ещё раз за развёрнутые ответы.
  18. Доброе утро. Пытаюсь разобраться с API Fotorama. Задача следующая. Есть исходные изображения, которые подгружаются в слайдер при первой загрузке страницы. Надо при изменении выпадающего списка менять сами изображения в слайдере. В документации написано, что это можно сделать при помощи метода load(), но при этом надо соблюсти закономерности, которые применялись при изначальной загрузки изображений data(). Попробовал сделать так: $(function(){/* загрузка изображений при первом заходе на страницу*/ $('.fotorama').fotorama({ data: [ {img: 'images/7.jpg', thumb: 'images/7.jpg'}, {img: 'images/8.jpg', thumb: 'images/8.jpg'}, {img: 'images/9.jpg', thumb: 'images/9.jpg'}, {img: 'images/10.jpg', thumb: 'images/10.jpg'}, ] })/* замена предыдущих изображений, #field - это выпадающий список */ $('#field').on('change',function(){ var fotoDiv = $('.fotorama').fotorama() fotoDiv.load([ {img: 'images/1.jpg', thumb: 'images/1.jpg'}, {img: 'images/2.jpg', thumb: 'images/2.jpg'}, {img: 'images/3.jpg', thumb: 'images/3.jpg'}, {img: 'images/4.jpg', thumb: 'images/4.jpg'}, ]) }) })Но так ничего не работает, изображения не меняются, ошибок консоль никаких не показывает. В чём моя ошибка? Или я не так понял, что написано в документации?
  19. Доброй ночи. Редко захожу на этот сайт, поэтому сразу не ответил. Если вопрос ещё актуальный, то вот ссылка на страницу с рабочим счётчиком. Смотрите через исходный код страницы. http://test.roganov.info/jbclock/
  20. Благодарю за подсказку, буду разбираться. Только мне надо, чтобы было не по одной ссылке, а целый список. Надо вывести в строку список годов (1999, 2000, 2001...) и кликая по определённому году получать нужный слайд. Надеюсь, что смогу разобраться сам используя Вашу подсказку.
  21. Доброй ночи. Помогите, пожалуйста, найти слайдер, где вместо превью изображений можно вставлять обычный текст. При клике по тексту нужна смена слайдов. Сейчас использую на сайте "Fotorama", но в этом слайдере нет возможности вставить текст вместо превью. Просмотрел в инете с два десятка слайдеров, но не нашёл где можно использовать текст вместо изображений превью. Заранее благодарю за помощь.
  22. Благодарю за подсказку, всё получилось
  23. Добрый вечер. На сайте используется jquery ui slider Подскажите, пожалуйста, как можно в этом плагине сделать поддержку сенсорных экранов, чтобы можно было перетаскивать ползунки прикосновением?
  24. Благодарю за Ваши подсказки, они мне очень помогли. С белой полосой вроде тоже разобрался, пришлось повозиться с css, но сейчас полосы нет при разных разрешениях. Всё дело было в width и height, при помощи @media screen настроил разные значения для разных разрешений экрана. Ещё раз благодарю за подсказки.
  25. Я понимаю, что не стоит... Попробую увеличить саму картинку... Я понимаю, что не стоит... Попробую увеличить саму картинку... Ничего не получилось)))
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy