Jump to content

slo_nik

User
  • Posts

    142
  • Joined

  • Last visited

Information

  • Sex
    Мужчина

slo_nik's Achievements

Explorer

Explorer (1/14)

1

Reputation

  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? Работает с ним и без него...
×
×
  • 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