В общем пользователь заходит на портал и указывает url.
На стороне сервера мне нужно перейти по указанному url и получить значение тега title.
На сервере у меня tomcat(в общем java) и крутится все это на никсах.
Вопрос: Каким образом это лучше реализовать?
Писать ли на java или использовать какие-то nix-овые команды? (lynx вроде может помочь)
Или, возможно, какой-то сторонний сервис для подобных вещей есть, вроде тех, что предоставляют скриншоты страниц или рассылают email оповещения?
Тут есть два момента:
во-первых, кодировка. В базу все сохраняется в UTF-8, а страницы могут быть самыми разными… и windows-1251 и ISO-8859-1 и даже GB2312. И это значние кодировки еще получить нужно. А оно может быть и в header и/или в meta. А может и вообще не быть, такое тоже бывает.
Была необходимость сделать это на PHP. Реализовывал просто:
— запрашиваем через url страницу (в заголовках запроса указываем предпочтение получить ответ в utf-8 — для тех веб-серверов, что отдают в той кодировке, которую запрашиваешь)
— проверяем статус ответа (может вообще этот url не существует)
— смотрим кодировку в заголовках (регулярками)
— смотрим кодировку в meta (регулярками)
— ищем title, конвертируем его значение в определённую кодировку.
Собственно не понял критики. Человек попросил довезти его в определенное место за кратчайшее время. Я предлагаю автомобиль, а вы говорите, что автомобиль не умеет летать, поэтому не нужно.
Возможно, потребуется видоизменение регулярок.
1. Статус ответа:
status = substr(headers, 9, 3);
Код ответа расположен с 9 по 11 символы. Если не изменяет память, достаточно проверять на 200 и 302 коды.
2. Так находил кодировку в заголовках:
"/charset=(.+)[ˆ\ ]*/i"
3. Так — в теле страницы:
"/charset=(windows-1251|utf-8)/i"
Замечу, что я писал только для движков форумов, а они как правило только на этих двух кодировках работают, причем без лишних пробелов.
Вообще у меня закоменчен еще вот этот вариант, более универсальный:
"/<meta[ \r\n\t]{1}[ˆ>]*charset[ˆ=]*=([ˆ \"'>\r\n\t#]+)[ '\"\n\r\t]*[ˆ>]*>/is"
но что-то в нём не работало как надо, по-видимому, не помню что именно.
Да чё там уже Title выбрать, вы читаете что мистер хотел? он хотел кордировку + какую-то утилиту, я говорю wget + пускай себе сам уже чем-нибудь разпарсует HTML, grep например.
Лучше всего использовать Curl. Грузить часть кода с ограничением через CURLOPT_WRITEFUNCTION вместе с заголовком. По заголовку проверять ответ от сервера. Пример Curl goo.gl/0EOFQ Пример парсера goo.gl/sFP8t, определение кодировки простой функцией pastebin.com/51p9NUAX
Ну и примерчики у вас… Говнокод на говнокоде.
Неужто так сложно довериться кодировке, которая указана в Content-Type ответа сервера или в meta http-equiv=«content-type» на странице?
HTML удобнее и гибче не драть регэкспами, а использовать нормальный HTML парсер. Например, библиотеку libxml. Ничего сложного в этом нет.
Apache Httpclient + cpdetector (для определения кодировки)
Только он достаточно тяжёлый и ошибается :)
Алгоритм определения кодировки следующий:
1. Из заголовков сервера (Httpclient), если нет, то:
2. Из html (регуляркой вытаскиваете тэг), если нет, то:
3. cpdetector, если нет, то без понятия :)
А вообще задача довольно не тривиальная. И учтите, что получив byte[] массив от Httpclient — не конвертируйте его в String, иначе похерите кодировку :)
Про конвертацию в String — уже успел наступить на эти грабли )) Там еще есть один нюанс есть, раз уж на то пошло…
Страницу считывать надо построчно, а не загружать целиком, а потом парсерить… Потому что страницы, в особенности блогов, могут быть просто гиганскими… И 80% из того текста, что будет загружаться — бесполезный. Столкнулся с этим просто уже )
mb_convert_encoding (PHP) позволяет автоматически определить исходную кодировку. Проверял только на cp1251/utf8/koi8-r — нормально. Первый параметр — сама строчка. Второй параметр — в какую кодировку. Третий параметр необязательный — из какой кодировки.
Видел статью, в которой об этой функции было сказано много плохого. Вроде даже где-то здесь на хабре. Автор залез в сам код и обнаружил, что по одной из кодировок вообще ничего не преобразовывалось, по другой это делалось неверно и т.п.