Существует ли API для ящиков ответов Google?

Коды ответов Google (иногда называемые Featured Snippets, Knowledge Cards или Live Results) чрезвычайно полезны. Я хотел бы извлечь информацию и использовать ее в своей собственной программе. Глядя на код HTML, это не так прямо, как оттягивание оттуда. Я провел немало исследований, но я не могу найти поддержки для них. Кто-нибудь знает, есть ли API (или часть API веб-поиска), где вы можете получить информацию, возвращаемую из окна ответов?

Я увидел ответ здесь: google api для славного информационного окна? , но представленное решение было устаревшим в прошлом месяце.

введите описание изображения здесь

Только для примера, это HTML-код для "Какое время в Японии":

<!--m--><div data-hveid="30">      
<div class="vk_c vk_gy vk_sh card-section _MZc">  
<div class="vk_bk vk_ans">6:37 AM</div> 
<div class="vk_gy vk_sh"> Tuesday, <span class="_Hq">August 4, 2015</span>  
<span class="_Hq"> (GMT+9) </span>  
</div> <span class="vk_gy vk_sh">  Time in Japan  </span> 

Что ОЧЕНЬ отличается от "где находится токио":

<!--m-->
<div class="_uX kno-fb-ctx" aria-level="3" role="heading" data-hveid="41" data-ved="0CCkQtwcoATACahUKEwiLjemg8I3HAhUTKYgKHU7jCho">
<div class="_eF" data-tts="answers" data-tts-text="Japan">Japan</div>
<div class="_Tfc">
</div></div>
<!--n-->
</li><li class="mod" data-md="61" style="clear:none">
<!--m-->
<div class="_oDd" data-hveid="42">
<span class="_Tgc _y9e">Tokyo consists of the southwestern part of the Kanto region, the <b>Izu Islands</b>, and the <b>Ogasawara Islands</b>. Tokyo is the capital of <b>Japan</b>, and the place where over 13 million people live, making it one of the most populous cities in the world.</span></div>

Мне по существу нужно извлечь "6:37 AM" из первого и "Япония" из второго, но выполнить динамический поиск строк будет сложно, поскольку они находятся в самых разных форматах.

Ответ 1

Я провел много исследований, и кажется, что в настоящее время нет ничего подобного, как вы описали. Нет ничего, что могло бы получить информацию от Google Searches.

Единственное, что я мог подумать, это альтернатива - получать информацию через RSS (http://www.w3schools.com/xml/xml_rss.asp) и реализовать это в программе каким-то образом.

Ответ 2

Существует мгновенный ответ api, доступный из DuckDuckGo, который я использовал в прошлом, который работает очень хорошо. Ответы не столь надежны, как google, но это хороший старт.

https://duckduckgo.com/api

Api выглядит так в ответ JSON.

{
Abstract: ""
AbstractText: ""
AbstractSource: ""
AbstractURL: ""
Image: ""
Heading: ""
Answer: ""
Redirect: ""
AnswerType: ""
Definition: ""
DefinitionSource: ""
DefinitionURL: ""
RelatedTopics: [ ]
Results: [ ]
Type: ""
}

Надеюсь, это поможет!

Ответ 3

Немного поздно, но вот рабочее решение в 2017 году, которое использует Python и Selenium (с безголовым хронографом) для извлечения "основного" текста из окна ответа на основе того факта, что форматирование страницы поиска и поле ответа достаточно согласовано между различными типами запросов (хотя я не тестировал это исчерпывающе). Конечно, координаты элемента могут меняться в зависимости от размера разрешения/окна, но регулировка для этого достаточно просто.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--window-size=1024x768")
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)

def ask_google(query):

    # Search for query
    query = query.replace(' ', '+')

    driver.get('http://www.google.com/search?q=' + query)

    # Get text from Google answer box

    answer = driver.execute_script("""return 
    document.elementFromPoint(arguments[0], arguments[1]);""", 350, 230).text

    return answer

И тестирование этого подхода с вашими запросами (или рядом с ними) вызывает:

ask_google("what is the time in Japan")

"4:36 PM"

ask_google("where is tokyo located in japan")

"Situated on the Kanto Plain, Tokyo is one of three large cities, the other two being Yokohama and Kawasaki, located along the northwestern shore of Tokyo Bay, an inlet of the Pacific Ocean on east-central Honshu, the largest of the islands of Japan."