Процедура чтобы грабить.

Я уже писал ранее как очень легко можно скачать баш.

Зачем тогда нужно еще что-то, если тот код работает?

Дело в том что иногда страницы не загружаются, сервак там затупит или еще что-то печальное. И парсер виснет, ну или в лучшем случае переходит на следующий адрес. Вот и я с такой проблемой столкнулся. Можно было конечно удовлетвориться и тем что скачал, но…

Я написал полноценную процедуру, которую можно использовать почти «как есть». Лишь подкорректировав урл и номера страниц. Минус программы в том, что она парсит урлы по шаблону

адрес_сайта_всякие_параметры=1
адрес_сайта_всякие_параметры=2

К счастью основная часть динамических сайтов имеет именно такую структуру, и даже вордпресс со включенным ЧПУ можно парсить по «сайт.рф/?p=номер» (Но там есть свои сложности)

Короче код:

procedure pars;
var i:integer;
idhttppars:Tidhttp;
spisok,textik:TStringList;
begin

// инициализация

textik:= TStringList.Create;
spisok:= TStringList.Create;
idhttp
pars:=tidhttp.Create(nil);
idhttp
pars.HandleRedirects:=True;
idhttp
pars.ReadTimeout := 3000;

if FileExists(‘papka/’)= false then // Задаем название папки куда будем сохранять скачанные страницы
mkdir(‘papka’);

for i:=1 to 1000 do // здесь задаем циферки
begin
spisok.Append(inttostr(i));
end;

// конец инициализайции.

i:=-1;
while i <  spisok.Count-1  do
begin
i:=i+1;
//form1.button1.Caption:= inttostr(i)+’/’+inttostr(spisok.Count-1); // Это индикатор выполнения. Если хотите подставьте вместо батон1, что нибудь другое и раскомментируйте строку.
application.ProcessMessages;
if FileExists(‘papka/’+spisok[i]) then
begin
spisok.Delete(i);
i:=i-1;
end
else
begin
try

textik.Text:=idhttppars.Get(‘урл=’+spisok[i]); // Здесь конструируем адрес страницы
textik.SaveToFile(‘papka/’+spisok[i]);
except   end;
end;
end;
idhttppars.Free ;
textik.Free;
i:=spisok.Count-1;
//form1.Memo1.Lines:=spisok;  // это один из инструментов отладки и наблюдения за работой процедуры можно удалить, можно наблюдать.
spisok.Free;

if i < 1 then application.Terminate else pars; // в конце парсинга процедура вызывает закрытие проги, если вы этого не хотите, то удалите  вызов application.Terminate

end;

Не забудьте добавить в uses модуль IdHTTP, если его там еще нет.

Конечно можно упростить например вынести инициализацию и освобождение в отдельные части, но тогда это удобнее всего делать в классе формы. То есть переменные описать там где описываются общие переменные формы, инициализацию и первичное заполнение массива ( я их даже обозначил для вашего удобства) можно в tform1.FormCreate засунуть. А саму процедуру вызывать например с кнопки и в ней написать:

pars;
idhttppars.Free ;
textik.Free;
spisok.Free;

Соответственно убрав эти три строки из тела процедуры. Но мне захотелость сделать именно в виде автономной процедуры 🙂


Автор: Elsper.ru


VN:F [1.9.14_1148]
Rating: 0.0/10 (0 votes cast)

3 thoughts on “Процедура чтобы грабить.

  1. Поддерживаю, главное от проги, что б она работала.
    Для себя ведь пишется и, если чё, дебаггить надо будет в том, что натворил ))

    Я тут на днях кодил в MS Visual Studio, а сейчас на Delphi. Разница в удобстве новой среды разработки действительно чувствуется.

    Я уже подумывал версию Делфи поновее поставить, но для D7 столько плагинов стоит…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Спoнcopcкиe ссылки