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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2010, 20:55   #1
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию Автопарсер гугла, пофиксить баги

Здраствуйте. Нужно разобраться с багами, прога ведет себя странно. Суть такая - ложим список запросов, жмем и в большое поле парсяца линки по этим запросам. Берется 1й запрос, парсит 10 линков, листает страницу, еще 10 и так до 100 или пока не окнчатся страницы, после этого берем 2й кеи и повторяется то что выше. Ну и на ходу удаляет дубли по домену. Проблемы такие - парсилось, напарсено более 1к линков, 3й кеи по счету, потом все линки удаляются и парсит дальше, 5й кеи - напарсено линков 30-40..куда пропали хз. Бывает останавливается посреди списка и ничего не делает. Ну и результаты когда спарсено не пишет "готово" почемуто. Бывает парсит и тоже в середине списка останавливается, в дебагере пишет поток остановлен. Бан тоже непонятно когда бывает. Таймаур перед перелистыванием страницы рандом от 10 до 30 сек, и куки чистит постоянно. Седня спарсило много потом бан был..1 раз всего. При 5 секундном таймауте бан моментальный. ВОбщем, подскажите, изза чего криво работает, код простейший не могу найти что криво.

процедура удаления дублей

Код:
procedure TMain.DelDuplicat(Inp: TStrings);  // поиск и удаление дубликатов файлов
var
  i:integer;
  j:integer;
  {ii:Integer;}
  Buf0:string;
  Buf1:string;
begin
 if Inp=nil then Exit;
 if Inp.Count <= 0 then Exit;
 Inp.BeginUpdate;     // чистим список
   try
 for I:=Inp.Count-1 DownTo 0 Do
   begin
     Buf0 := AnsiUpperCase(Inp.Strings[i]);  // строка для сравнения
   if PosEx('/',Buf0,9){Pos('/', Buf0)} > 0 then       // берём название домена
    Buf0 := Copy(Buf0, 1, PosEx('/', Buf0,9));    // ищим похожие строки
    for J:=I-1 Downto 0 do
      begin
        Buf1 := AnsiUpperCase(Inp.Strings[J]);
        if Pos(Buf0, Buf1) > 0 then    // проверка совпадения
          begin
            Inp.Delete(J);
          end;
      end;
    end;
   finally
 Inp.EndUpdate;
  end;
end;

procedure TAutoParsing.Execute;    //автопарсинг
var
  i:integer;
  page:string;
  load:string;
  url:string;
  ps:integer;
  slp:integer;
  j:integer;
  dork:string;
begin
  Main.ProgressBar1.Max:=100;
  Main.DorkMuch.Caption:='Запросов: '+IntToStr(Main.Keywords.Lines.Count+1);
  if j=Main.Keywords.Lines.Count then      //если j=последнему запросу в списке, то пишем "готово"
    Main.StatusBar1.Panels[10].Text:='Готово';
  for j:=0 to Main.Keywords.Lines.Count do     //цикл парсинга, работает столько раз, сколько запросов Keywords.Lines
    begin
      dork:=Main.Keywords.Lines[j];   //присваиваем переменной первый запрос
      Main.ParsingNow.Caption:='Парсится: '+IntToStr(j+1);
      for i:=0 to 100 do
        begin
          Main.IdCookieManager1.CookieCollection.Clear;  //чистим куки
          Main.ProgressBar1.Position:=i;
          page:=IntToStr(i*10);
          Main.StatusBar1.Panels[1].Text:=IntToStr(i+1);
          Main.StatusBar1.Panels[10].Text:='Выполняется...';
          load:=Main.IdHTTP1.Get('http://www.google.'+Main.Zone.Text+'/search?hl=en&q='+dork+'&start='+page+'&filter=0');  //грузим страничку
          if Pos('re sorry...</h1>',load) <> 0 then   //распарсиваем, и если находим надпись, то значит это страница бана, стопаем цикл и пишем "бан"
            begin
              Main.StatusBar1.Panels[10].Text:='Бан IP!';
              break;
            end;
            while Pos('<h3 class="r"><a href',load) <> 0 do begin   //если все норм, то парсим линки
              load:=copy(load,pos('<h3 class="r"><a href=',load)+23,length(load));
              url:= copy(load,0,pos('class',load)-3);
              Main.AutoParsedLinks.Lines.Add(url);
            end;
          Main.Parse.Enabled := False;
            try
              Main.DelDuplicat(Main.AutoParsedLinks.Lines); // удаляем дубли по домену
            finally
          Main.Parse.Enabled := True;
          ps:=Pos('Next</span>',load);  //если не находим это, то значит страниц больше нет и стоп
          if ps=0 then
            begin
              Main.StatusBar1.Panels[10].Text:='Готово';
              break;
            end;
          Main.StatusBar1.Panels[3].Text:=IntToStr(Main.AutoParsedLinks.Lines.Count);
          Randomize;
          slp:=Random(20000)+10000;
          Sleep(slp);
        end;
        Randomize;
          slp:=Random(80000)+40000;
          Sleep(slp);
        end;
      end;
   end;
gamer123 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу отключить блок от гугла sma777 HTML и CSS 1 06.07.2010 14:32
Не могу отключить блок от гугла sma777 JavaScript, Ajax 2 04.07.2010 14:27
Киньте пример граббера линков опред. запросов с гугла на делфи zotox Помощь студентам 0 03.09.2009 15:19