Python, PHP и HTTP запросы

Припёрло тут такое дело: Наш всеми любимый google решил сделать свой новый сервис, Google Sitemaps. Этот сервис по идее хорош – у кого сайт плохо индексируется – тот мог составить список ссылок и это дело подлечить. Но где гарантия, что конкуренты, сделаф фиктивный акаунт вас не попытаются опустить? Интерестно, куда это дело продвиниться?
Естественно – ну надо же это дело опробывать. Тем более они предлагали взять готовый, ими же написанный скрипт на Python, который, как олазалось, проходил по сайту через файловую систему, и собирал все пути до файлов, которые находил, и вы ему разрешали взять. Такой путь подходит только если для статичных сайтов, как у моего тестя. Да и то – там сайт весь на PHP и mod_rewrite хитрый. А большие сайты, которые никогда не думали о том, что такая фишка будет, Google Sitemap сгенерить не могут. Тем более не на каждом сервере Python есть.
Появилась нужда, этот процесс сборки урлов автоматизировать. Ну не садиь же китайцев/студентов это дело делать.
Первая мысль – взять PHP, найти старый, мною писаный индексатор сайтов на cURL, где каждую страницу доставали за 2 обращения к серверу (вначале HEADER, потом, если наш формат – BODY). Что меня особо не вставило. Потому я решил обратиться к более современным языкам и интерпретаторам. Выбор пал на Python.

Наверное потому, что на нём сразу было сделано у Google.com, да и интерестно было поковыряться в чём-то более современном, чем PHP. Тем более на рабочем столе лежал готовый парсер HTML сделанный из HTMLParser.
Самое главное в этом продукте – не наступить на грабли ввиде не нужных линков, а то было любая ссылка вне начального сайта, и все ссылки на документы, у которых тип был не text/html. Что потянуло бы за собой скачивания кучи ненужной информации ввиде ZIPов, фильмов, и на что там у нас народ линки ставит. Их нужно записать, но считывать ненадо.
Порившись немного я наткнулся на httplib, там классый пример, как не читая всего тела ответа сервера, узнать статус и тип данных. Сам пример. Но грабли зарыты в этом деле были. Пока HTTPRespond не прочтён – новый запрос делать на том-же соединении нельзя. А фукнция закрытия HTTPRespond не документирована. Но она есть. Вот так дело и завязалось. Из HTML вытянуть кучу ссылок с регулярными выражениями не составляет труда. Правда первичная идея была воспользоваться HTMLParserом – но тут мы наступили на грабли с невалидными сайтами, коих у нас тьма тьмущая. Вобщем дело завертелось. Линки считывались, заносились, соблюдалась уникальность, собиралась такая инфомация как Last-Modified заголовок. Строился валидный XML при помощи xml.dom. Вроде даже совсем не плохо. Только одно было не удобно – для того что бы посмотреть на процесс индексации, и то что оно "проиндексировало", как, поредактировать другие опции ссылок для Google Sitemaps – нужно было лесть в XML файл и тучками править.
И решил я сделать этой штуковине GUI. А выбор пал на Tkinter.
Но за ту возможность одним запросом вначале читать заголовки, а потом, если надо тело – я полюбил Python.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.