Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 10:52   #1
HmTH
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 47
По умолчанию Как сделать проверку ?

Добрый день, подскажите пожалуйста.

У меня есть программа - парсер. Собирает определенные ссылки, переходя со страницы вида сайт.ру/2 на сайт.ру/3 , потом на сайт.ру/4
и так ещё очень долго.

Проблема в том, что среди скажем сотни ссылок, на которую заходит программа, на одной из них она умирает, и перестаёт что либо делать.

Я хочу решить проблему следующим способом - поставить проверку, по таймеру, как давно программа заходила на ту или инную ссылку, и если она в течении 10-и секунд никуда не заходила, то перелистывает список с текущего на +1.

Программа вот так берет список ссылок
Код:
for num:=350 to 350000 do
То есть начинает с 350 , допустим так сайт.ру/350 , и каждый раз прибавляет к окончательнуму числу +1 , то есть 351, 352 и т.д.

Как сделать что бы она прибавила, если простой больше 10-и секунд не +1, а +2 и заного начала свою работу ?


Я не знаю как внятно объяснить, что бы было понятно, извините =)
HmTH вне форума Ответить с цитированием
Старый 20.10.2010, 10:58   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

С помощью таймера.
По истечению 10 секунд, прибавляешь +2. Если нет, то перезапускаешь таймер.
psycho-coder вне форума Ответить с цитированием
Старый 20.10.2010, 10:59   #3
HmTH
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
С помощью таймера.
По истечению 10 секунд, прибавляешь +2. Если нет, то перезапускаешь таймер.
Ну я как бы это знаю, и я написал что так и хочу сделать =))))
Просто я не пойму как это сделать, можешь какой-то пример дать ?)
HmTH вне форума Ответить с цитированием
Старый 20.10.2010, 11:21   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

На работе нет дельфей, а из головы что то не могу придумать.
psycho-coder вне форума Ответить с цитированием
Старый 20.10.2010, 11:58   #5
HmTH
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
На работе нет дельфей, а из головы что то не могу придумать.
Печально (
HmTH вне форума Ответить с цитированием
Старый 20.10.2010, 12:07   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

таймаут у ИнДи стоит?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.10.2010, 12:24   #7
HmTH
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
таймаут у ИнДи стоит?
Нет, я в таймерах вообще ничего не смыслю, поэтому и прошу какой-то примерный код, что бы мог понять куда двигаться.

Сейчас код кнопки выглядит так, как сделать проверку, даже понятия не имею (

Код:
procedure TThreadParser.Execute;
var
  HTTP : TIDHTTP;
  Tmp, Data : TStringList;
  i, num : Integer;
  Url, Mail, Pass, BuildID : String;
begin
  Mail  := MainForm.EditMail.Text;
  Pass := MainForm.EditPass.Text;
  Tmp := TStringList.Create;
  Data := TStringList.Create;
  HTTP := TIdHTTP.Create(nil);
  Http.AllowCookies := True;
  Http.HandleRedirects := True;
  Http.Request.Host:='jd.mail.ru';
  Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
  Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  Http.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
  Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
  Http.Request.Referer:='http://jd.mail.ru/';
  try
  // Заходим на сайт, ищем form_build_id
  Tmp.Text := HTTP.Get('http://jd.mail.ru/');
  for I:=0 to Tmp.Count-1 do
    begin
      if Pos('name="form_build_id', Tmp[i])<>0 then
        begin
          BuildID := Copy(Tmp[i], Pos('id="', Tmp[i])+4, Length(Tmp[i]));
          BuildID := Copy(BuildID, 0, Pos('"',BuildID)-1);
          MainForm.StatusBar.Panels[0].Text := 'Form Build Id найден';
        end;
    end;
  // Заходим на сайт, ищем form_build_id
  // Код захода на сайт
  Data.Add('name='+Mail);
  Data.Add('pass='+Pass);
  Data.Add('op=');
  Data.Add('form_build_id='+BuildID);
  Data.Add('form_id=user_login_block');
  HTTP.Post('http://jd.mail.ru/node?destination=user', Data);
  // Код захода на сайт
  // Теперь собираем ссылки
  i := 0; // на всякий случай =)
  Tmp.Clear; // так же очищаем
  for num:=350 to 350000 do
    begin
      TMP.Text := HTTP.Get('http://jd.mail.ru/user/'+ IntToStr(num));
      for I:=0 to Tmp.Count-1 do
        begin
          if Pos('my.mail.ru', Tmp[i])<>0 then
            begin
              Url := Copy(Tmp[i], Pos('href='#39, Tmp[i])+6, Length(Tmp[i]));
              Url := Copy(Url, 0, Pos(#39'>', Url)-2);
              MainForm.ListBoxUrl.Items.Append(Url);
            end
            else
            begin
              MainForm.StatusBar.Panels[0].Text := 'Ссылку не нашёл, продолжаю дальше';
              continue; // продолжение
            end;
          if (HTTP.ResponseCode = 404) or (HTTP.ResponseCode = 403) then
            begin
              continue;  // продолжение
            end;
        end;
    end;
  // Теперь собираем ссылки
  finally
    Tmp.Free; // освобождаем
    Data.Free;
  end;
end;
HmTH вне форума Ответить с цитированием
Старый 20.10.2010, 12:28   #8
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Что то вроде этого (пишу из головы)
Код:
 if Http.ReadTimeout := 10000 then
begin    
Http.ConnectTimeout := 10000;
inc(num);
 TMP.Text := HTTP.Get('http://jd.mail.ru/user/'+ IntToStr(num));
end;
P.S. не обесудь голова болит, так что код может быть не правильный
Помог, нажми весы слева

Последний раз редактировалось grafgrial; 20.10.2010 в 12:35.
grafgrial вне форума Ответить с цитированием
Старый 20.10.2010, 12:34   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

посмотрите в свойствах ИнДи TimeOut
и вообще по хорошему недо б try использовать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.10.2010, 12:34   #10
HmTH
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от grafgrial Посмотреть сообщение
Что то вроде этого (пишу из головы)
Код:
 if ReadTimeout := 10000 then
begin    
ConnectTimeout := 10000;
inc(num);
TMP.Text := HTTP.Get('http://jd.mail.ru/user/'+ Inttostr(num));
end;
P.S. не обесудь голова болит, так что код может быть не правильный
Извини, глупый вопрос наверное, но у меня RAD не воспринимает ConnectTimeout и ReadTimeout , на форму надо что-то добовлять ?)
HmTH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста как сделать такую проверку орфографии Irinka87 Microsoft Office Word 1 10.12.2009 09:19
Как сделать грамотно проверку на столкновение с объектом Ckomoroh Общие вопросы Delphi 3 26.10.2009 02:38
как можно сделать проверку? KARUSHEV Помощь студентам 10 13.10.2009 15:15
Как сделать проверку строк в memo Neset Общие вопросы Delphi 2 26.02.2009 12:25
Помогите проверку ввода сделать Panda Помощь студентам 3 01.07.2008 20:50