Архивы

Пример парсинга вопросов с labs.wordtracker.com (Synapse, Delphi)

2010-03-10 08:52
Сегодня выкроила время для углубленного изучения Synapse. Только, к сожалению, провела его не очень продуктивно.Первым делом посмотрела наработки Сергея (либу IngHTTPSend), предложенные им в комментарии к моей первой статье о Synapse. Безусловно, у него в обертку включены очень полезные функции (в том числе уделено большое внимание кодировкам). Но у каждого программиста есть еще ряд функций, которые он таскает с собой в голове и дописывает к любым своим либам :) Например, у меня есть некоторые заморочки по поводу хэдеров запросов. Я обычно создаю несколько функций для формирования заголовков с одинаковым названием, но с разным набором входных параметров. Например, в функцию может передаваться UserAgent, а может и не передаваться (если не передается, то берется случайный из списка возможных). Обработчики кодов ответа (в частности, 3XX) я тоже обычно выношу.А потом пришла к выводу, что ни для чего глубокомысленного я сегодня не готова, глянула в списочек ссылок ресурсов, подходящих для демонстрации написания простейших парсеров, и решила поместить в блоге пример с кодом парсера вопросов с http://labs.wordtracker.com/keyword-questions/.Ресурс Wordtracker.com я уже брала в качестве подопытного для иллюстрирования возможностей cURL.Вопросы будем добывать с использованием Synapse.Исследую запрос на сайте. Как видно, это обычный GET-запрос, с ним никаких сложностей не будет. Ввожу слово и исследую html-код для составления регулярки. Регулярные выражения я всегда тестирую с использованием самописной утилитки, о которой я уже писала на блоге.Создаю простую форму, на которой Edit1 - для ввода ключевого слова, SG - TStringGrid для вывода результатов.Листинг кода получается следующий:procedure TMainF.btnGETClick(Sender: TObject);var HTTP : THTTPSend; Res : boolean; S : string; RE : TRegExp; mc : MatchCollection; m : Match; sm : SubMatches; i : integer;begin HTTP := THTTPSend.Create; HTTP.UserAgent:= GetRandomUseragent; try Res := HTTP.HTTPMethod( GET , http://labs.wordtracker.com/keyword-questions/questions seed= +Edit1.Text+ commit=Search ); if Res then begin case HTTP.Resultcode of 200 : begin S := StreamToString(HTTP.Document); RE := TRegExp.Create(nil); try RE.Multiline := true; RE.Global := true; RE.IgnoreCase := true; RE.Pattern := lt;tr.* gt; x0D x0A + lt;td.* gt; x0D x0A + d* x0D x0A + lt;/td gt; x0D x0A + lt;td gt;(.* ) lt;/td gt; x0D x0A + lt;td.* gt;( d*) lt;/td gt; x0D x0A + lt;/tr gt; ; mc := RE.Execute(S) as MatchCollection; if mc.Count 0 then begin for i := 0 to mc.Count - 1 do begin m := mc i as Match; sm := m.SubMatches as SubMatches; SG.RowCount:=SG.RowCount+1; SG.Cells 0,i+1 := VarToStr(sm 0 ); SG.Cells 1,i+1 := VarToStr(sm 1 ); end; end; finally RE.Free; end; end; end; end finally HTTP.Free; end;end;где:function StreamToString(aStream: TStream): string;var SS: TStringStream;begin if aStream lt; gt; nil then begin SS := TStringStream.Create( ); try aStream.Position := 0; SS.CopyFrom(aStream, aStream.Size); Result := SS.DataString; final...
Продолжить чтение...