Автоматизируем проверку трекинга почты России

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"<h2>Tracking info</h2>",
           u"<h4>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
+4
12,2k 50
Комментарии 22

Похожие публикации

Программист Python
до 200 000 ₽YLabМожно удаленно
Python Developer Middle/Senior
от 140 000 ₽AlaoРостов-на-Дону
Python-разработчик Middle
до 125 000 ₽ТатнефтьКазань
Требуется Python разработчик
от 50 000 ₽IT-AcesМожно удаленно
Python разработчик
от 90 000 до 150 000 ₽Строительный ДворМоскваМожно удаленно

Лучшие публикации за сутки