DuckDuck Go API ページにアクセスすると、API の使用に関する注意事項が表示されます。最初のメモは、次のことを明確に示しています。
これはゼロクリック情報 API であるため、ほとんどの詳細なクエリ (トピック名以外) は空白になります。
これらのフィールドのリストは次のとおりです。
Abstract: ""
AbstractText: ""
AbstractSource: ""
AbstractURL: ""
Image: ""
Heading: ""
Answer: ""
Redirect: ""
AnswerType: ""
Definition: ""
DefinitionSource: ""
DefinitionURL: ""
RelatedTopics: [ ]
Results: [ ]
Type: ""
残念なことかもしれませんが、彼らの API は一連の結果を切り捨てるだけで、結果を提供しません。おそらくより速く動作する可能性があり、 DuckDuckGo.comを使用する以外に何もできないようです。
したがって、明らかに、その場合、API は適していません。
私に関しては、duckduckgo.com から未加工の html を取得し、html5libなどを使用して解析する方法が 1 つしかありません(それらの 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 バージョンを使用する必要があることに注意してください。(URLhtml
の一部なし)。