Поиск по блогу

среда, 12 ноября 2008 г.

Парсинг и загрузка аватаров с сайтов аватаров (Delphi)

Расскажу, как напарсить аватаров.

Аватары можно парсить откуда угодно: с форумов, из дневников... Но самый простой способ — взять их с сайтов аватаров (благо, таких развелось море).

Задача разделяется на 2 подзадачи:
1. Напарсить ссылок на страницы с аватарами;
2. Напарсить аватары с этих страниц.

Первая подзадача мне уже не интересна. Я писала в блоге о том, как находить ссылки на сайте. Просто берем сайт с аватарами, смотрим, как организована пагинация, составляем регулярное выражения для парсинга ссылок (как правило, в разделах вывод разбит на страницы). На выходе получаем список ссылок, который и используем на следующем шаге.

Переходим ко второй подзадаче. Парсить аватары можно по-разному. Можно для каждого сайта составлять отдельное регулярное выражение, учитывая особенности записи значения SRC в тэге IMG. Этот способ несложный, но все-таки трудозатратный: придется анализировать код страниц всех ресурсов. Второй способ — скачать все картинки со страницы, а потом отфильтровать по заданному диапазону размеров.

Для начала нарисуем интерфейс и подберем какое-нибудь более-менее "универсальное" регулярное выражение для парсинга картинок.

Интерфейс у меня вышел следующий:

парсинг аватаров

"Общее" регулярное выражение взяла такое:

<img[^>]* src=\"([^\"]*(?:gif|jpg|png))\"[^>]*>

Жесткое указание расширения (gif, jpg, png) избавит от скачивания картинок, генерируемых скриптами (счетчиков и т.д.).

Для примера я взяла простенький сайт. SRC картинок у них там абсолютные. Это значит, что если вы захотите сделать что-нибудь уж совсем универсальное, то вам надо будет предусмотреть, чтобы скачивание картинки, у которой сорс будет указан как, например ../../imgs/1.gif, а сама страница загружается по адресу http://site.com/humor/1/ — было правильным. То есть анализировать все это и составлять правильную ссылку http://site.com/humor/imgs/1.gif.

Ну и естественно, при сохранении файла в директорию на локальной машине надо проверить, нет ли там уже файла с таким названием. Если есть — добавить суффикс "_N", где N — число по порядку (я это в примере не реализовала).

Обработчик нажатия кнопки "Сохранить" у меня получился такой:

procedure TMainF.Button1Click(Sender: TObject);
var
i, j : integer;
PicLinkStr,
LinkStr : String;
SLBody : TStringList;
currBody,
UTF8Str,
sPicFileName,
sFileName,
sRegExp,
Ext : string;
RE : TRegExp;
mc : MatchCollection;
sm : SubMatches;
mm : Match;
w,h : word;
begin
for i := 0 to Memo1.Lines.Count-1 do
begin
// загрузка страницы
LinkStr := Memo1.Lines[i];
// загружаем страницу
try
SLBody:=TStringList.Create;
RE := TRegExp.Create(Self);

sFileName:=ExtractFilePath(Application.ExeName) + 'cache.txt';
if DownloadFile(LinkStr,sFileName) then
SLBody.LoadFromFile(sFileName);
currBody:=SLBody.Text;
UTF8Str := UTF8ToAnsi(currBody);
DeleteFile(sFileName);

if RadioButton1.Checked then
sRegExp := edRegExpr.Text
else
sRegExp := '<img[^>]* src=\"([^\"]*(?:gif|jpg|png))\"[^>]*>';

// ищутся и скачиваются изображения
RE.Pattern := sRegExp;
RE.Global := true;
RE.IgnoreCase := true;
RE.Multiline := true;

mc := RE.Execute(UTF8Str) as MatchCollection;

// сохраняются все изображения
for j := 0 to mc.Count-1 do
begin
mm := mc[j] as Match;
sm := mm.SubMatches as SubMatches;
PicLinkStr := sm.Item[0];

sPicFileName:=edDir.Text + ExtractPicName(PicLinkStr);

if DownloadFile(PicLinkStr,sPicFileName) then
begin
// если по размерам - проверяем размеры
if RadioButton2.Checked then
begin
Ext := UpperCase( ExtractFileExt(sPicFileName) );
if Ext = '.GIF' then
GetGIFSize(sPicFileName, w, h);

if Ext = '.JPG' then
GetJPGSize(sPicFileName, w, h);

if Ext = '.PNG' then
GetPNGSize(sPicFileName, w, h);

if (w < seWidthFrom.Value) or
(w > seWidthTo.Value) or
(h < seHeightFrom.Value) or
(h > seHeightTo.Value) then
DeleteFile(sPicFileName);
end;
// если по регулярке - сохраняем все

end;
end;
finally
begin
SLBody.Free;
RE.Free;
end;
end;
end;

end;


Процедуры для определения размеров картинок GetGIFSize и т.д. берем в интернете и не паримся. Например, я взяла отсюда.

Все, нажимаем на кнопку и получаем результат! Сейчас у нас будут аватары для создания армии пользователей! %D

P.S. Выражаю огромную благодарность SEOCoder-у за размещение ссылки на мой блог! Результаты мне очень понравились ;) Буду потихоньку вылазить со своим блогом и искать новых читателей. Может, кто-нибудь хочет обменяться ссылками? Вэлкам!

Статьи схожей тематики:



4 комментария:

  1. Ага - я седня бек уже и с личного дневника получил ;)

    ОтветитьУдалить
  2. А есть типа такого парсинга на PHP? Собственно что бы не только картинки вырезал, но вообще HTML парсил

    ОтветитьУдалить
  3. Michael, я думаю, что готовые скрипты обязательно у кого-нибудь есть. Но у меня точно нет, я с PHP плотно не работаю... Если, конечно, встанет задача, то решить смогу, но все-таки для меня это пока не актуально.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться