16

編集私は今、APIが単に不十分であり、機能していないことに気づきました。質問をリダイレクトしたいのですが、「ダッキーな気分です」を使用して、duckduckgoを自動的に魔法のように検索できるようにしたいと思います。たとえば、「stackoverflow」を検索して、結果としてメインページ(「https://stackoverflow.com/」)を取得できるようにします。

私はduckduckgoAPIを使用しています。ここ

そして、私はそれを使用するときにそれを見つけました:

r = duckduckgo.query("example")

結果は手動検索を反映していません。

for result in r.results:
    print result

結果:

>>> 
>>> 

何もない。

また、インデックスをresults検索すると、空であるため、範囲外エラーが発生します。

検索結果を取得するにはどうすればよいですか?

API(文書化された例による)は質問に答え、一種の「私はダッキーだ」という形で与えることになっているようです。r.answer.text

しかし、ウェブサイトは私がそれを検索して通常の方法を使用して結果を解析することができないような方法で作られています。

このAPIまたはこのサイトの他の方法で検索結果を解析する方法を知りたいです。

ありがとうございました。

4

5 に答える 5

30

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の一部なし)。

于 2012-08-12T16:27:57.627 に答える
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
于 2012-08-19T13:54:08.400 に答える
0

アプリケーションに適している場合は、関連する検索も試してみてください

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
于 2012-08-12T18:07:51.790 に答える
0

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)
于 2017-08-16T14:39:15.400 に答える
0

試す:

for result in r.results:
    print result.text
于 2012-07-30T14:35:33.020 に答える