Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Отслеживание изменений на сайте

Ответить
Настройки темы
[решено] Отслеживание изменений на сайте

Ветеран


Сообщения: 1216
Благодарности: 38

Профиль | Отправить PM | Цитировать


Всех приветствую!

Имеется банальная задача, но пока решения для неё я не обнаружил.

В общем, есть html-страница, на которой n-абзацев с текстом следующего содержания:
Цитата:
Число1: 50
Число2: 100
Число3: 150
Число4: 200
...
Все числа с некой периодичностью меняются меняются и мне необходимо отслеживать Число3. Если оно когда-либо не будет равно изначальному значению (например, 100), то необходимо создать алерт. Алерт в моем случае это некое оповещение и очень желательно чтобы это оповещение было по е-мейлу. Проверку на изменение необходимо делать в изолированной автономной программе (т.е. это не должен быть плагин на браузер). Проверка должна быть постоянная с заданной периодичностью.

Я давно использую замечательное ПО - WebSite-Watcher. Но к большому сожалению, с этой задачей программа не справляется...

Хотел у Вас спросить, какое ещё ПО можно использовать для решения данной задачи?

Спасибо!

Отправлено: 01:10, 12-09-2017

 

Ветеран


Сообщения: 1216
Благодарности: 38

Профиль | Отправить PM | Цитировать


Iska,
Цитата Iska:
Как раз критично, ибо именно от конкретного содержимого и будет зависеть «путь» по иерархии тэгов или выбор тэгов селекцией. »
Я понимаю, и всё же:
Цитата The_Immortal:
решение этого примера практически полностью переносимо на реальную задачу »
Если точнее, то есть уникальный div ("div3"), внутри которого можно найти искомый текст и разобрать его (обновил код). Т.е. ирархия и вложенность тут вообще не нужна. Нужно тупо обнаружить строку:
Код: Выделить весь код
<div id="div3">Число3: 101</div>
И узнать что там за значение...

Цитата Iska:
WSH/PowerShell. »
Понял, будем изучать.

Спасибо!

Последний раз редактировалось The_Immortal, 13-09-2017 в 19:24.


Отправлено: 19:18, 13-09-2017 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


Сообщения: 20350
Благодарности: 5823

Профиль | Отправить PM | Цитировать


Цитата The_Immortal:
Если точнее, то есть уникальный div ("div3"), »
Ну, вот, видите — совсем другое дело.

Цитата The_Immortal:
Т.е. ирархия и вложенность тут вообще не нужна. »
По-разному.

Попробуйте для начала WSH:
Скрытый текст
Код: Выделить весь код
Option Explicit

Const READYSTATE_COMPLETE = 4


Dim objRegExp


Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.Pattern = "^Число3: (\d+?)$"

With WScript.CreateObject("InternetExplorer.Application")
	.Visible = False
	.Navigate("http://imm.hldns.ru/")
	
	Do
		WScript.Sleep 100
	Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
	
	WScript.Echo .document.GetElementByID("div3").innerText
	
	If objRegExp.Test(.document.GetElementByID("div3").innerText) Then
		If Not StrComp(objRegExp.Execute(.document.GetElementByID("div3").innerText).Item(0).Submatches.Item(0), "100", vbTextCompare) = 0 Then
			WScript.Echo "<> 100"
		End If
	Else
		WScript.Echo "Not found"
	End If
	
	.Quit
End With

Set objRegExp = Nothing

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:23, 13-09-2017 | #12


Модератор


Moderator


Сообщения: 8029
Благодарности: 2737

Профиль | Отправить PM | Цитировать


Цитата The_Immortal:
б) отправки емейла; »
Blat
Цитата The_Immortal:
в) организации автономности »
Что есть "автономность"?
Цитата The_Immortal:
и и периодического чекинга. »
стандартный планировщик windows.
Если мало - nnCron
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:31, 14-09-2017 | #13


Ветеран


Сообщения: 1216
Благодарности: 38

Профиль | Отправить PM | Цитировать


Iska, огромнейшее Вам спасибо за помощь! Но Вы как в воду глядели по поводу иерархии... Она всё же есть Я ,ослепленный скорейшим получением решения, по своей глупости слишком абстрагировался от задачи и крайне упростил пример... Прошу меня простить за зря потраченное Вами время.
Теперь же я действительно максимально воссоздал условия.

Как видите, html-структура следующая (на примере двух чисел):
Скрытый текст
Код: Выделить весь код
<div class="number">
	<div class="num3">
		<div class="title">
			<h4 class="string">Число3: </h4>
		</div>
		<div class="value">
			<h5>101</h5>
		</div>
	</div>
</div>

<div class="number">
	<div class="num4">
		<div class="title">
			<h4 class="string">Число4: </h4>
		</div>
		<div class="value">
			<h5>105</h5>
		</div>
	</div>
</div>


Во-первых, тут классы. Во-вторых, общие классы идентичны (class="number"), как и внутренние . Но есть и третье-положительное: никаких регулярок тут не требуется, т.к. значение сидит изолированно в классе "value".

В общем, я попытался вывести нужное значение следующим образом:
Код: Выделить весь код
Option Explicit

Const READYSTATE_COMPLETE = 4

Dim list

With WScript.CreateObject("InternetExplorer.Application")
	.Visible = False
	.Navigate("http://imm.hldns.ru/")
	
	Do
		WScript.Sleep 100
	Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

        list = .document.getElementsByClassName("num3")(0)
	WScript.Echo list.getElementsByClassName("value")(0).innerText
	
	.Quit
End With

Set objRegExp = Nothing

WScript.Quit 0
Однако получаю странную ошибку (Требуется объект '') на строчке:
Код: Выделить весь код
WScript.Echo list.getElementsByClassName("value")(0).innerText
Вы не могли бы подсказать, в чем там может быть ошибка? По сути ведь всё верно. По крайней мере я в инете нашел подобные конструкции:
Код: Выделить весь код
wscript.echo element.getElementsByClassName("span")(0).innerText
Чем моя хуже? Я в list получаю "внутренности" класса "num3". Далее я пытаюсь вывести внутренний текст (искомое значение) по найденному классу "value", который находится внутри list.

Последний раз редактировалось The_Immortal, 15-09-2017 в 03:30.


Отправлено: 23:45, 14-09-2017 | #14


Ветеран


Contributor


Сообщения: 20350
Благодарности: 5823

Профиль | Отправить PM | Цитировать


Цитата The_Immortal:
Вы не могли бы подсказать, в чем там может быть ошибка? »
Код: Выделить весь код
Set list = .document.getElementsByClassName("num3")(0)
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:37, 15-09-2017 | #15


Ветеран


Сообщения: 1216
Благодарности: 38

Профиль | Отправить PM | Цитировать


Iska, пожалуйста, гляньте своим профессиональным взглядом на этот простейший код:
Код: Выделить весь код
Option Explicit

Const READYSTATE_COMPLETE = 4

Dim list, WshShell 

With WScript.CreateObject("InternetExplorer.Application")
	.Visible = False
	.Navigate("http://imm.hldns.ru/")
	
	Do
		WScript.Sleep 100
	Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

        Set list = .document.getElementsByClassName("num3")(0)
        set WshShell = WScript.CreateObject("Wscript.Shell")

	If Not StrComp(list.getElementsByClassName("value")(0).innerText, "100", vbTextCompare) = 0 Then
		WshShell.Run "c:\mailsend\mailsend -кучавсякихразныпараметров", 0, True
	End If
	
	.Quit
End With

WScript.Quit 0
Нужно ли тут чего-то добавить в плане удаление созданных объектов?

А в общем, благодаря Вам задача решена. Я данный скрипт по совету уважаемого Amigos'а запихнул в Планировщик заданий с заданной периодичностью - всё ок.

И ещё хотел сказать насчет программки для консольной отправки почты Blat - при её использовании я обнаружил пару минусов:
  • для SSL-соединений (которые требуют многие публичные почтовые серверы) ей необходимо иметь дополнительное SSL-туннелирование (в этом помогает Stunnel) - не особо критично, однако неудобно;
  • очень странно, но по отправке писем именно по тому адресу, который важен мне (номер_телефона_Билайн@sms.beemail.ru) наблюдались явные проблемы: письма доставлялись с опозданием в 30-60 мин.; не могу знать с чем это связано, т.к. на всякие публичные адреса типа mail.ru, google.ru, yandex.ru, rambler.ru письма падали мгновенно.
Поэтому я воспользовался аналогичной по назначению программкой mailsend, где вышеуказанных минусов не наблюдается.

Отправлено: 23:05, 16-09-2017 | #16


Ветеран


Contributor


Сообщения: 20350
Благодарности: 5823

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Option Explicit

Const READYSTATE_COMPLETE = 4

Dim objHTMLElementCollection, objHTMLElementCollection2


With WScript.CreateObject("InternetExplorer.Application")
	.Visible = False
	.Navigate("http://imm.hldns.ru/")
	
	Do
		WScript.Sleep 100
	Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
	
	Set objHTMLElementCollection = .document.getElementsByClassName("num3")
	
	If Not objHTMLElementCollection Is Nothing Then
		Set objHTMLElementCollection2 = objHTMLElementCollection.item(0).getElementsByClassName("value")
		
		If Not objHTMLElementCollection2 Is Nothing Then
			If Not StrComp(objHTMLElementCollection2.item(0).innerText, "100", vbTextCompare) = 0 Then
				SendMessage
			End If
			
			Set objHTMLElementCollection2 = Nothing
		Else
			WScript.Echo "Can't parse elements with [value] class name."
		End If
		
		Set objHTMLElementCollection = Nothing
	Else
		WScript.Echo "Can't parse elements with [num3] class name."
	End If
	
	.Quit
End With

WScript.Quit 0

Sub SendMessage()
	Const cdoSendUsingPort = 2
	Const cdoBasic         = 1
	
	Const strPartSchema    = "http://schemas.microsoft.com/cdo/configuration/"
	
	With WScript.CreateObject("CDO.Message")
		With .Configuration.Fields
			.Item(strPartSchema & "sendusing")        = cdoSendUsingPort
			.Item(strPartSchema & "smtpauthenticate") = cdoBasic
			.Item(strPartSchema & "smtpserver")       = "smtp.mail.ru"
			.Item(strPartSchema & "smtpserverport")   = 465
			.Item(strPartSchema & "smtpusessl")       = True
			.Item(strPartSchema & "sendusername")     = "login"
			.Item(strPartSchema & "sendpassword")     = "password"
			
			.Update
		End With
		
		.To            = "to@yandex.ru"
		.From          = "from@mail.ru"
		.Subject       = "Subject"
		.TextBody      = "TextBody"
		
		.Send
	End With
End Sub
Может потребоваться библиотека Collaboration Data Objects.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:59, 17-09-2017 | #17


Ветеран


Сообщения: 1216
Благодарности: 38

Профиль | Отправить PM | Цитировать


Iska,
Цитата Iska:
Может потребоваться библиотека Collaboration Data Objects »
Не потребовалась

Всё замечательно работает.

Дай Вам Бог здоровья!

Отправлено: 03:38, 19-09-2017 | #18



Компьютерный форум OSzone.net » Компьютеры + Интернет » Хочу все знать » [решено] Отслеживание изменений на сайте

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интернет - [решено] Отслеживание изменений на сайте BelovS Программное обеспечение Windows 10 04-11-2015 18:45
2010 - Отслеживание изменений на рабочем листе Quaker_75 Microsoft Office 4 27-05-2015 13:48
Разное - Программа для поиска информации на сайте Fist Программирование и базы данных 7 21-02-2012 00:09
Создание отслеживание заказов на сайте маруська818 Вебмастеру 0 14-04-2011 14:37
Переиндексация информации о сайте. Domashenko Alexey Вебмастеру 1 28-08-2003 11:15




 
Переход