API duckduckgo не возвращает результаты

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

Я использую API duckduckgo. Вот

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

r = duckduckgo.query("example")

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

for result in r.results:
    print result

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

>>> 
>>> 

Ничего такого.

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

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

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

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

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

Спасибо.

6 ответов

Решение

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

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

Вот список этих полей:

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

Так что это может быть жаль, но их API просто усекает кучу результатов и не дает их вам; возможно, работать быстрее, и кажется, что ничего не может быть сделано, кроме как с помощью http://duckduckgo.com/.

Таким образом, очевидно, что в этом случае API - не тот путь.

Что касается меня, я вижу только один выход: извлечь необработанный html из http://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

Этот скрипт печатает:

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. (vithout html часть в URL).

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

Найден после долгого и тяжелого разговора на этом сайте и с некоторыми письмами поддержки: 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

Пытаться:

for result in r.results:
    print result.text

Для пользователей 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)

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

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

К сожалению, как многие уже заметили, не-JS версия DuckDuckGo: http://duckduckgo.com/html/?q=example, не имеет расширенных результатов, которые вы могли бы найти в активной версии («Похожие поиски», «Последние новости» и т. д.).

Если вы хотите получить ПОЛНЫЕ результаты DuckDuckGo, вам нужно будет сделать запрос на https://links.duckduckgo.com/d.js.

Я дал более подробный ответ здесь о том, как я построил парсер для SerpApi.

Другие вопросы по тегам