Я уже писал ранее как очень легко можно скачать баш.
Зачем тогда нужно еще что-то, если тот код работает?
Дело в том что иногда страницы не загружаются, сервак там затупит или еще что-то печальное. И парсер виснет, ну или в лучшем случае переходит на следующий адрес. Вот и я с такой проблемой столкнулся. Можно было конечно удовлетвориться и тем что скачал, но…
Я написал полноценную процедуру, которую можно использовать почти «как есть». Лишь подкорректировав урл и номера страниц. Минус программы в том, что она парсит урлы по шаблону
адрес_сайта_всякие_параметры=1
адрес_сайта_всякие_параметры=2
К счастью основная часть динамических сайтов имеет именно такую структуру, и даже вордпресс со включенным ЧПУ можно парсить по «сайт.рф/?p=номер» (Но там есть свои сложности)
Короче код:
procedure pars;
var i:integer;
idhttppars:Tidhttp;
spisok,textik:TStringList;
begin
// инициализация
textik:= TStringList.Create;
spisok:= TStringList.Create;
idhttppars:=tidhttp.Create(nil);
idhttppars.HandleRedirects:=True;
idhttppars.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: 3.2/10 (6 votes cast)