Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 99

Парсер сайтов без графического интерфейса

24.09.2013, 01:15. Показов 1412. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Я хотел бы написать парсер сайтов при помощи WinAPI. Моя цель - парсить определенную информацию с сайта, но при этом мне не нужен графический интерфейс и программа должна иметь не большой вес.Я запускаю программу, она заходит на определенный сайт, парсит и выводит все в текстовый документ. Как мне это осуществить? что нужно просмтреть и изучить? Заранее благодарен
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2013, 01:15
Ответы с готовыми решениями:

Компоненты графического интерфейса (Lazarus)
Провёл поиск по разделам, ничего не нашёл особо похожего. Листаю книгу по Lazarus и параллельно пишу небольшую программу. Решил её сделать...

Создание графического интерфейса для программы
Есть программа const n=6; var mas: array of integer; i,j: byte; chislo: integer; usl: boolean; begin randomize; ...

Удалённое управление смартфоном без стандартного графического интерфейса
Здравствуйте. Есть у меня старый и уже несколько тормозной смартфон Alcatel One Touch S'POP 4030D. И задумал я превратить его в нечто на...

9
{c0Der}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
27.09.2013, 13:58
Цитата Сообщение от na6tena Посмотреть сообщение
парсер сайтов при помощи WinAPI
Не буду спрашивать зачем, но учитыая что в WinApi нет функций парсинга как таковых, по сути все использование винапи сводится к скачиванию страницы...
Т.о. это WinSock + дальнейшая обработка полученной информации (в моем видении сабжа=)
Ну или WinInet, но это уже не винапи по сути.

Добавлено через 2 часа 15 минут
Накидал пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
program WinApiParser;
uses Windows,WinSock,SysUtils,RegExp;
const _n=#13#10; _nn=_n+_n; _t=#9;
 
////////////////////////////////////////////////////////////////////////////////FUNCS>>>
 
function getHttp(url,page:string; ip:string=''):string;
var
  info:WSADATA;
  sin:sockaddr_in;
  hostent:pHostEnt;
  sHwnd:integer;
  s,t:string;
  sBuff,rBuff:array[0..65535]of char;
  hostname:array[0..255]of char;
  addr:pchar;
  p:word;
begin try
  if url='' then url:=ip;
  WSAStartup(makeword(1,1),info);
  if ip='' then try
    gethostname(hostname,sizeof(hostname));
    strpcopy(hostname,url);
    hostent:=gethostbyname (hostname);
    if assigned(hostent)then begin
     if assigned(hostent^.h_addr_list)then begin
       addr:=hostent^.h_addr_list^;
       if assigned(addr)then begin
         ip:=format('%d.%d.%d.%d',[byte(addr[0]),byte(addr[1]),byte(addr[2]),byte(addr[3])]);
       end;
     end;
    end;
  except ip:='';end;
  sHwnd:=Socket(AF_INET,SOCK_STREAM,0);
  sin.sin_family:=AF_INET;
  sin.sin_port:=htons(80);
  sin.sin_addr.S_addr:=inet_addr(pchar(ip));
  connect(sHwnd, sin, sizeof(sin));
  s:='GET /'+page+' HTTP/1.1'+_n+'User-Agent: ManualSender/1.0'+_n+'Host: '+url+_nn;
  CopyMemory(@sBuff,pchar(s),length(s));
  send(sHwnd,sBuff,length(sBuff),0);
  recv(sHwnd,rBuff,length(rBuff),0);
  t:=string(rBuff);
  CloseSocket(sHwnd);
  WSACleanup;
  p:=pos(_nn,t);
  if p>0 then t:=copy(t,p+length(_nn),length(t)-p-length(_nn)+1);
  p:=pos(_n,t);
  if p>0 then t:=copy(t,p+length(_n),length(t)-p-length(_n)+1);
  result:=t;
except result:='';end;end;
 
function pow(k:cardinal;s:byte):cardinal;{k^s}
var i:byte;
begin
  result:=1;
  for i:=1 to s do result:=result*k;
end;
 
function HexCh(c:char):byte;
begin
  if c in['0'..'9']then result:=ord(c)-$30
    else result:=ord(c)-$37;
end;
 
function HexToInt(s:string;def:cardinal=0):cardinal;
var k,n:byte;
begin
  result:=def;
  if length(s)<1 then exit;
  if s[1]in['#','$']then delete(s,1,1);
  if length(s)>8 then setLength(s,8);
  while length(s)<8 do s:='0'+s;
  s:=upperCase(s);
  for k:=1 to 4 do begin
    n:=HexCh(s[k*2-1])*16+HexCh(s[k*2]);
    result:=result+n*pow(16,(4-k)*2);
  end;
end;
 
function strRpl(s,s1,s2:string):string;
var i:word;r:string;
begin
  i:=pos(s1,s);
  r:='';
  while i>0 do begin
    r:=r+copy(s,1,i-1)+s2;
    delete(s,1,i+length(s1)-1);
    i:=pos(s1,s);
  end;
  result:=r+s;
end;
 
function chrcodez(s:string):string;
const chs='&#';
var i,k,d:word; r,c:string; hex:boolean;
begin
  i:=pos(chs,s);
  r:='';
  while i>0 do begin
    c:='';
    hex:=false;
    for k:=i+length(chs)to length(s)do begin
      d:=k-i-length(chs);
      if(s[k]in['0'..'9'])then c:=c+s[k] else
      if(s[k]in['A'..'F','a'..'f'])then begin
        c:=c+s[k];
        hex:=true;
      end else break;
    end;
    if length(c)>0 then begin
      if hex then c:=chr(HexToInt(c,$32))
        else c:=chr(StrToIntDef(c,$32));
      inc(d);
    end else d:=0;
    r:=r+copy(s,1,i-1)+c;
    delete(s,1,i+length(chs)-1+d);
    i:=pos(chs,s);
  end;
  result:=r+s;
end;
 
function stripTags(s:string):string;
var re:tRegExpr;
begin
  re:=tRegExpr.Create;
  s:=strRpl(s,'&nbsp;',' ');
  s:=strRpl(s,'<br>',_n);
  s:=strRpl(s,'<br/>',_n);
  s:=strRpl(s,'</div>',_n);
  s:=strRpl(s,'<hr>',_n+'----------------------------------'+_n);
  s:=strRpl(s,'<div class="message">',':~:');
  re.Expression:='\<td class\=\"ln\"\>\<pre[^\<]+';
  s:=re.Replace(s,':~:'+_n);
  re.Expression:='\<[^\>]+\>';
  s:=re.Replace(s,'');
  re.Expression:='[\ \t\f]+';
  s:=re.Replace(s,' ');
  re.Expression:='[\ \t\f]*[\n\r]+';
  s:=re.Replace(s,_n);
  re.Expression:='[\n\r\f]{2,99}';
  s:=re.Replace(s,_nn);
  re.Expression:='[\s]*\:\~\:[\s]*';
  s:=re.Replace(s,':'+_n+' ');
  re.Free;
  s:=chrCodez(s);
  s:=strRpl(s,'&quot;','"');
  result:=s;
end;
 
////////////////////////////////////////////////////////////////////////////////<<<FUNCS
 
type
  tPost=record
    num:word;
    date,user,title,post:string;
  end;
  tPosts=array of tPost;
var ps:tPosts;
 
procedure addPost(data:string);
var re:tRegExpr; k:word;
begin
  re:=tRegExpr.Create;
  re.Expression:='\<\/a\>[\s\t\n]*([\d\.]+\,\s[\d\:]+)[\s\t\n]*\<.*id\=\"postcount[^\<]+\<strong\>(\d+).*bigusername\"\>'+
  '([^\<]+).*\<strong\>([^\<]+).*\_message\_[^\>]+\>[\s\t\n]*(.*)\<\/div\>';
  if not re.Exec(data)then begin
    re.Free;
    exit;
  end;
  k:=length(ps);
  setLength(ps,k+1);
  ps[k].date:=re.Match[1];
  ps[k].num:=StrToIntDef(re.Match[2],0);
  ps[k].user:=re.Match[3];
  ps[k].title:=re.Match[4];
  ps[k].post:=re.Match[5];
  re.Free;
end;
 
var page,parsed,f:string; tx:textFile; r:tRegExpr; k,m:word; b:boolean;
begin
  try
    page:=getHttp('www.cyberforum.ru','delphi-winapi/thread943408.html');
    parsed:='';
    k:=pos('<div id="posts">',page);
    if k>0 then page:=copy(page,k+16,length(page)-k-15);
    k:=pos('<div id="lastpost">',page);
    if k>0 then page:=copy(page,0,k-1);
    r:=tRegExpr.Create;
    b:=true;
    while b do begin
      r.Expression:='\<table id\=\"post(\d+)';
      b:=r.Exec(page);
      if not b then break;
      r.Expression:='\<table id\=\"post'+r.Match[1]+'(.*)post\_thanks\_box\_'+r.Match[1];
      b:=r.Exec(page);
      if not b then break;
      addPost(r.Match[1]);
      page:=r.Replace(page,'');
    end;
    r.Free;
  except parsed:='Error: '+inttostr(GetLastError);end;
  m:=length(ps);
  if m>0 then for k:=m-1 downto 0 do begin
    parsed:=parsed+_n+'---------------------------------------------------------'+
    _n+'Ïîñò ¹'+inttostr(ps[k].num)+'  ('+ps[k].date+') îò: '+ps[k].user+_n+
    '<<< '+ps[k].title+' >>>'+_n+stripTags(ps[k].post)+_n;
  end;
  f:=changeFileExt(paramStr(0),'.log');
  assignFile(tx,f);
  rewrite(tx);
  writeln(tx,parsed);
  closeFile(tx);
  winExec(pchar('notepad.exe "'+f+'"'),SW_SHOWMAXIMIZED);
  halt;
end.
Цитата Сообщение от na6tena Посмотреть сообщение
программа должна иметь не большой вес
Если запаковать - вес 33КБ
можно и меньше конечно, если отказаться от RegExp и SysUtils модулей, код оптимизировать/почистить и все такое)) можно даже выпотрошить System или вырезать все необходимое в код проекта, но зачем лишние сложности себе создавать?) Да и я в упор не вижу зачем парсеру маленький вес =)
2
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 99
27.09.2013, 21:24  [ТС]
Благодарю. Вопрос по похожей теме, как , например, сделать, чтоб этот парсер открывал java скрипт и выполнял его?

Добавлено через 2 минуты
и php
0
{c0Der}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
27.09.2013, 21:53
Цитата Сообщение от na6tena Посмотреть сообщение
как , например, сделать, чтоб этот парсер открывал java скрипт и выполнял его?
Добавлено через 2 минуты
и php
написать свой интерпретатор или использовать какую-нибудь библиотеку
или забить на маленький размер и перейти на tWebBrowser (js он обрабатывает)

а вот насчет php - не совсем понял, зачем парсеру уметь обрабатывать СЕРВЕРНЫЕ скрипты?)))
может вы имели ввиду то, что парсер должен открывать адреса вида "http://xxx.php" ?)) Так это с самим php никак не связано)) php - это скрипты выполняемые на стороне сервера и "отдающие" пользователю HTML страницу (ну или txt/xml/jpg...)
0
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 99
27.09.2013, 22:20  [ТС]
Цитата Сообщение от Markus_13 Посмотреть сообщение
написать свой интерпретатор или использовать какую-нибудь библиотеку
а можно поподробней?
Цитата Сообщение от Markus_13 Посмотреть сообщение
а вот насчет php - не совсем понял, зачем парсеру уметь обрабатывать СЕРВЕРНЫЕ скрипты?)))
прошу прощения за мою неосведомленность, т.е. если php работает на сервере, то в делфи можно будет обработать результат выполения?
0
{c0Der}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
27.09.2013, 22:38
Цитата Сообщение от na6tena Посмотреть сообщение
прошу прощения за мою неосведомленность, т.е. если php работает на сервере, то в делфи можно будет обработать результат выполения?
Цитата Сообщение от Markus_13 Посмотреть сообщение
php - это скрипты выполняемые на стороне сервера и "отдающие" пользователю HTML страницу (ну или txt/xml/jpg...)
"https://www.cyberforum.ru/search.php" к примеру

Цитата Сообщение от na6tena Посмотреть сообщение
а можно поподробней?
можно, но не думаю что мое более подробное объяснение вам что-то даст))
я не люблю отправлять людей в гугл, но помоему это ваш случай) вы, судя по всему, даже элементарных базисов не знаете, т.ч. начинать с написания парсеров не стоит (имхо)
0
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 99
27.09.2013, 23:15  [ТС]
Цитата Сообщение от Markus_13 Посмотреть сообщение
я не люблю отправлять людей в гугл
в гугл слазить не страшно. Я не знаю как мне правильно подобрать запрос.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.09.2013, 23:27
Цитата Сообщение от na6tena Посмотреть сообщение
в гугл слазить не страшно. Я не знаю как мне правильно подобрать запрос
Вот так, например: Парсинг от А до Я
0
1 / 1 / 0
Регистрация: 13.09.2013
Сообщений: 99
28.09.2013, 00:01  [ТС]
*я имею в виду про
Цитата Сообщение от Markus_13 Посмотреть сообщение
написать свой интерпретатор или использовать какую-нибудь библиотеку
0
{c0Der}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
28.09.2013, 00:17
Цитата Сообщение от na6tena Посмотреть сообщение
я имею в виду про
Сообщение от Markus_13
написать свой интерпретатор или использовать какую-нибудь библиотеку
ну например так для начала: "что такое интерпретатор?"
потом можно поискать так: "Delphi запуск js-скриптов", "Delphi интерпретатор javascript", "Delphi компоненты для обработки javascript"
можно так: "что такое DLL" -> "Delphi импорт функций из DLL" -> "библиотеки для запуска javascript", "DLL для интерпретации javascript"
Думаю основной принцип понятен) от меньшего к большему)

Добавлено через 2 минуты
+ я думаю стоит также разобраться что вообще такое javascript: как он выглядит хотя бы)) где/для чего применяется и т.д.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2013, 00:17
Помогаю со студенческими работами здесь

Построение графического интерфейса
Здравствуйте, Вот само задание Необходимо построить имитационную модель одноканальной СМО с отказами (по вариантам в табл. 3). СМО...

Создание графического интерфейса
Всем привет! Подскажите, как создаются приложения с графическим интерфейсом? Например, та же Visual Studuo. Я сколько не ищу, ничего...

Организация графического интерфейса
Реализовать графический интерфейс, используя заданный framework WPF для задачи из файла ImageProcessing То есть, есть реализация...

Подключение графического интерфейса
Начал делать масштабный проект через консольное приложение, с мыслью &quot;вот сейчас наберусь опыта в кодописании, а потом просто подключу...

Создание графического интерфейса
Дали задание написать матричный калькулятор.Я вроде с этим справился теперь нужен интерфейс для неё .раньше никогда не делал.использую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru