По следам хабратопика о Watir, автоматизированном иструменте тестирования для web приложений на языке Ruby, решил написать небольшую статью о подобном инструменте для языка Python. Речь пойдет о замечательной библиотеке mechanize. В отличие от Watir, mechanize не заточен под какую-либ о ОС, и является надстройкой над питоновскими библиотеками urllib и urllib2.
Сама библиотека является эмулятором браузера (без поддержки яваскрипта) и позволяет решать задачи любого класса (с огладкой на «отключенный» яваскрипт), в которых необходим применение браузера. В частности, я впервые вышел на эту библиотеку, когда нужно было скачать огромное количество научных статей с одного хранилища, требующего авторизации и хранящего документы PDF так, что без помощи вспомогательных инструментов скачивать приходилось исключительно по одному документу, чем я и занимался 2 часа, пока не вспомнил о PERL'овой библиотеке WWW::Mechanize (о возможностях которой читал некоторое время назад) и не набрал в гугле запрос WWW::Mechanize python, который и привел меня на сорсфорж.
Но довольно лирики.
Начинается все с установки библиотеки. Подробно прочитать об этом лучше всего на оффсайте в разделе скачивания. Если кратко, то есть 3 основных пути получения этой библиотеки:
Лично я для себя выбрал третий путь, подробно описывать который в данной статье не имеет смысла, ибо написать лучше и подробнее, чем это сделано на оффсайте у меня все равно не получится.
Для того чтобы показать парочку возможностей этой библиотеки я написал небольшой скрипт, который идет на хабр, пробует залогиниться, и если удалось это сделать, то ищет на главной хабратопик с максимальным количеством комментариев и выводит все это пользователю.
Исходный код
Запускаем скрипт и получаем на выходе что-то вроде:
Другие, не менее интересные возможности этой замечательной библитеки вы можете посмотреть на ее оффсайте.
Сама библиотека является эмулятором браузера (без поддержки яваскрипта) и позволяет решать задачи любого класса (с огладкой на «отключенный» яваскрипт), в которых необходим применение браузера. В частности, я впервые вышел на эту библиотеку, когда нужно было скачать огромное количество научных статей с одного хранилища, требующего авторизации и хранящего документы PDF так, что без помощи вспомогательных инструментов скачивать приходилось исключительно по одному документу, чем я и занимался 2 часа, пока не вспомнил о PERL'овой библиотеке WWW::Mechanize (о возможностях которой читал некоторое время назад) и не набрал в гугле запрос WWW::Mechanize python, который и привел меня на сорсфорж.
Но довольно лирики.
Начинается все с установки библиотеки. Подробно прочитать об этом лучше всего на оффсайте в разделе скачивания. Если кратко, то есть 3 основных пути получения этой библиотеки:
Лично я для себя выбрал третий путь, подробно описывать который в данной статье не имеет смысла, ибо написать лучше и подробнее, чем это сделано на оффсайте у меня все равно не получится.
Для того чтобы показать парочку возможностей этой библиотеки я написал небольшой скрипт, который идет на хабр, пробует залогиниться, и если удалось это сделать, то ищет на главной хабратопик с максимальным количеством комментариев и выводит все это пользователю.
- # -*- coding: utf-8 -*-
-
- import re
- from mechanize import Browser
-
- # определим все, что нам может пригодится дальше
- root_url = 'http://habrahabr.ru/'
- login_url = 'http://habrahabr.ru/login/'
- username = 'krig'
- userpass = '******'
-
- comments_re = r'habrahabr\.ru/blog.*/#comments'
- count_re = re.compile('(\d+)\s*\+(\d+)')
- post_id_re = re.compile('habrahabr\.ru/blog.*/(\d+)/#comments')
-
- def is_logged_in(page_text):
- return not login_url in page_text
-
- br = Browser()
-
- home_page = br.open(root_url)
- print 'Добро пожаловать на', br.title()
-
- # проверим залогинены ли мы и попробуем это сделать, если еще нет
- if not is_logged_in(home_page.read()):
- print "Пробуем залогиниться"
- br.follow_link(text='войти')
- br.select_form(name="login")
- br["login"] = username
- br["password"] = userpass
- result_page = br.submit()
- if not is_logged_in(result_page.read()):
- print "Не удалось залогиниться"
- exit(1)
- else:
- print "Успешно вошли как", username
-
- # посчитаем самое большое количество комментариев на главной странице
- max = zero_comments = 0
- title = url = ''
- print "Начинаем перебор статей на главной"
- br.open(root_url)
- # при входе на страницу сохраняем все нужные ссылки в список, чтобы не потерять его
- # иначе, если в нутри цикла мы перейдем на другую страницу, то br.links(...) будет возвращать
- # ссылки с новой страницы
- for comments_url in [url for url in br.links(url_regex=comments_re)]:
- m = count_re.search(comments_url.text)
- # если хабракаментов нет, то и совпадений нет
- if not m:
- zero_comments += 1
- else:
- if int(m.group(1)) > max:
- max = int(m.group(1))
- habrapost_id = post_id_re.search(comments_url.absolute_url).group(1)
- post_url = [url for url in
- br.links(url_regex=r'habrahabr\.ru/blog.*/' + habrapost_id + '/?$')][0]
- title = post_url.text
- url = post_url.absolute_url
-
- print 'Хабратопиков без хабракаментов:', zero_comments
- print 'Максимальное количество хабракаментов:', max
- if max:
- print 'Самый коммментируемый топик:', title
- print 'А находится он по адресу:', url
Исходный код
Запускаем скрипт и получаем на выходе что-то вроде:
$ python habratest.py Добро пожаловать на Хабрахабр Пробуем залогиниться Успешно вошли как krig Начинаем перебор статей на главной Хабратопиков без хабракаментов: 0 Максимальное количество хабракаментов: 72 Самый коммментируемый топик: Бесплатные компьютеры А находится он по адресу: http://habrahabr.ru/blogs/startup_ideas/52540/
Другие, не менее интересные возможности этой замечательной библитеки вы можете посмотреть на ее оффсайте.