Подтвердить что ты не робот

API-интерфейс duckduckgo не возвращает результаты

Изменить Теперь я понимаю, что API просто неадекватен и даже не работает. Я хотел бы перенаправить свой вопрос, я хочу, чтобы автомагистрально искать duckduckgo, используя их "Я чувствую себя утка". Так что я могу искать "stackoverflow", например, и получить главную страницу ( "/qaru.site/..." ) в качестве результата.

Я использую API duckduckgo. Здесь

И я обнаружил, что при использовании:

r = duckduckgo.query("example")

Результаты не отражают ручной поиск, а именно:

for result in r.results:
    print result

Результаты в:

>>> 
>>> 

Ничего.

И поиск индекса в results приводит к ошибке за пределами границ, поскольку он пуст.

Как мне получить результаты для моего поиска?

Кажется, что API (согласно его документированным примерам) должен отвечать на вопросы и давать своего рода "Я чувствую себя утка" в форме r.answer.text

Но веб-сайт создан таким образом, что я не могу его искать и анализировать результаты, используя обычные методы.

Я хотел бы знать, как я должен анализировать результаты поиска с помощью этого API или любого другого метода с этого сайта.

Спасибо.

4b9b3361

Ответ 1

Если вы посетите страницу DuckDuck Go API, вы найдете несколько заметок об использовании API. В первых заметках четко сказано, что:

Поскольку это API-интерфейс с нулевым щелчком, большинство глубоких запросов (без имен имен) будет пустым.

Здесь список этих полей:

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

Так что может быть очень жаль, но их API просто обрезает кучу результатов и не дает их вам; возможно, чтобы работать быстрее, и кажется, что ничего нельзя сделать, кроме использования DuckDuckGo.com.

Итак, очевидно, что в этом случае API не путь.

Что касается меня, я вижу только один выход: извлечение raw html из DuckDuckGo.com и разбор его с использованием, например. html5lib (стоит упомянуть, что их html хорошо структурирован).

Также стоит упомянуть, что синтаксический анализ html-страниц - это не самый надежный способ обхода данных, поскольку структура html может измениться, тогда как API обычно остается стабильным до тех пор, пока изменения не будут публично объявлены.

Здесь и пример того, как может быть такой синтаксический анализ, достигнутый с помощью BeautifulSoup:

from BeautifulSoup import BeautifulSoup
import urllib
import re

site = urllib.urlopen('http://duckduckgo.com/?q=example')
data = site.read()

parsed = BeautifulSoup(data)
topics = parsed.findAll('div', {'id': 'zero_click_topics'})[0]
results = topics.findAll('div', {'class': re.compile('results_*')})

print results[0].text

Этот script печатает:

u'Eixample, an inner suburb of Barcelona with distinctive architecture'

Проблема прямого запроса на главной странице заключается в том, что он использует JavaScript для получения требуемых результатов (не связанных с ними тем), поэтому вы можете использовать HTML-версию для получения результатов. Версия HTML имеет другую ссылку:

Посмотрим, что мы можем получить:

site = urllib.urlopen('http://duckduckgo.com/html/?q=example')
data = site.read()
parsed = BeautifulSoup(data)

first_link = parsed.findAll('div', {'class': re.compile('links_main*')})[0].a['href']

Результат, хранящийся в переменной first_link, является ссылкой на первый результат (не связанный поиск), который выдает поисковые системы:

http://www.iana.org/domains/example

Чтобы получить все ссылки, вы можете перебирать найденные теги (другие данные, кроме ссылок, могут быть получены аналогичным образом)

for i in parsed.findAll('div', {'class': re.compile('links_main*')}):
    print i.a['href']

http://www.iana.org/domains/example
https://twitter.com/example
https://www.facebook.com/leadingbyexample
http://www.trythisforexample.com/
http://www.myspace.com/leadingbyexample?_escaped_fragment_=
https://www.youtube.com/watch?v=CLXt3yh2g0s
https://en.wikipedia.org/wiki/Example_(musician)
http://www.merriam-webster.com/dictionary/example
...

Обратите внимание, что версия только для HTML содержит только результаты, а для соответствующего поиска вы должны использовать версию JavaScript. (без ссылки html в URL-адресе).

Ответ 2

После того, как я уже получил ответ на свой вопрос, который я принял и дал щедрость, я нашел другое решение, которое я хотел бы добавить здесь для полноты. И большое спасибо всем, кто помог мне достичь этого решения. Несмотря на то, что это не то решение, о котором я просил, он может помочь кому-то в будущем.

Нашел после долгой и трудной беседы на этом сайте и с некоторыми почтовыми сообщениями поддержки: https://duck.co/topic/strange-problem-when-searching-intel-with-my-script

И вот код решения (из ответа в теме, опубликованной выше):

>>> import duckduckgo
>>> print duckduckgo.query('! Example').redirect.url
http://www.iana.org/domains/example

Ответ 3

Try:

for result in r.results:
    print result.text

Ответ 4

Если это подходит вашему приложению, вы также можете попробовать соответствующие поисковые запросы

r = duckduckgo.query("example")
for i in r.related_searches:
    if i.text:
        print i.text

Это дает:

Eixample, an inner suburb of Barcelona with distinctive architecture
Example (musician), a British musician
example.com, example.net, example.org, example.edu  and .example, domain names reserved for use in documentation as examples
HMS Example (P165), an Archer-class patrol and training vessel of the British Royal Navy
The Example, a 1634 play by James Shirley
The Example (comics), a 2009 graphic novel by Tom Taylor and Colin Wilson

Ответ 5

Для пользователей python 3 транскрипция кода @Rostyslav Dzinko:

import re, urllib
import pandas as pd
from bs4 import BeautifulSoup

query = "your query"
site = urllib.request.urlopen("http://duckduckgo.com/html/?q="+query)
data = site.read()
soup = BeautifulSoup(data, "html.parser")

my_list = soup.find("div", {"id": "links"}).find_all("div", {'class': re.compile('.*web-result*.')})[0:15]


(result__snippet, result_url) = ([] for i in range(2))

for i in my_list:         
      try:
            result__snippet.append(i.find("a", {"class": "result__snippet"}).get_text().strip("\n").strip())
      except:
            result__snippet.append(None)
      try:
            result_url.append(i.find("a", {"class": "result__url"}).get_text().strip("\n").strip())
      except:
            result_url.append(None)