Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Obtener datos de una web (https://www.clubdelphi.com/foros/showthread.php?t=91912)

oscarac 01-06-2017 20:29:21

Obtener datos de una web
 
buenas tardes
Asi como dice el titulo, estube indagando en el foro, pero no encontré nada concreto

La Superintendencia Nacional de Administracion Tributaria de Peru, mas conocida como SUNAT (ese nombre da miedo aqui), tiene una web, donde dia a dia (dependiendo del mes escogido) muestra el tipo de cambio, quisiera saber si hay una forma de extraer en una tabla, registro, texto, o lo que sea, al informacion de determinado dia

tengo esto avanzado, hasta ahi nomas llegan mis conocimientos

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, ComCtrls, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    pnl1: TPanel;
    Button1: TButton;
    wb1: TWebBrowser;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  wb1.Navigate('http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias');
end;

end.

la idea es colorar un edit con una fecha (numero) y que se busque ese dato y se extraiga el tipo de cambio compra y venta, se que alguien tiene mejores ideas, asi que los escucho
gracias

oscarac 02-06-2017 00:17:11

lo hice de esta manera
Código Delphi [-]
unit frmSunat_f;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, ComCtrls, StdCtrls, ExtCtrls, ActiveX,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    pgc1: TPageControl;
    pnl1: TPanel;
    Button1: TButton;
    wb1: TWebBrowser;
    IdHTTP1: TIdHTTP;
    mmo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  idhttp : TIdHTTP;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var _documento1, _Documento2 : WideString;
begin
  wb1.Navigate('http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  idhttp := TIdHTTP.Create(nil);
  mmo1.Text := idhttp.Get('http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias');
  IdHttp.free;
end;

end.

se puede identificar la tabla con los elementos que contiene via delphi?
esta parte es la que me interesa, se que puedo buscar un texto y de ahi ir tanteando, pero pense que habria alguna otra forma?

Cita:


DESDE AQUI


<td width='4%' align='center' class="H3">
<strong>1</strong>
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>



<td width='4%' align='center' class="H3">
<strong>2</strong>
</td>

<td width='8%' align='center' class="tne10">
2.570
</td>

<td width='8%' align='center' class="tne10">
2.572
</td>



<td width='4%' align='center' class="H3">
<strong>5</strong>
</td>

<td width='8%' align='center' class="tne10">
2.577
</td>

<td width='8%' align='center' class="tne10">
2.577
</td>



<td width='4%' align='center' class="H3">
<strong>6</strong>
</td>

<td width='8%' align='center' class="tne10">
2.576
</td>

<td width='8%' align='center' class="tne10">
2.577
</td>



</tr>
<tr>


<td width='4%' align='center' class="H3">
<strong>7</strong>
</td>

<td width='8%' align='center' class="tne10">
2.576
</td>

<td width='8%' align='center' class="tne10">
2.577
</td>



<td width='4%' align='center' class="H3">
<strong>8</strong>
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>

<td width='8%' align='center' class="tne10">
2.579
</td>



<td width='4%' align='center' class="H3">
<strong>9</strong>
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>

<td width='8%' align='center' class="tne10">
2.579
</td>



<td width='4%' align='center' class="H3">
<strong>11</strong>
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>

<td width='8%' align='center' class="tne10">
2.579
</td>



</tr>
<tr>


<td width='4%' align='center' class="H3">
<strong>13</strong>
</td>

<td width='8%' align='center' class="tne10">
2.578
</td>

<td width='8%' align='center' class="tne10">
2.579
</td>



<td width='4%' align='center' class="H3">
<strong>14</strong>
</td>

<td width='8%' align='center' class="tne10">
2.570
</td>

<td width='8%' align='center' class="tne10">
2.572
</td>



<td width='4%' align='center' class="H3">
<strong>15</strong>
</td>

<td width='8%' align='center' class="tne10">
2.567
</td>

<td width='8%' align='center' class="tne10">
2.567
</td>



<td width='4%' align='center' class="H3">
<strong>16</strong>
</td>

<td width='8%' align='center' class="tne10">
2.569
</td>

<td width='8%' align='center' class="tne10">
2.570
</td>



</tr>
<tr>


<td width='4%' align='center' class="H3">
<strong>19</strong>
</td>

<td width='8%' align='center' class="tne10">
2.573
</td>

<td width='8%' align='center' class="tne10">
2.574
</td>



<td width='4%' align='center' class="H3">
<strong>20</strong>
</td>

<td width='8%' align='center' class="tne10">
2.582
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>



<td width='4%' align='center' class="H3">
<strong>21</strong>
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>



<td width='4%' align='center' class="H3">
<strong>22</strong>
</td>

<td width='8%' align='center' class="tne10">
2.585
</td>

<td width='8%' align='center' class="tne10">
2.586
</td>



</tr>
<tr>


<td width='4%' align='center' class="H3">
<strong>23</strong>
</td>

<td width='8%' align='center' class="tne10">
2.582
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>



<td width='4%' align='center' class="H3">
<strong>26</strong>
</td>

<td width='8%' align='center' class="tne10">
2.582
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>



<td width='4%' align='center' class="H3">
<strong>27</strong>
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>

<td width='8%' align='center' class="tne10">
2.583
</td>



<td width='4%' align='center' class="H3">
<strong>28</strong>
</td>

<td width='8%' align='center' class="tne10">
2.580
</td>

<td width='8%' align='center' class="tne10">
2.581
</td>



AgustinOrtu 02-06-2017 01:02:58

Yo primero intentaria investigar si hay algun servicio web que puedas consumir para obtener la informacion que necesitas.. parsear el contenido de una pagina en HTML puede ser muy tedioso, ademas de que cambian cada dos por tres. Es el equivalente a intentar escanear una interfaz de usuario de una aplicacion de escritorio buscando texto que esta en edits o listviews, por decir algo; cuando en realidad lo ideal seria que haya un servicio que te permita recuperar los datos directamente desde la BD, por ejemplo.

wilcg 02-06-2017 22:47:41

Yo también estoy pensando implementar esto en mi aplicación, lo único que he podido encontrar ejemplos en otros lenguajes C#, Vb y java pero no en delphi.
Revisa este enlace esta en C#, si en algo puede servirte como orientación es bueno http://r3xet.blogspot.pe/2013/12/obt...sunat-del.html

Saliendome un poco del tema, no se porque hay tan poco o nada de donde aprender mas sobre algunas cosas en delphi con respecto a otros lenguajes que basta con buscar en google y hay mucho de donde tirar.

roman 02-06-2017 23:14:56

Cita:

Empezado por oscarac (Mensaje 517533)
lo hice de esta manera
se puede identificar la tabla con los elementos que contiene via delphi?
esta parte es la que me interesa, se que puedo buscar un texto y de ahi ir tanteando, pero pense que habria alguna otra forma?

Aquí te va una solución. Pero toma en cuenta lo que comenta AgustinOrtu porque tan pronto cambien el formato de salida, tendrías que alterar tu código.

Estoy suponiendo que tu formulario contiene un component IdHTTP y un ListView. Defines entonces el método

Código Delphi [-]
TForm1 = class(TForm)
public
  procedure Consulta(Anio, Mes: String);
end;

Este método consultará el año y mes indicados (como cadenas) y llenará el ListView con los datos obtenidos:

Código Delphi [-]
uses ActiveX, MSHTML, DateUtils;

const
  URL = 'http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias';

procedure TForm1.Consulta(Anio, Mes: String);
var
  Params: TStrings;
  Response: String;
  Documento: OleVariant;
  Tablas: OLeVariant;
  Tabla: OleVariant;
  Fila: OleVariant;
  Celda: OleVariant;
  Item: TListItem;
  I, J: Integer;

begin
  lvwDatos.Clear;

  // Obtenemos la página (esto es necesario porque si no se hace, el POST que sigue falla)
  IdHTTP.Get(URL);

  // Efectuamos el POST con los parámetros requeridos
  Params := TStringList.Create();
  Params.Values['anho'] := Anio;
  Params.Values['mes'] := Mes;

  try
    Response := IdHTTP.Post(URL, Params);
  finally
    Params.Free;
  end;

  // Creamos un documento HTML con los datos obtenidos
  Documento := coHTMLDocument.Create as IHTMLDocument;
  Documento.Write(Response);
  Documento.Close();

  // Obtenemos la tabla con los datos
  Tablas := Documento.getElementsByTagName('table');
  Tabla := Tablas.item(1);

  // Recorremos la tabla y llenamos el ListView
  for I := 1 to Tabla.rows.length - 1 do
  begin
    Fila := Tabla.rows.item(I);

    for J := 0 to (Fila.cells.length div 3) - 1 do
    begin
      Item := lvwDatos.Items.Add;

      Celda := Fila.cells.item(3*J);
      Item.Caption := Trim(Celda.innerText);

      Celda := Fila.cells.item(3*J + 1);
      Item.SubItems.Add(Trim(Celda.innerText));

      Celda := Fila.cells.item(3*J + 2);
      Item.SubItems.Add(Trim(Celda.innerText));
    end;
  end;
end;

LineComment Saludos

oscarac 05-06-2017 19:53:02

muchas gracias Roman

supongo que lvwdatos es una ListView, agregue ese componente lo he ejecutado pero solo me captura los numeros de las fechas

oscarac 05-06-2017 20:40:10

y cuando le agrego el mes y año al URL
// Obtenemos la página (esto es necesario porque si no se hace, el POST que sigue falla)
URL := 'http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias?mes=' + mes + '&anho='+ Anio;

Aqui me aparece un error Access Violation
Tablas := Documento.getElementsByTagName('table');

wilcg 05-06-2017 23:54:13

Cita:

Empezado por oscarac (Mensaje 517722)
y cuando le agrego el mes y año al URL
// Obtenemos la página (esto es necesario porque si no se hace, el POST que sigue falla)
URL := 'http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias?mes=' + mes + '&anho='+ Anio;

Aqui me aparece un error Access Violation
Tablas := Documento.getElementsByTagName('table');

Probé el codigo de roman y funciona muy bien, tienes que llamar la funcion algo asi:

ejemplo:
Código Delphi [-]
2017 = AÑO

01   = ENERO
02   = FEBRERO
03   = MARZO
04   = ABRIL
05   = MAYO
06   = JUNIO
.........  ........?
Llamar la función
Código Delphi [-]
Consulta(2017,06);
Des este modo no tendrás errores.

oscarac 06-06-2017 17:11:33

Si funciona, pero como dije aparecen solo los titulos de los dias y no los tipos de cambio

roman 06-06-2017 22:02:36



LineComment Saludos

oscarac 06-06-2017 22:40:51

podrias colgar en el ftp la fuente porfa?

oscarac 03-07-2017 23:17:20

Segun pienso (y me corrigen si estoy equivocado)

Código Delphi [-]
Tablas := Documento.getElementsByTagName('table');

"Captura"los elementos de una Tabla, pero y si quisiera saber que otros componentes hay (formularios, listbox, etc), como podria hacer un listado o identificar los componentes en una web ???

se entiende mi duda?

chelard 28-02-2018 19:23:42

Cita:

Empezado por oscarac (Mensaje 517801)
Si funciona, pero como dije aparecen solo los titulos de los dias y no los tipos de cambio

Estimado Oscarac,
La solución funciona bien, para que te recupere todos los datos verifica que en la propiedad ViewStyle del ListView este en vsReport.
me funcionó haciendo ese cambio.
Saludos

oscarac 09-10-2018 19:23:31

Estimado Roman

estoy retomando este tema
tendrias la fuente del ejemplo que pusiste?

oscarac 09-10-2018 20:39:33

ya funciona
tuve que colocar la siguiente instruccion para que salga bien

Código Delphi [-]
  lvwDatos.Columns.add;


La franja horaria es GMT +2. Ahora son las 17:01:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi