Это библиотека для парсинга сайтов. Её основные функции:
1) Подготовка сетевого запроса (cookies, http-заголовки, POST/GET данные)
2) Запрос на сервер (возможно через HTTP/SOCKS прокси)
3) Получение ответа сервера и его первоначальная обработка (парсинг заголовков, парсинг cookies, определение кодировки документа, обработка редиректа (поддерживаются даже редирект в meta refresh тэге))
4) Работа с DOM-деревом ответа (если это HTML-документ)
5) Работа с формами (заполнение, автозаполнение)
6) Отладка: логирование процесса в консоль, сетевых запросов и ответов в файлы
BeautifulSoup — это только четвёртый пункт из представленного выше списка. Я давно отказался от BeautifulSoup — он тормозной, менее стабильный чем lxml и не поддерживает xpath и множества других вещей из модуля lxml.html, которые так скрашивают жизнь.
На самом деле, по-умолчанию он почти что ничего и не делает со страницей, функции преобразования в уникод и построения DOM-дерева включаютс только когда идёт обращение к методам, отвественным за работу с DOM-деревом. Первоначально grab разрабатывался как обёртка над curl, но затем я невольно наблюдал как акцент смещается на обработку полученной информации. И это круто — очень удобно :) Мне.
Кастомные хедеры шлются опцией `headers` — она описана в статье. Для базик авторизации настройки нету, ни разу не нужна оба была. С любым недостающим функционалом можно работать через `curl` аттрибут — это объект pycurl, который умеет всё на свете :)
Есть множество заказчиков, которые не против python. Говорю по собственному опыту. Даже на одеске регулярно публикуются заказы на парсеры, где люди сами пишут, что нужна система на python или указывают этот язык одним из вариантов. PHP я забыл как страшный сон. Множество версий PHP, несовместимых между собой и сами с собой (на ризличных хостинг-конфигурациях) не доставляли особой радости :) Типичный пример парсера на PHP — веб страница с простым интерфейсом, запускающая большой процесс внутри mod_php и благополучно умирающая по таймату с пустым экраном т.к. логинг ошибок отключен скриптописателем или админом веб-хостинга. А если скрипт всё же смог отработать он вываливает стопицот мегабайт данных прямо в окно браузера :) На питон такие волности допустить трудно т.к. как прикруить к нему веб-интерфейс — ещё знать надо. Поэтому даже у говнокодеров шансы сделать что-то работающее выше. Да и вообще для работы нужен хотя бы ssh-доступ к VPS или шаред-хостингу, этим отсекаются совсем дубовые заказчики, которые сэкономили на хостинг со школьных завтраков.
Ага, поправил. Много раз переписывал примеры, запарился :) Сначала написал синтетические примеры, потом решил везде код работы с живыми сайтами показать.
Да просто решил засветить либу, может кому-то пригодиться и хватит терпения разобраться. Документация хромает, она у меня не в приоритете. Мои личные нужды grab полность покрывает.
Ну вообще я grab уже года 3-4 юзаю. Много задач им решал. С точки зрения документации сырой, да.
Вот быстроенько протестировал — он умеет слать нужные запросы. dumpz.org/76084/
Я работал только с get/post, put/delete/head никогда не нужны были.
Что вы имели в виду под «совсем маленькое» я не очень понял.
В общем, я в конце концов перенёс в «сервисы», потом обнаружил, что почему-то стоит галочка «показывать только для подписчиков», и после всех этих манипуляций сайт всплыл на главной странице и дошёл до хабро-масс :)
Андрей, не надо указывать мне, что делать. Настроение плохое? При чём тут бабы и мороженое? Почему ты решил, что сайт бесполезный? Если кто-то посмотрел сайт и улыбнулся, то уже хорошо. Мне вон инвайт дали, оказывается. Приглашу друга — он давно хотел на хабр. Если сайт будет иметь посещаемость хотя бы несколько сотен хостов в день, то уже хорошо и полезно, у него будет некая трастовость и можно будет его использовать для продвижения других сайтов/сервисов.
Особо и нечего рассказывать. Скрипт парсит несколько страниц ленты хабра, чтобы захватить указанное количество дней. Далее парсит каждую публикацию, извлекает комментарии в отдельные объект в базе данных. Дале другой скрипт бежит по сохранённым комментариям, выдирает картинки и скачивает их, помечает анимированные gif-картинки, чтобы впоследствии выводить их без обычного механизма изменения размеров. Сам сайт сделан на базе django, ajax функционал на базе jquery и fancybox. Сайт кэшируется в memcached. RSS реализован средствами django. Кнопки публикации в социальные сети вставлены ручками. Сам парсинг работает на базе библиотеки grab(обёртка над pycurl + xml). Ресайзинг картинок через django-плагин sorl.thumbnail, который в свою очередь использует PIL. Статика раздаётся через nginx, динамика работет внутри uwsgi-процесса, который контролируется supervisor демоном. В качестве базы данных использован postgres. Работает всё на выделенном сервере от hetzner.de DNS-сервер на бесплатном сервере sitelutions.com Для анализ трафика используется яндекс-метрика. Репозиторий — mercurial.
BeautifulSoup — это только четвёртый пункт из представленного выше списка. Я давно отказался от BeautifulSoup — он тормозной, менее стабильный чем lxml и не поддерживает xpath и множества других вещей из модуля lxml.html, которые так скрашивают жизнь.
> P.S. HEAD-запросы требуют немного другой инициализации в cURL (надо отключить ожидание тела ответа)
Так там так и сделано, опция NOBODY выставляется: bitbucket.org/lorien/grab/src/9f1d856bba3d/grab/ext/pycurl.py
Да просто решил засветить либу, может кому-то пригодиться и хватит терпения разобраться. Документация хромает, она у меня не в приоритете. Мои личные нужды grab полность покрывает.
Вот быстроенько протестировал — он умеет слать нужные запросы. dumpz.org/76084/
Я работал только с get/post, put/delete/head никогда не нужны были.
Что вы имели в виду под «совсем маленькое» я не очень понял.