Что нового

[Автоматизация] Скачивание запрашиваемых данных с сервера

logos

Новичок
Сообщения
30
Репутация
1
Версия AutoIt: 3.3.8.1

Преамбула: На определённой веб странице имеется форма при заполнении которой, можно скачать исторические данные котировок в текстовом формате. Форма простая но отнимает много времени так как приходится заполнять с десяток таких форм. Проведя определённые исследования выяснил, что сформировать ссылку на скачивание данных можно и вручную а ещё лучше с помощью скрипта :-[. Ну а так как в этом не шарю, прошу Вас помочь в этом.

Итак что нужно: Нужен скрипт, при нажатии на который с сервера, посредством сгенерированных самим же скриптом ссылок, скачивались несколько .txt файлов вот сюда d:\Закачки\. Размер скачиваемых данных очень мал и составляют около 1 Кб на каждый файл.

Описание работы скрипта: При его инициации он должен определить какая сегодня дата и вставить данные этой даты в новую ссылку, в области помеченные жёлтым маркером в отношении же номера месяца скрипт должен отнять единицу от номера месяца текущей даты и этот результат вставить в область помеченную малиновым маркером. Далее он должен определить какая дата была 7 дней назад и также вставить эту дату в области отмеченные зелёным маркером то же самое и с месяцев этой даты, а именно минус 1 и данные в область малинового маркера. Те же самые действия выполняются для других будущих ссылок. После фомирования ссылок они запускаются этим же скриптом на выполнение ну и скачиваются в папку "закачки" на диск D. Далее скрипт выключается до следующей инициации. Было бы неплохо предусмотреть в скрипте, проверку наличия уже скаченных файлов и при наличии таких файлов перезаписать новыми НЕ МЕНЯЯ их имена.
В помощь предоставляю скрин детальной расшифровки работы скрипта.


Вот что нужно Вот готовые ссылки которые позволят скачать исторические данные за 7 дней с 16 января по 23 января 2013 года:

http://195.128.78.52/EURUSD_130116_130123.txt?market=5&em=83&code=EURUSD&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=EURUSD_130116_130123&e=.txt&cn=EURUSD&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/EURUSD_130116_130123-.txt?market=5&em=83&code=EURUSD&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=EURUSD_130116_130123-&e=.txt&cn=E-D&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/GBPUSD_130116_130123.txt?market=5&em=86&code=GBPUSD&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=GBPUSD_130116_130123&e=.txt&cn=GBPUSD&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/GBPUSD_130116_130123-.txt?market=5&em=86&code=GBPUSD&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=GBPUSD_130116_130123-&e=.txt&cn=GBP&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/USDCHF_130116_130123.txt?market=5&em=85&code=USDCHF&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=USDCHF_130116_130123&e=.txt&cn=USDCHF&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/USDCHF_130116_130123-.txt?market=5&em=85&code=USDCHF&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=USDCHF_130116_130123-&e=.txt&cn=CHF&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/USDJPY_130116_130123.txt?market=5&em=87&code=USDJPY&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=USDJPY_130116_130123&e=.txt&cn=USDJPY&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1
http://195.128.78.52/USDJPY_130116_130123-.txt?market=5&em=87&code=USDJPY&df=16&mf=0&yf=2013&dt=23&mt=0&yt=2013&p=8&f=USDJPY_130116_130123-&e=.txt&cn=JPY&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1


Примечания: Эти ссылки я подправил ручками а хотелось бы формировать их скриптом.
И ещё. Скрипт должен менять только помеченные маркером цифры!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
logos,
Попробуйте так.
Код:
#include <Date.au3>

ConsoleWrite(_GetFile() & @LF)

Func _GetFile()
	Local $s_Minus7, $a_Minus7, $s_Url, $s_File, $s_Year, $h_DL, $i_DL, $s_Dir = @ScriptDir & '\Закачки\';поменяйте на свою папку закачки

	$s_Year = StringRight(@YEAR, 2)
	$s_Minus7 = _DateAdd('D', -7, @YEAR & '/' & @MON & '/' & @MDAY)
	$a_Minus7 = StringSplit($s_Minus7, '/')
	$s_File = 'EURUSD_' & StringRight($a_Minus7[1], 2) & $a_Minus7[2] & $a_Minus7[3] & '_' & $s_Year & @MON & @MDAY
	If FileExists($s_Dir) Then
		If FileExists($s_Dir & $s_File & '.txt') Then Return True
	Else
		DirCreate($s_Dir)
	EndIf
	$s_Url = 'http://195.128.78.52/' & $s_File & '.txt?market=5&em=83&code=EURUSD&df=' & $a_Minus7[3] & '&mf=' & $a_Minus7[2] - 1 & '&yf=' & _
			$a_Minus7[1] & '&dt=' & @MDAY & '&mt=' & @MON - 1 & '&yt=' & @YEAR & '&p=8&f=' & $s_File & _
			'&e=.txt&cn=EURUSD&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1'
	$s_File = $s_Dir & $s_File & '.txt'
	$h_DL = InetGet($s_Url, $s_File, 17, 1)
	Do
		Sleep(50)
	Until InetGetInfo($h_DL, 2)
	$i_DL = InetGetInfo($h_DL, 4)
	InetClose($h_DL)
	Return ($i_DL = 0)
EndFunc   ;==>_GetFile
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
madmasles
Работает но не совсем правильно.
1. Скрипт создаёт папку "закачки" в папке где находится сам скрипт. А хотелось бы чтобы скачиваемый файл размещался в давно созданной папке и вне зависимости где расположен сам скрипт.
2. Скачиваются только данные одной пары.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
logos [?]
Скрипт создаёт папку "закачки" в папке где находится сам скрипт
Что здесь непонятно?
madmasles [?]
;поменяйте на свою папку закачки



Добавлено:
Сообщение автоматически объединено:

logos [?]
Скачиваются только данные одной пары.
Поправлю.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
надо поменять @ScriptDir & '\Закачки\' на 'D:\закачки\'
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
Kaster [?]
надо поменять @ScriptDir & '\Закачки\' на 'D:\закачки\'
Поменял, стало работать правильно





Добавлено:
Сообщение автоматически объединено:

madmasles
Я попробовал этот код продублировать в самом скрипте, разумеется заменив другими данными, но выскочила ошибка.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
logos
где код или подробный текст ошибки со строкой где ошибка произошла?
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
Kaster [?]
где код или подробный текст ошибки со строкой где ошибка произошла?
Ошибка на 46 строке. Func_GetFile() Error: Duplicate function name.
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.8.1
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include <Date.au3>

ConsoleWrite(_GetFile() & @LF)

Func _GetFile()
    Local $s_Minus7, $a_Minus7, $s_Url, $s_File, $s_Year, $h_DL, $i_DL, $s_Dir = 'D:\закачки\';поменяйте на свою папку закачки

    $s_Year = StringRight(@YEAR, 2)
    $s_Minus7 = _DateAdd('D', -7, @YEAR & '/' & @MON & '/' & @MDAY)
    $a_Minus7 = StringSplit($s_Minus7, '/')
    $s_File = 'EURUSD_' & StringRight($a_Minus7[1], 2) & $a_Minus7[2] & $a_Minus7[3] & '_' & $s_Year & @MON & @MDAY
    If FileExists($s_Dir) Then
        If FileExists($s_Dir & $s_File & '.txt') Then Return True
    Else
        DirCreate($s_Dir)
    EndIf
    $s_Url = 'http://195.128.78.52/' & $s_File & '.txt?market=5&em=83&code=EURUSD&df=' & $a_Minus7[3] & '&mf=' & $a_Minus7[2] - 1 & '&yf=' & _
            $a_Minus7[1] & '&dt=' & @MDAY & '&mt=' & @MON - 1 & '&yt=' & @YEAR & '&p=8&f=' & $s_File & _
            '&e=.txt&cn=EURUSD&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1'
    $s_File = $s_Dir & $s_File & '.txt'
    $h_DL = InetGet($s_Url, $s_File, 17, 1)
    Do
        Sleep(50)
    Until InetGetInfo($h_DL, 2)
    $i_DL = InetGetInfo($h_DL, 4)
    InetClose($h_DL)
    Return ($i_DL = 0)
 EndFunc   ;==>_GetFile
 
 #include <Date.au3>

ConsoleWrite(_GetFile() & @LF)

Func _GetFile()
    Local $s_Minus7, $a_Minus7, $s_Url, $s_File, $s_Year, $h_DL, $i_DL, $s_Dir = 'D:\закачки\';поменяйте на свою папку закачки

    $s_Year = StringRight(@YEAR, 2)
    $s_Minus7 = _DateAdd('D', -7, @YEAR & '/' & @MON & '/' & @MDAY)
    $a_Minus7 = StringSplit($s_Minus7, '/')
    $s_File = 'EURUSD-_' & StringRight($a_Minus7[1], 2) & $a_Minus7[2] & $a_Minus7[3] & '_' & $s_Year & @MON & @MDAY
    If FileExists($s_Dir) Then
        If FileExists($s_Dir & $s_File & '.txt') Then Return True
    Else
        DirCreate($s_Dir)
    EndIf
    $s_Url = 'http://195.128.78.52/' & $s_File & '.txt?market=5&em=83&code=EURUSD&df=' & $a_Minus7[3] & '&mf=' & $a_Minus7[2] - 1 & '&yf=' & _
            $a_Minus7[1] & '&dt=' & @MDAY & '&mt=' & @MON - 1 & '&yt=' & @YEAR & '&p=8&f=' & $s_File & _
            '&e=.txt&cn=E-D&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1'
    $s_File = $s_Dir & $s_File & '.txt'
    $h_DL = InetGet($s_Url, $s_File, 17, 1)
    Do
        Sleep(50)
    Until InetGetInfo($h_DL, 2)
    $i_DL = InetGetInfo($h_DL, 4)
    InetClose($h_DL)
    Return ($i_DL = 0)
EndFunc   ;==>_GetFile
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
logos
Это ведь для какой-то программы теханализа? Не Amibroker?
Для скачки с финама давно написаны проги с большим функционалом, например, Quotes Updater
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
WSWR
OffTopic:
Да для программы теханализа, но не Amibroker а MetaStock. О программе Quotes Updater ничего не знаю. Надо будет посмотреть.... хотя для чего?! если скрипт будет доработан этого будет вполне достаточно
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
logos

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.





Зачем Вы 2 раза вставили одну и ту же функцию? Имена не должны совпадать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Надо сделать те параметры которые будут меняться входящими для функции (одной!) и потом вызывать ее же с разными параметрами. азы же. справку почитай хотя бы
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
Medic84 [?]
Предупреждение
Исправил.

Зачем Вы 2 раза вставили одну и ту же функцию? Имена не должны совпадать.
Я не знаю этот язык программирования и поэтому делаю такие ошибки.

Kaster [?]
Надо сделать те параметры которые будут меняться входящими для функции (одной!) и потом вызывать ее же с разными параметрами. азы же. справку почитай хотя бы
Для Вас азы, а для меня тёмный лес! Справку читал, это всё равно что читать китайскую книгу зная только русский язык... :-[
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
logos [?]
Справку читал, это всё равно что читать китайскую книгу зная только русский язык...
На форуме присутствует русская справка, если что...
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
Medic84 [?]
На форуме присутствует русская справка, если что...
Про неё и речь! :-[
OffTopic:
имхо Чтобы писать скрипты надо понимать механизм его работы, что за чем должно стоять и как это всё взаимодействует. Естественно многое есть в справке, но всё равно у меня пока не получается понять её. Может мои мозги не заточены под написание скриптов.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
logos,
Попробуйте так.
Код:
#include <Date.au3>
#include <Array.au3>

Local $a_M[12] = ['http://195.128.78.52/', '.txt?market=5&em=8', '&code=', '&df=', '&mf=', '&yf=', '&dt=', '&mt=', '&yt=', '&p=8&f=', _
		'&e=.txt&cn=', '&dtf=1&tmf=1&MSOR=0&mstime=on&mstimever=1&sep=1&sep2=1&datf=2&at=1'], $s_Minus7, $a_Min, $s_Year, _
		$a_Work[9][5] = [[8],['EURUSD', 3, '', 'EURUSD'],['EURUSD', 3, '-', 'E-D'],['GBPUSD', 6, '', 'GBPUSD'],['GBPUSD', 6, '-', 'GBP'], _
		['USDCHF', 5, '', 'USDCHF'],['USDCHF', 5, '-', 'CHF'],['USDJPY', 7, '', 'USDJPY'],['USDJPY', 7, '-', 'JPY']], _
		$s_Dir = @ScriptDir & '\Закачки\';поменяйте на свою папку закачки

$s_Year = StringRight(@YEAR, 2)
$s_Minus7 = _DateAdd('D', -7, @YEAR & '/' & @MON & '/' & @MDAY)
$a_Min = StringSplit($s_Minus7, '/')
If Not FileExists($s_Dir) Then DirCreate($s_Dir)
For $i = 1 To $a_Work[0][0]
	$a_Work[$i][4] = $a_Work[$i][0] & '_' & StringRight($a_Min[1], 2) & $a_Min[2] & $a_Min[3] & '_' & $s_Year & @MON & @MDAY & $a_Work[$i][2]
	$a_Work[$i][3] = $a_M[0] & $a_Work[$i][4] & $a_M[1] & $a_Work[$i][1] & $a_M[2] & $a_Work[$i][0] & $a_M[3] & $a_Min[3] & $a_M[4] & $a_Min[2] - 1 & _
			$a_M[5] & $a_Min[1] & $a_M[6] & @MDAY & $a_M[7] & @MON - 1 & $a_M[8] & @YEAR & $a_M[9] & $a_Work[$i][4] & $a_M[10] & $a_Work[$i][3] & $a_M[11]
	For $j = 0 To 2
		$a_Work[$i][$j] = ''
	Next
	$a_Work[$i][4] = $s_Dir & $a_Work[$i][4] & '.txt'
	If FileExists($a_Work[$i][4]) Then
		$a_Work[$i][2] = 'Already downloaded'
		$a_Work[$i][1] = StringFormat('File size: %d byte', FileGetSize($a_Work[$i][4]))
		$a_Work[$i][0] = '-'
	Else
		$a_Work[$i][0] = InetGet($a_Work[$i][3], $a_Work[$i][4], 17, 1)
		If $a_Work[$i][0] Then
			Do
				Sleep(20)
			Until InetGetInfo($a_Work[$i][0], 2)
			$a_Work[$i][1] = StringFormat('File size: %d byte', InetGetInfo($a_Work[$i][0], 0))
			If InetGetInfo($a_Work[$i][0], 4) Then
				$a_Work[$i][2] = 'Download error'
			Else
				$a_Work[$i][2] = 'Download success'
			EndIf
			InetClose($a_Work[$i][0])
		EndIf
	EndIf
Next
_ArrayDisplay($a_Work)
Можно качать в несколько потоков, но тогда сервер отдает файлы через один (у меня).

Kaster, Medic84,
Это же Стол заказов. :smile:
ИМХО, те, кто сюда обращаются, могут совсем не разбираться в AutoIt.
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
madmasles
Данные скачиваются отлично, но не работает функция перезаписи файлов, в случае если они уже были скачены предыдущей инициацией скрипта. Также пришлось закомментировать строки include <Array.au3> и _ArrayDisplay($a_Work) так как появлялось окно, думаю оно вспомогательное и не несёт других функций для этого скрипта.


Добавлено:
Сообщение автоматически объединено:

madmasles [?]
Это же Стол заказов.
smiley.gif

ИМХО, те, кто сюда обращаются, могут совсем не разбираться в AutoIt.
Огромное спасибо за поддержку!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
logos [?]
но не работает функция перезаписи файлов
А зачем перезаписывать уже скачанные файлы? Я очень сомневаюсь, что они изменятся. :smile:
Может добавить запись результата в лог?
А что Вы делаете с этими файлами?
 
Автор
L

logos

Новичок
Сообщения
30
Репутация
1
madmasles [?]
А зачем перезаписывать уже скачанные файлы? Я очень сомневаюсь, что они изменятся
Нет нет, они постоянно меняются и те данные, которые были скачены 5 минут назад будут совершенно иными при новой скачке. Ну а если эту функцию скрипта будет сложно реализовать, то тогда буду выходить из положения другим способом (ручное удаление)




Добавлено:
Сообщение автоматически объединено:

madmasles [?]
А что Вы делаете с этими файлами?
С ними ничего, а вот программа для теханализа забирает из этих файлов котировки и вставляет в графики валютных пар. Потом файлы можно удалить и скачать новые с новыми данными.
 
Верх