Переписывал на работе кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.
Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
На данный момент успел написать бенчмарки на
Erlang,
Python,
PyPy,
NodeJS и
С в следующих комбинациях:
- Erlang - mochiweb_html
- CPython - lxml.etree.HTML
- CPython - BeautifulSoup 3
- CPython - BeautifulSoup 4
- CPython - html5lib
- PyPy - BeautifulSoup 3
- PyPy - BeautifulSoup 4
- PyPy - html5lib
- Node.JS - cheerio
- Node.JS - htmlparser
- Node.JS - jsdom
- C - libxml2 (скорее для справки)
В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.
Интрига: кто быстрее - Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C.
(далее...)
Фавикон (иконка для веб-странички) добавляется таким тегом в HEAD страницы:
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
Если вдруг появится необходимость его динамически поменять, то, по аналогии с картинками, должно быть достаточно сменить href атрибут, но на самом деле браузеры на это никак не реагируют. Поэтому нужно удалить и создать заново этот тег.
Как это сделать на чистом JavaScript описано тут
Управление иконками favicon из JavaScript - видим, что способ достаточно громоздкий.
В Jquery можно эту операцию проделать всего тремя строчками.
[codesyntax lang="javascript"]function chFavicon(iconHref){
//получаем объект тега иконки
icon=$(":[rel='shortcut icon']");
//создаем копию объекта иконки
cache=icon.clone();
//меняем атрибут href на переданный функции
cache.attr("href", iconHref);
//переписываем тег иконки
icon.replaceWith(cache);
}[/codesyntax]
Собственно, плоды моих трудов за последние 2 месяца (примерно).
Дизайн пока не делал, только функционал...
так вот...
Полезный инструментарий Web и JavaScript разработчика
В распоряжении следующие функции:
шифрование-кодировка
/преобразование текста в URL (%20%22%2F), base64, md5.../
выполнение на странице JavaScript
/здесь можно вставить в форму JavaScript и выполнить его, удобная система бэкапа/
послать POST или GET запрос скрипту
/отправить произвольный POST или GET запрос любому сайту/
счетчик - статистика + XSS
/счетчик посещений, сниффер, сбор статистики + инструмент для организации XSS атак))/
"прокси-браузер"
/можно открывать веб-странички с заданными COOKIES, HTTP-заголовками, USER-AGENT... и т.п./
Так что милости просим)))