esal
Апрель 14, 2011 23:10:32
Задумался над реализацией следующего кода.
Нужно написать скрипт, который бы отслеживал изменения конкретного значения на сайте (в определенном хтмл теге) например курс валюты, температуры или чего то другого.
Интересует конкретно реализация работы такого скрипта, чтобы при запуске его из консоли скажем, он работал и выводил сообщение об изменениях в значение, которое парсится или отправлял сообщение на личную почту.
zheromo
Апрель 14, 2011 23:39:12
1. Получаем хтмл код - urllib.urlopen
2. Парсим из него нужные значения (неоднократно обсуждалось на этом форуме)
3. Отличаются ли они от предыдущих
Если да
4. Сохраняем значения
5. Посылаем письмо об этом - smtplib
6. ПРОФИТ
Какой из этих пунктов вызывает затруднения?
esal
Апрель 14, 2011 23:59:59
А как разместить скрипт в директории сайта, чтобы можно было прикрутить ему веб интерфейс с парой кнопочек для запуска и остановки ну и чтобы выводилось значение (которое парсили) на странице.
Что тут почитать, использовать?
o7412369815963
Апрель 15, 2011 04:09:06
>А как разместить скрипт в директории сайта, чтобы можно было прикрутить ему веб интерфейс
раз есть какой-то сайт на который нужно выводить, то я бы просто выкусывал нужный html (запуск по крону, либо демоном), ложил в файлик, а движок сайта при отрисовке страницы его вставлял бы куда надо.
doza_and
Апрель 15, 2011 11:43:41
“А как разместить скрипт в директории сайта”
Не очень понятно в чем проблема? Те это сайт ваш или в интернете, из которого изменения? я так понял что в интернете.
Кроме сказанного o7412369815963 я бы добавил что вы наверное захотите отслеживать несколько значений. Соответственно система должна включать
1 базу идентификаторов того что вы хотите мониторить. Наверное список пар - url+ regex или кусок кода для выделения значения из странички и наверное символьное название чтобы не запутаться.
2 базу истории изменения этих параметров, или по крайней мере прошлое значение.
Система не очень сложная помоему, но требует аккуратной реализации (учитывая автозапуск и синхронизацию при добавлении новых контролируемых адресов).
Поэтому лучше если вы приведете ваши попытки. Можете писать в личку если что.
esal
Апрель 16, 2011 19:22:52
Тогда такой вопрос:
Как парсить данные с сайта, который требует авторизации. То есть чтобы просмотреть информацию нужно ввести логин и пароль. Без авторизации ничего интересного не увидишь. Как парсить данные с авторизацией в запросе? Подскажите какие нибудь простые и проверенные способы?
zheromo
Апрель 16, 2011 20:23:53
esal
Как парсить данные с сайта, который требует авторизации.
Очень просто - обычно авторизация основана на куках (если там Basic или Digest авторизация - то все намного проще), поэтому достаточно просто хранить и передавать куки между запросами. Ну и соответственно сделать POST запрос с данными, необходимыми для авторизации.
esal
Апрель 16, 2011 21:33:02
Можно пример какой нибудь, например для сайта Ярушки (ya.ru). Из за авторизации точнее ее отсутствия много информации не видно.
Можно пример какой то с использованием авторизованного запроса.
zheromo
Апрель 16, 2011 21:57:52
headers = {
'Host': HOST,
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'ru,en-us;q=0.7,en;q=0.3',
'Accept-Encoding': 'deflate',
'Accept-Charset': 'windows-1251,utf-8;q=0.7,*;q=0.7',
'Keep-Alive': '115',
'Connection': 'keep-alive',
'Cookie': 'lang=english',
'Cache-Control': 'max-age=0',
'Content-Type': 'application/x-www-form-urlencoded',
}
cred_data = {}
cred_data['login'] = login
cred_data['password'] = password
body = urllib.urlencode(cred_data)
headers['Content-Length'] = str(len(body))
conn = httplib.HTTPConnection("%s:%s" % (HOST,PORT,))
conn.request("POST", cred_url, body, headers)
response = conn.getresponse()
cookie = response.getheader('set-cookie', '')
conn.close()
headers['Cookie'] = cookie
conn = httplib.HTTPConnection("%s:%s" % (HOST,PORT,))
headers['Content-Length'] = 0
conn.request("GET", data_url, "", headers)
response = conn.getresponse()
data = response.read()
conn.close()
esal
Апрель 16, 2011 22:33:06
Спасибо)