В этой статье напишем парсер новостей с сайта. Код конечно можно было оптимизировать например процедурами или функциями. Все писалось на скорую руку.
Если будут проблемы с 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 смотрим, что получилось.
Заходим на сайт жмем на самую первую новость ПКМ и в меню выбираем просмотреть код.
В появившемся окне видим ссылку на новость
В моем случае это <a href="/publication/39353"></a>
Теперь нам нужно (спарсить) вытащить из кучи HTML кода в мемо ссылку на новость. Возвращаемся в делфи и создаем еще одну глобальную переменную URLNews типа String.
HTML,URLNews:string;
В 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;
Запускаем жмем на кнопку смотрим что получилось
Ссылку на последнюю новость мы получили теперь нужно получить HTML страницы с новостью и распарсить его.
Пока писал статью добавились новые новости
Дописываем в кнопку
// получаем HTML новости
html:=idhttp1.Get(URLNews);
// выводим в мемо
memo1.Text:=html;
Запускаем смотрим что получилось
На скриншоте видно, что в теге title написан заголовок новости.
Для него так же создаем переменную Zag:string;
Помещаем HTML в переменную Zag и парсим тег title
Дописываем в кнопку
// заполняем переменную для парсинга
Zag:=html;
// удаляем лишнее
delete(Zag,1,pos('<title>',Zag)+6);
delete(Zag,(pos('</title>',Zag)),Zag.Length);
// выводим в мемо
memo1.Text:=Zag;
вот, что у нас получилось.
Теперь нужно получить ссылку на картинку. Создаем так же переменную imgUrl.
Помещаем в нее HTML и парсим. Все как и с заголовком только с небольшими изменениями.
На странице с новостью жмем на правую кнопку мыши по картинке из новости и в появившемся меню посмотреть код.
В моем случае картинка лежит тут /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;
Теперь нам нужно получить текст новости с сайта. Создаем еще одну переменную Content
Делаем все тоже самое только сразу удалим часть расшареного кода.
// заполняем переменную для парсинга
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;
Запускаем смотрим
Обратите внимание я специально оставил теги может быть такая ситуация , что в новости будут присутствовать теги в середине контента. А так же могут быть спецсимволы например
«Область 45»
В данном случае это кавычки. Вот как выглядит новость на сайте
Теперь о том как это обойти можно найти в интернете.
например тут https://www.cyberforum.ru/delphi-beginners/thread1163412.html
Для удаления тегов можно воспользоваться таким методом создаем 3 переменные
tmp: string; p1,p2: Cardinal;
В кнопку дописываем
// очистить текст от тегов
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;
Ну а заменить спец символы на кавычки можно дописав в кнопку:
tmp := StringReplace(tmp, '«', '<<',[rfReplaceAll, rfIgnoreCase]);
tmp := StringReplace(tmp, '»', '>>',[rfReplaceAll, rfIgnoreCase]);
Memo1.Text:= tmp;
после запуска получим
Теперь качаем картинку URL которой мы получили.
Создаем 2 переменные
Stream: TMemoryStream; jpeg: TJPEGImage;
В Uses дописываем jpeg
в кнопку дописываем
// качаем картинку
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');
И последний штрих допишем в кнопку
memo1.Text:=Zag+#13#10+tmp+#13#10+'Взято в сайта '+URLNews;
Запускаем жмем на кнопку и вуаля!
Исходник тут
https://disk.yandex.ru/d/VKCh8sqWn108fg