Парсинг поисковой выдачи Google в Delphi

Cети и Интернет   6 Февраль 2012  Автор статьи: admin 

Скачать исходный код.
В этом уроке я покажу, как можно производить анализ поисковой выдачи Google. Благодаря парсингу выдачи Google по конкретным поисковым запросам можно легко отслеживать позиции вашего сайта в поиске. Это может пригодиться при анализе вашего сайта, по каким поисковым запросам его можно найти, а также для анализа конкуренции сайта.
Для начала давайте разберемся, что нам потребуется для парсинга поисковой выдачи Google. Сначала мы должы сформировать адрес веб-страницы поисковой выдачи Google. Чтобы узнать из каких составных частей состоит адрес запроса, попробуем просто ввести в поиск гугла любое слово (например слово «test») и зайдем на какую-либо по счету страницу, например на пятую. И мы увидим, что вся необходимая информация в адресной строке будет отображена следующим образом:
http://www.google.ru/search?q=test&start=40
Жирным шрифтом выделим те данные, которые мы указали поисковику. С параметром «q» вроде все понятно, мы просто передаем ему строку поискового запроса. Однако с этой строкой тоже нужно учесть один важный нюанс: все пробелы в ней должны быть предварительно заменены на знаки «+». В поисковой строке мы не видим параметра, указывающего номер страницы, зато мы видим параметр «start», в котором, очевидно, передается число, указывающее начальный номер сайта поисковой выдачи, с которого мы хотим просматривать весь результат в целом. Зная номер страницы, очень легко узнать этот самый параметр «start».
start = 10(page — 1)
Теперь реализуем достаточно простую функцию:

1
2
3
4
5
6
7
8
9
10
11
12
function ConstructRequest(text: string; page: Integer): string;
var
  i: Integer;
begin
  // сначала заменим все пробелы на знаки "+"
  for i := 1 to Length(text) do
    if text[i] = ' ' then
      text[i] := '+';
  // теперь формируем саму строку запроса
  Result := 'http://www.google.ru/search?q=' + text + '&start=' +
  IntToStr((page - 1) * 10);
end;

Теперь приступим к реализации GET-запроса, чтобы получить исходный код веб-страницы поисковой выдачи Google. Создадим функцию которая будет возвращать TStringList — массив строк.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Find(request: string): TStringList;
var
  http: TIdHTTP;
  StrSrc: string;
begin
  http := TIdHTTP.Create(Form1);
  try
    StrSrc := http.Get(request);
  except
    ShowMessage('Ошибка');
    Exit;
  end;
  http.Free;
end;

Не забудьте объявить модуль idHTTP в разделе uses.
Здесь мы создаем объект типа TidHTTP, затем осуществляем GET-запрос по заданному URL. Если произойдет какая-либо ошибка, например заданный URL не существует, то появится сообщение «Ошибка» и функция завершит свою работу.
Итак, строку (StrSrc), в которой содержится исходный код страницы мы получили. Теперь необходимо выбрать из нее необходимую информацию. Чтобы понять как выбирать эту самую информацию, короче говоря делать парсинг этой строки, изучим сам код. Предположим, мы хотим получить URL результатов выдачи Google. Посмотрим, как эти URL выглядят в HTML коде:

1
2
3
4
5
6
7
8
9
10
11
12
<li class="g"><h3 class="r"><a href="http://ссылка.info/"
onmousedown="return hlprwt(this, '/url?q=http://???.info/&amp;
sa=U&amp;ei=LngvT_-pA8iK4gS945D_DQ&amp;ved=0CBoQFjABOCg&amp;
usg=AFQjCNEf925Y75z6c6CNYBxrwqf8LiFgGQ')"

target="_blank"><b>???</b> ???<b>???</b> <b>...</b></a></h3><div class="s">
<b>???</b> ???<br>  
???<br><div><cite>???-<b>???</b>???.info/</cite><span class="flc"> -
<a href="???"
target="_blank">Сохраненная копия</a> - <a href="/search?hl=ru&amp;tbo=1&amp;
q=related:http://???.info/+???&amp;sa=X">
Похожие
 </a></span></div></div>
 </li>

Таким образом выглядит каждый элемент поисковой выдачи Google. Вопросами «???» я закрыл ненужную для нас информацию, чтобы случайно никого не прорекламировать :). А нужно нам отсюда получить ссылку «http://ссылка.info/». Поступим мы следующим образом : все что находится на странице между наборами символов <li class="g"><h3 class="r"><a href=" и " onmousedown=" и будем добавлять в список ссылок на странице. Для этого приведем вышеуказанную функцию к следующему виду:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function Find(request: string): TStringList;
var
  http: TIdHTTP;
  StrSrc: string;
  Str1, Str2, StrTmp: String;
  Pos1, Pos2, Len1, Len2: Integer;
begin
  Result:= TStringList.Create; // создаем список

  http := TIdHTTP.Create(Form1);
  try
    StrSrc := http.Get(request);
  except
    ShowMessage('Ошибка');
    Exit;
  end;
  http.Free;

  Str1 := '<li class="g"><h3 class="r"><a href="';
  // крайние левые теги для поиска
  Len1 := Length(Str1);
  Str2 := '" onmousedown="';
  // крайние правые теги для поиска
  Len2 := Length(Str2);

  Pos1 := posEx(Str1, StrSrc, 1);
  // поиск всех URL на странице, находящихся между тегами Str1 и Str2
  while Pos1 > 0 do
  begin
    Pos2 := posEx(Str2, StrSrc, Pos1 + Len1);
    if Pos2 = 0 then
      Break;
    StrTmp := Copy(StrSrc, Pos1 + Len1, Pos2 - Pos1 - Len1);
    StrTmp := Trim(StrTmp);
    Result.Add(StrTmp); // добавление найденной строки в список
    Pos1 := Pos2 + Len2;
    Pos1 := posEx(Str1, StrSrc, Pos1);
  end;
end;

В данной функции мы используем функцию PosEx из модуля StrUtils, поэтому не забудьте добавить этот модуль в раздел uses. На этом функция поиска готова. Вызовем ее внутри какого-нибудь обработчика, например так:

1
2
3
4
5
6
7
8
9
procedure TForm1.Button2Click(Sender: TObject);
var
  Str: TStringList;
begin
  Str := TStringList.Create;
  Str := Find(Edit2.text);
  Memo1.text := Str.text;
  Str.Free;
end;

И в результате мы получаем в многострочное текстовое поле Memo1 список найденных на странице ссылок.
Стоит отметить, что такой способ парсинга подходит для анализа выдачи любой другой поисковой системы, например Яндекса, Rambler и т.п. Да и вообще этот способ позволяет получить содержимое какого-либо списка на Web-странице.

[warning]Помните, что если вы будете отправлять поисковые запросы слишком часто, то Google может вас отправить в временный бан. Правда, даже если вы и попадете в такой бан — из него очень легко выйти. Достаточно просто отправить поисковый запрос через какой-нибудь браузер, т.е. просто попробовать что-нибудь поискать в гугле, и в результате вам предложат ввести капчу, после которой можно продолжать парсить, анализировать (ну или для чего вы там приспособите свою программу), пока вновь не словите бан. Хотя, если вы хотите избежать такого бана, то можете парсить какую-нибудь другую поисковую систему. А если вам нужно парсить именно Google (а бана как-то нехочеться :)), то парсите какого-нибудь партнера Google (который бан не дает и использует БД гугла), например teoma.com.[/warning]

Вы можете скачать исходный код этой программы здесь.

  • madman

    При нажатии на кнопку парсить программа просто закрывается, в чём дело?

    • http://cybern.ru/ Cyberexpert

      Прошу обратить внимание на то, что этот код может в один «прекрасный» момент перестать работать. Скорее всего, это произойдет из-за того, что в Google в очередной раз изменят код отображения результативных ссылок. Однако принцип парсинга скорее всего останется таким же, и изменятся, например, лишь, опорные подстроки для парсинга.

    • source

      уже не работает

  • madman

    При нажатии на кнопку парсить программа просто закрывается, в чём дело?

  • http://cybern.ru/ Cyberexpert

    Прошу обратить внимание на то, что этот код может в один «прекрасный» момент перестать работать. Скорее всего, это произойдет из-за того, что в Google в очередной раз изменят код отображения результативных ссылок. Однако принцип парсинга скорее всего останется таким же, и изменятся, например, лишь, опорные подстроки для парсинга.

Научиться программировать

  • на Delphi

  • на Java

  • на C++