Автоматизируем проверку трекинга почты России / Хабр
av0000
Python *
Надоело нудно выбирать из списка нужный трек?
Не работают сторонние треккеры?
Тогда мы идём к вам! ©
После того, как мне в очередной раз стало лень проверять с десяток треков, выбирая их из списка на сайте Почты России, я занялся поиском хоть какого решения для автоматизации сего процесса.
Результат изысков
Гугление на предмет готовых скриптов показало, что после смены «политики партии», большинство из них работать отказывается. Каково же было моё радостное удивление, когда ссылка к старому доброму info.russianpost.ru/servlet сработала! В итоге получился наколенный скрипт на питоне, проверяющий треки из файла и формирующий страничку с результатами — ссылкой на on-line проверку и последним действием с посылкой для наглядности.
Всё предельно просто:
* Читаем трек-номера из файла
* Для каждого номера парсим HTML и выбираем предпоследнюю строку таблицы (если она есть) статуса
* Формируем и записываем результирующий HTML
У меня это всё запускается cron-ом раз в несколько часов и подсовывается локальному Lighttpd в качестве одной из статических страниц.
Собственно код:
#!/usr/bin/env python # -*- coding: utf-8 -*- import logging import urllib2 import lxml.html as htm import lxml.html.soupparser as soup # Note: internally imports BeautifulSoup import time log = logging.getLogger() POST_URL="http://info.russianpost.ru/servlet/post_item?action=search&searchType=barCode&show_form=no&barCode=%s&page=1" # Track No as parameter TRACK_FILE="tracks.txt" HTML_FILE="index.html" def main(): out = [] # output links tracks = [x.strip() for x in open(TRACK_FILE,'Ur').readlines() if x.strip()] for trk in tracks: log.debug(u"Check tracking #%s" % (trk,)) try: f = urllib2. urlopen(POST_URL % trk) except: log.exception(u"Get info for `%s` failed (open url)" % trk) try: s = f.read() f.close() except: log.exception(u"Get info for `%s` failed (read)" % trk) try: try: x = htm.document_fromstring(s) except: # broken html fallback x = soup.fromstring(s) tbl = x.xpath('/html/body/table[1]') log.debug(u"TBL: %s" % (tbl,)) if tbl: s = '' tr = tbl[0].xpath('tr')[-2].xpath('td') out.append((trk, u"%s: %s (%s %s)" % (tr[1].text, tr[0].text, tr[3].text, tr[4].text))) else: out.append((trk, 'No information available')) except: log.exception(u"") # make output ht = [u"<html>", u"<head><meta http-equiv='content-type' content='text/html;charset=utf-8'/></head>", u"<body>" u"<h3>Tracking info</h3>", u"<h5>Last update: %s" % time.asctime(), u"<h5>Add track numbers into `tracks.txt`</h5><br/>"] for s in out: ht.append( u"<a href='%s'>%s</a>: %s<br/>" % (POST_URL % s[0], s[0],s[1]) ) ht.append(u"</body></html>") with open(HTML_FILE, "w") as f: print >>f , "\n".join(ht).encode('utf-8') log.debug('Done.') if __name__ == "__main__": logging.basicConfig(level=logging.INFO) main()
PS: В качестве самостоятельной работы можно добавить чтение и запись не из hard-coded файлов, а передачу их параметрами. Ну и украшательства выходного HTML, если это кому-то надо 🙂
UPD: Добавил вывод названия ОПС и атрибута операции — для наглядности
Теги:
- python
- почта россии
- html-парсер
Хабы:
- Python
Всего голосов 18: ↑11 и ↓7 +4
Просмотры13K
Комментарии 22
Александр Воронин @av0000
Пользователь
Комментарии Комментарии 22
| РЕКЛАМНОЕ ОБЪЯВЛЕНИЕ |
Заказал часы в Мераном 70 дней назад и они до сих пор в России.
| Страница 5JavaScript отключен. Для лучшего опыта, пожалуйста, включите JavaScript в вашем браузере, прежде чем продолжить.
81 — 100 из 264 сообщений
рмерон
·Зарегистрировано
кафесуада
·Зарегистрировано
забат
·Зарегистрировано
Коцов
Зарегистрировано
насос 19
·Зарегистрировано
охенри1
·Запрещено
агфа100
·Зарегистрировано
Стяжка
·Зарегистрировано
забат
·Зарегистрировано
Зани4
·Зарегистрировано
каменный
·Зарегистрировано
lqqker
·Зарегистрировано
каменный
·Зарегистрировано
lqqker
·Зарегистрировано
Объект704
·Зарегистрировано
Джокит
·Зарегистрировано
Слизакс
·Зарегистрировано
Исследователь ролей
·Премиум-участник
мераном
·Зарегистрировано
мераном
·Зарегистрировано
81 — 100 из 264 Сообщений
- Это старая тема, возможно, вы не получите ответа, и старая тема может быть восстановлена.