(Обновление 2024-03-01: следующий вопрос ввел в заблуждение. Об этой ошибке уже было сообщено разработчику, и я нашел обходной путь. См. комментарии)
Я пишу сценарий для запуска API пользовательского поиска Google для получения результатов поиска. Когда я запускаю следующий скрипт, мне удается получить результат.
#! /bin/perl
# minisearch.pl
use strict;
use warnings;
use WWW::Google::CustomSearch;
use Data::Dumper;
use feature qw(say);
my $engine = WWW::Google::CustomSearch->new(
api_key => 'my api key',
cx => 'my search engine ID',
dateRestrict => 'm3',
#siteSearch => 'accesswire.com',
#siteSearchFilter => 'i'
);
my $result = $engine->search('mobile+pc+linux');
exit unless defined $result;
say "kind: ", $result->kind;
say "totalResults: ", $result->totalResults;
say "formattedTotalResults: ", $result->formattedTotalResults;
say "formattedSearchTime: ", $result->formattedSearchTime;
say "searchTime: ", $result->searchTime;
say "url_template: ", $result->url_template;
say "url_type: ", $result->url_type;
say "";
say "request:";
say "REQUEST:\n", Dumper $result->request;
say "";
say ">>> 10 pages >>>\n";
for my $n (1..2) {
say "=== PAGE $n ";
say "ITEMS:\n", Dumper $result->items;
say "";
sleep 10;
$result = $result->nextPage->fetch;
}
Но когда я использую параметры siteSearch
и siteSearchFilter
для ограничения целевых сайтов, это не удается.
my $engine = WWW::Google::CustomSearch->new(
api_key => 'my api key',
cx => 'my search engine ID',
dateRestrict => 'm3',
siteSearch => 'accesswire.com',
siteSearchFilter => 'i'
);
Отображается следующее сообщение об ошибке.
$ ./miniSearch.pl Отсутствуют обязательные аргументы: totalResults в Строка /usr/local/share/perl/5.30.0/WWW/Google/CustomSearch/Request.pm 30.
Я добавил хеш-запись totalResults в новую, как показано ниже.
my $engine = WWW::Google::CustomSearch->new(
api_key => 'my api key',
cx => 'my search engine ID',
dateRestrict => 'm3',
siteSearch => 'accesswire.com',
siteSearchFilter => 'i',
totalResults => 1000,
);
или ниже.
my $engine = WWW::Google::CustomSearch->new(
api_key => 'my api key',
cx => 'my search engine ID',
dateRestrict => 'm3',
siteSearch => 'accesswire.com',
siteSearchFilter => 'i',
totalResults => '1000',
);
Но ошибка остаётся прежней.
Кто-нибудь знает, как это решить?
Ошибка возникает из-за создания объекта Page. Объекты страниц создаются на основе ответов. Итак, похоже, что раньше Google возвращал поле, которое он больше не возвращает, и модули ожидают, что это поле будет присутствовать в ответе. Сообщите об ошибке.
Кто-то сообщил об этой проблеме по запросам без результатов. Может, оставить там комментарий?
Вы знаете, что в вашем хэш-назначении стоит висящая запятая?
@Bork, Запятые в конце - это нормально. (И их использование — моя любимая практика.)
@ikegami Ты прав. Мой вопрос выше ввел в заблуждение: (неправильно) Если вы используете хеш-ключ siteSearch, поиск завершится с ошибкой Missing.... (справа) Если количество найденных сайтов равно нулю, поиск завершится с ошибкой Missing....
Когда я запускаю приведенный ниже код: my $engine = WWW::Google::CustomSearch->new( api_key => 'мой ключ API', cx => 'идентификатор моей поисковой системы', dateRestrict => 'm3', ); # Следующие слова не были найдены при веб-поиске Google my $result = $engine->search('no_ such_words_are_there_foo_bar_baz_'); Код не выполнен с той же ошибкой.
На данный момент я воспользовался этим обходным путем: my $result; eval {$result = $engine->search('no_search_result_found_foo_bar'); }; if ($@) { сказать «нет результатов поиска»; Выход; } Для меня это нормально. Спасибо.
Я подтвердил, что модуль исправлен и теперь возвращает понятный результат, даже если результат равен НУЛЮ. Metacpan.org/release/MANWAR/WWW-Google-CustomSearch-0.40 Спасибо!
Будучи автором WWW::Google::CustomSearch, я просто предложил предложенное исправление соответствующей проблемы.
https://rt.cpan.org/Ticket/Display.html?id=141609
В версии 0.40 есть исправление.
https://metacpan.org/release/MANWAR/WWW-Google-CustomSearch-0.40
Благодаря вашему обновлению я подтвердил, что модуль работает нормально и возвращает дружественный результат, даже если количество просматриваемых страниц равно нулю.
Я подозреваю, что это немного вводит в заблуждение. Я думаю, возможно, он говорит о том, что результат не имеет параметра totalResults. Теперь я смутно понимаю, что если это последняя страница результатов (или только одна страница), возможно, она ее не содержит. Так что это может быть проблема с реализацией Perl. Посмотрите, можете ли вы отладить фактический запрос, какой ответ поступает и есть ли там TotalResults.