Ответ 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 имеет другую ссылку:
- http://duckduckgo.com/?q=example # версия JavaScript
- http://duckduckgo.com/html/?q=example # Версия только для 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
, является ссылкой на первый результат (не связанный поиск), который выдает поисковые системы:
Чтобы получить все ссылки, вы можете перебирать найденные теги (другие данные, кроме ссылок, могут быть получены аналогичным образом)
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-адресе).