Робот читает интернет-страницу

Страницы: 1
RSS
Робот читает интернет-страницу
 
Господа, подскажите пожалуйста как реализовать такую задачу на Луа.
1. Робот заходит на страничку с дивидендами:
http://smart-lab.ru/dividends/

2. Читает её
3. Формирует Луа-таблицу с полями
Тикер - дата отсечки Т+2
Тикер - дата отсечки Т+2
4. В последний день перед дивидендым гэпом посылает сообщение в КВИК.

Мои роботы на Луа никогда не читали интернет-странички и не брали из них данных. Даже не знаю с чего начать.
Спасибо за помощь.
 
Цитата
Let_it_go написал:
Господа, подскажите пожалуйста как реализовать такую задачу на Луа.
1. Робот заходит на страничку с дивидендами:
http://smart-lab.ru/dividends/
   
2. Читает её
3. Формирует Луа-таблицу с полями
Тикер - дата отсечки Т+2
Тикер - дата отсечки Т+2
4. В последний день перед дивидендым гэпом посылает сообщение в КВИК.

Мои роботы на Луа никогда не читали интернет-странички и не брали из них данных. Даже не знаю с чего начать.
Спасибо за помощь.
В луа (github) есть библиотеки для работы с http. Подключайте их и читайте страницы.
Дело муторное.

Можно на языке высокого уровня написать читалку страниц и подсовывать результаты в скрипт. Это и попроще и понадежнее. Вот пример,   как это может работать
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Let_it_go написал:
Господа, подскажите пожалуйста как реализовать такую задачу на Луа.
1. Робот заходит на страничку с дивидендами:
http://smart-lab.ru/dividends/
   
2. Читает её
3. Формирует Луа-таблицу с полями
Тикер - дата отсечки Т+2
Тикер - дата отсечки Т+2
4. В последний день перед дивидендым гэпом посылает сообщение в КВИК.

Мои роботы на Луа никогда не читали интернет-странички и не брали из них данных. Даже не знаю с чего начать.
Спасибо за помощь.
Как вариант.
Вот так получите страницу,
Код
require "socket"

http = require 'socket.http'
html = http.request 'http://smart-lab.ru/dividends/'

print(html)
потом сделайте парсер .
 
local http=require'socket.http'
body,c,l,h = http.request('http://w3.impa.br/~diego/software/luasocket/http.html')
print('status line',l)
print('body',body)

Я натолкнулся на такой пример но скрипт ругается что нет файла сокет. ЛуаФорВиндовз стоит
. Пример похож как у Н.Камынина
 
Если точнее, он ругается на отсутствие этого файла
 
хм.
а если запускать через квик, пишет такое

C:\Program Files\Lua\5.1\lua\socket.lua:13: module 'socket.core' not found:
   no field package.preload['socket.core']
   no file '.\socket\core.lua'
   no file 'C:\Open_Broker_QUIK\lua\socket\core.lua'
   no file 'C:\Open_Broker_QUIK\lua\socket\core\init.lua'
   no file 'C:\Open_Broker_QUIK\socket\core.lua'
   no file 'C:\Open_Broker_QUIK\socket\core\init.lua'
   no file 'C:\Open_Broker_QUIK\Include\socket\core.lua'
   no file 'C:\Open_Broker_QUIK\Include\socket\core.luac'
   no file 'C:\Open_Broker_QUIK\LuaIndicators\socket\core.lua'
   no file 'C:\Open_Broker_QUIK\LuaIndicators\socket\core.luac'
   no file 'C:\Program Files\Lua\5.1\lua\socket\core.luac'
   no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.lua'
   no file 'C:\Program Files\Lua\5.1\lua\socket\core.lua'
   no file '.\socket\core.dll'
   no file 'C:\Open_Broker_QUIK\socket\core.dll'
   no file 'C:\Open_Broker_QUIK\loadall.dll'
   no file 'C:\Open
 
разобрался
подложил эту папку в один из путей по которым он искал.
 
Практически такой робот есть в примерах Qluacpp: https://github.com/elelel/qluacpp-tutorial/tree/master/dividend_threat
Оно на C++, но может быть, будет полезно.
 
Let_it_go,
Ваша задача немного сложнее, чем пример который я написал.
Дело в том,страница, которую вы хотите читать не содержит готовой таблицы.
Поэтому кроме парсера Вам придется исполнять джава скрипты.
-------------------
Поэтому более правильно решать вашу задачу через использование браузера в качестве ком объекта.
 
Цитата
Николай Камынин написал:
Let_it_go ,
Ваша задача немного сложнее, чем пример который я написал.
Дело в том,страница, которую вы хотите читать не содержит готовой таблицы.
Поэтому кроме парсера Вам придется исполнять джава скрипты.
-------------------
Поэтому более правильно решать вашу задачу через использование браузера в качестве ком объекта.

Эта страница - статический html. Пример выше именно ее и достает и парсит. По крайней мере, так было месяц назад, когда пример писался.
 
Цитата
El El написал:
Цитата
Николай  Камынин   написал:
 Let_it_go  ,
Ваша задача немного сложнее, чем пример который я написал.
Дело в том,страница, которую вы хотите читать не содержит готовой таблицы.
Поэтому кроме парсера Вам придется исполнять джава скрипты.
-------------------
Поэтому более правильно решать вашу задачу через использование браузера в качестве ком объекта.
Эта страница - статический html. Пример выше именно ее и достает и парсит. По крайней мере, так было месяц назад, когда пример писался.
Пример очевидно хороший для тех, кто знает CPP и и работу c make.
Полагаю, что 99% посетителей этого форума и не знают как с этим работать.
Эти особенности и есть недостатки примера.
--------------------------------------
Кроме того, пример содержит еще две особенности.
1) Скорректированная библиотека, т е недокументированная поделка.
2) Как сказано в примере: "Преобразование данных из HTML будет осуществляться для простоты "ручным" поиском строк и регулярными выражениями. В более серьезной архитектуре может применен XML-парсер и др., такой вариант оставляется читателю ручной способ поиска."
-----------------------------
Следовательно, это скорее всего - готовое частное решение, а не пример для подражания.
---------------------------------------
Полагаю, что более универсальное решение , может быть на luacom и InternetExplorer.Application.
Т е решении исключительно в рамках стандартов Майкрософт  и языка луа.
-------------------------------
 
посмотрел внимательно http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
оказалось что таблица статическая
поэтому можно прочитать ее
так
-----------------

http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
htmls = http.request(address)
------------------------
а потом
вытащить данные используя ручной способ из приведенного примера El El переписав его на луа.
 
Цитата

Кроме того, пример содержит еще две особенности.
1) Скорректированная библиотека, т е недокументированная поделка.


2) Как сказано в примере: "Преобразование данных из HTML будет осуществляться для простоты "ручным" поиском строк и регулярными выражениями. В более серьезной архитектуре может применен XML-парсер и др., такой вариант оставляется читателю ручной способ поиска."
-----------------------------
Следовательно, это скорее всего - готовое частное решение, а не пример для подражания.
---------------------------------------
Полагаю, что более универсальное решение , может быть на luacom и InternetExplorer.Application.
Т е решении исключительно в рамках стандартов Майкрософт  и языка луа.
-------------------------------
Цитата
1) Скорректированная библиотека, т е недокументированная поделка.

Это по какой логике? Скорректированные библиотеки - недокументированные поделки? Причем тут документация (кроме того, это документировано на curl и там, откуда вы это списали)?
Цитата

2) Как сказано в примере: "Преобразование данных из HTML будет  осуществляться для простоты "ручным" поиском строк и регулярными  выражениями. В более серьезной архитектуре может применен XML-парсер и  др., такой вариант оставляется читателю ручной способ поиска."
-----------------------------
Следовательно, это скорее всего - готовое частное решение, а не пример для подражания.
А это по какой логике? Готовое частное решение по чтению частной страницы smartlab.
 
Let_it_go,
Выкладываю вариант решения на луа указанной страницы сайта.

Код
require "socket"
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts={"tr","strong","span"}
local lMax=91 --число строк в таблице
--------------------
function nkdelspace(s)
   local len=string.len(s); local z=""; local x1=32;
   for i=1,len do local x=string.byte(s,i); if x<32 then x=32 end
      if (x~=32 or x1~=32) then
         if z=="" then z=string.char(x) else z=z..string.char(x) end
         x1=x; end
   end    --убираем проблелы
return z;
end
----------------------
local body = http.request(address)
----------------------
for i=1,#ts do
   body = string.gsub (body,"(<%s*"..ts[i].."[^>]*>)","")
   body = string.gsub (body,"(<%s*/"..ts[i].."[^>]*>)","")
end
body = string.gsub (body," "," ")
local t={}  -- результат
local j=0; local k=0; local text=0;
local m=1; 
local n=string.find(body,"td>",m,#body,true);
local x=string.byte(body,n-1); 
m=m+3;
-----------------
 while #body>m do
    n=string.find(body, "td>",m,#body,true);
   if n then  local n1=n;
      if x~=47 then
         x=string.byte(body,n-1); if x==47 then n=n-1; end
         text = string.sub(body, m,n-2); text = nkdelspace(text);
         local len=string.len(text);
         if len<20 then
            j=j+1; if j==1 then k=k+1; t[k]={} end
            local tt=t[k]; tt[#tt+1]=text;
            if j==8 then     if k==lMax then break end
            j=0 end
         end
      else
         x=string.byte(body,n-1);
      end
   m=n1+3;
   else break;
   end
end
Результат - таблица t . 91 элемент ( это переменная lMax).
каждый элемент - таблица из 8 элементов:
--------------------
1>table
....1 PHOR
....2 08.08.2017
....3 10.08.2017
....4 2016
....5 н/расп
....6 21
....7 2345
....8 0,9%
--------------------
..2>table
....1 GAZP
....2 18.07.2017
....3 20.07.2017
....4 2016
....5 год
....6 8,0397
....7 122,28
....8 6,6%
-----------------
и т д
 
Спасибо, Николай.
Я тут с работой раскидаю дела, сяду и всё внимательно изучу что тут в ветке появилось.
Низкий поклон за вашу помощь!
 
Цитата
Николай Камынин написал:
Let_it_go ,
Выкладываю вариант решения на луа указанной страницы сайта.
Добрый день.
Хотел использовать ваш код, но при запуске выпадает ошибка module 'socket.core' not found:

Я новичок в этой области. Прочитал, что нужна библиотека luasocket-2.0.2, скачал, разместил в папке libs. Нашел совет в сети, что нужно скопировать путь для этой папки в код. Прописал такой путь:
Код
package.path = package.path..';./libs/lua/?.lua'
package.cpath = package.cpath..';./libs/socket/?.dll;./libs/mime/?.dll'

Далее все равно вышла следующая ошибка:

Код
./libs/lua/socket.lua:13: module 'socket.core' not found:
   no field package.preload['socket.core']
   no file 'C:\Quik_Alor\lua\socket\core.lua'
   no file 'C:\Quik_Alor\lua\socket\core\init.lua'
   no file 'C:\Quik_Alor\socket\core.lua'
   no file 'C:\Quik_Alor\socket\core\init.lua'
   no file 'C:\Quik_Alor\. .\share\lua\5.3\socket\core.lua'
   no file 'C:\Quik_Alor\. .\share\lua\5.3\socket\core\init.lua'
   no file '.\socket\core.lua'
   no file '.\socket\core\init.lua'
   no file './libs/lua/socket\core.lua'
   no file 'C:\Quik_Alor\socket\core.dll'
   no file 'C:\Quik_Alor\. .\lib\lua\5.3\socket\core.dll'
   no file 'C:\Quik_Alor\loadall.dll'
   no file '.\socket\core.dll'
   no file './libs/socket/socket\core.dll'
   no file './libs/mime/socket\core.dll'
   no file 'C:\Quik_Alor\socket.dll'
   no file 'C:\Quik_Alor\. .\lib\lua\5.3\socket.dll'
   no file 'C:\Quik_Alor\loadall.dll'
   no file '.\socket.dll'
   no file './lib

У меня Квик версии 8.8.4.3 и насколько я понял, стоит lua 5.3. Я прочитал в сети, что библиотека luasocket-2.0.2 подходит только в версии 5.1. Я нашел 3 версию библиотеки тут: https://github.com/diegonehab/luasocket
Но не смог разобраться, как с ней дальше поступить. Скопировал в папку - ошибки продолжаются. Больше в сети информации никакой нет.
Помогите советом, очень охота ваш код увидеть в своем терминале.
Спасибо
 
Этот код уже очень давно не работает, потому что на смарт-лабе изменился интерфейс этой страницы. Она теперь совсем другая и не подходит под этот код.
 
Цитата
Let_it_go написал:
Она теперь совсем другая и не подходит под этот код.
У вас нет нового кода или ссылки, где можно посмотреть, как его написать?
Страницы: 1
Читают тему
Наверх