Найти в Дзене
Makadoo

Delphi парсер новостей с сайта

В этой статье напишем парсер новостей с сайта. Код конечно можно было оптимизировать например процедурами или функциями. Все писалось на скорую руку. Если будут проблемы с SSL попробуйте установить https://disk.yandex.ru/d/pY3vi7PhtmdJRg Запускаем Delphi создаем VCL Appplication. Новости будем брать тут https://oblast45.ru/news Кидаем на форму memo, image, idhttp, button. Первым делом нам нужно получить ссылку на самую верхнюю новость на сайте. Для этого нам нужно получить HTML страницы со списком новостей. Создаем глобальную переменную HTML в разделе Var типа String. HTML:string; Двойным щелчком по Button1 создаем обработчик событий OnClick. Помещаем HTML сайта в переменную HTML //получаем HTML страницы html:=idhttp1.Get('https://oblast45.ru/news'); // выводим в мемо memo1.Text:=html; Запускаем нажимаем на Button1 смотрим, что получилось. Заходим на сайт жмем на самую первую новость ПКМ и в меню выбираем просмотреть код. В появившемся окне видим ссылку на новость В моем случае эт

В этой статье напишем парсер новостей с сайта. Код конечно можно было оптимизировать например процедурами или функциями. Все писалось на скорую руку.

Если будут проблемы с SSL попробуйте установить
https://disk.yandex.ru/d/pY3vi7PhtmdJRg

Запускаем Delphi создаем VCL Appplication.

-2
Новости будем брать тут https://oblast45.ru/news

Кидаем на форму memo, image, idhttp, button.

-3

Первым делом нам нужно получить ссылку на самую верхнюю новость на сайте. Для этого нам нужно получить HTML страницы со списком новостей. Создаем глобальную переменную HTML в разделе Var типа String.

HTML:string;
-4

Двойным щелчком по Button1 создаем обработчик событий OnClick.

Помещаем HTML сайта в переменную HTML

-5
//получаем HTML страницы
html:=idhttp1.Get('https://oblast45.ru/news');
// выводим в мемо
memo1.Text:=html;

-6

Запускаем нажимаем на Button1 смотрим, что получилось.

-7

Заходим на сайт жмем на самую первую новость ПКМ и в меню выбираем просмотреть код.

-8

В появившемся окне видим ссылку на новость

-9
В моем случае это <a href="/publication/39353"></a>

Теперь нам нужно (спарсить) вытащить из кучи HTML кода в мемо ссылку на новость. Возвращаемся в делфи и создаем еще одну глобальную переменную URLNews типа String.

HTML,URLNews:string;
-10

В button дописываем

// помещаем HTML в переменную
URLNews:=html;
// Убираем лишнее
delete(URLNews,1,pos('/publication/',URLNews));
delete(URLNews,(pos('>',URLNews)-2),URLNews.Length);
// подставляем полученный адрес новости в переменную
URLNews:='https://oblast45.ru/'+URLNews;
// выводим в memo для проверки
memo1.Text:=URLNews;
-11

Запускаем жмем на кнопку смотрим что получилось

-12

Ссылку на последнюю новость мы получили теперь нужно получить HTML страницы с новостью и распарсить его.

Пока писал статью добавились новые новости

Дописываем в кнопку

// получаем HTML новости
html:=idhttp1.Get(URLNews);
// выводим в мемо
memo1.Text:=html;
-13

Запускаем смотрим что получилось

-14

На скриншоте видно, что в теге title написан заголовок новости.

Для него так же создаем переменную Zag:string;

-15

Помещаем HTML в переменную Zag и парсим тег title

Дописываем в кнопку

// заполняем переменную для парсинга
Zag:=html;
// удаляем лишнее
delete(Zag,1,pos('<title>',Zag)+6);
delete(Zag,(pos('</title>',Zag)),Zag.Length);
// выводим в мемо
memo1.Text:=Zag;
-16

вот, что у нас получилось.

Теперь нужно получить ссылку на картинку. Создаем так же переменную imgUrl.

-17

Помещаем в нее HTML и парсим. Все как и с заголовком только с небольшими изменениями.

На странице с новостью жмем на правую кнопку мыши по картинке из новости и в появившемся меню посмотреть код.

-18
В моем случае картинка лежит тут /uploads/publications/images/

Дописываем в кнопку

// заполняем переменную для парсинга
imgUrl:=html;
// удаляем лишнее
delete(imgUrl,1,pos('/uploads/publications/images/',imgUrl));
delete(imgUrl,(pos('"',imgUrl)),imgUrl.Length);
imgUrl:='https://oblast45.ru/'+imgUrl;
// выводим в мемо
memo1.Text:=imgUrl;
-19

Теперь нам нужно получить текст новости с сайта. Создаем еще одну переменную Content

-20

Делаем все тоже самое только сразу удалим часть расшареного кода.

// заполняем переменную для парсинга
Content:=html;
// удаляем лишнее
delete(Content,1,pos('/uploads/publications/images/',Content));
delete(Content,1,pos('publication__desc',Content)+18);
delete(Content,(pos('</div>',Content)),Content.Length);
// выводим в мемо
memo1.Text:=Content;

Запускаем смотрим

-21

Обратите внимание я специально оставил теги может быть такая ситуация , что в новости будут присутствовать теги в середине контента. А так же могут быть спецсимволы например

&laquo;Область 45&raquo;

В данном случае это кавычки. Вот как выглядит новость на сайте

-22

Теперь о том как это обойти можно найти в интернете.

например тут https://www.cyberforum.ru/delphi-beginners/thread1163412.html

Для удаления тегов можно воспользоваться таким методом создаем 3 переменные

tmp: string;   p1,p2: Cardinal;
-23

В кнопку дописываем

// очистить текст от тегов  
tmp:= Memo1.Text;  
while (pos('<',tmp) <> 0) or (pos('>',tmp) <> 0) do  
begin    
p1:= pos('<',tmp);    
p2:= pos('>',tmp);    
if p1 = 0 then Delete(tmp,p2,1) else    
if p2 = 0 then Delete(tmp,p1,1) else    
if p2 > p1 then Delete(tmp,p1,p2-p1+1)      
else Delete(tmp,p2,1);   end;  
Memo1.Text:= tmp;

-24

Ну а заменить спец символы на кавычки можно дописав в кнопку:

tmp := StringReplace(tmp, '&laquo;', '<<',[rfReplaceAll, rfIgnoreCase]);
tmp := StringReplace(tmp, '&raquo;', '>>',[rfReplaceAll, rfIgnoreCase]);
Memo1.Text:= tmp;
-25

после запуска получим

-26

Теперь качаем картинку URL которой мы получили.

Создаем 2 переменные

Stream: TMemoryStream;       jpeg: TJPEGImage;
В Uses дописываем jpeg
-27

в кнопку дописываем

// качаем картинку
Stream:=TMemoryStream.Create;
jpeg:=TJPEGImage.Create;
try
idhttp1.Get(imgUrl,Stream);
Stream.Position:=0;
jpeg.LoadFromStream(Stream);
if FileExists(ExtractFilePath(Application.ExeName)+'img.jpeg') then
begin
DeleteFile(ExtractFilePath(Application.ExeName)+'img.jpeg');
jpeg.SaveToFile('img.jpeg');
//showmessage('Yes!')
end
else
begin
//showmessage('No!');
jpeg.SaveToFile('img.jpeg')
end;
finally
jpeg.Free;
Stream.Free;
idhttp1.Free;
end;
image1.Stretch:=true;
Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'img.jpeg');

-28

И последний штрих допишем в кнопку

memo1.Text:=Zag+#13#10+tmp+#13#10+'Взято в сайта '+URLNews;
-29

Запускаем жмем на кнопку и вуаля!

-30

Исходник тут
https://disk.yandex.ru/d/VKCh8sqWn108fg