編集私は今、API が単に不十分で、機能していないことに気づきました。質問をリダイレクトしたいと思います。duckduckgo の「I'm feeling ducky」を使用して自動的に検索できるようにしたいのです。たとえば、「stackoverflow」を検索してメイン ページ ("https://stackoverflow.com/結果としては「」となりました。
私はduckduckgo APIを使用しています。ここ
そして、私は次のことを発見しました:
r = duckduckgo.query("example")
結果は手動検索を反映していません。具体的には次のようになります。
for result in r.results:
print result
結果:
>>>
>>>
何もない。
インデックスを検索すると、results
空であるため範囲外エラーが発生します。
どうすれば検索結果が得られるのでしょうか?
APIは(文書化された例によると)質問に答え、次のような形で「気分がいい」ということを示すことになっているようです。r.answer.text
しかし、このウェブサイトは、通常の方法では検索したり結果を解析したりできないような作りになっています。
この API またはこのサイトの他のメソッドを使用して検索結果を解析する方法を知りたいです。
ありがとう。
ベストアンサー1
訪問する場合DuckDuck Go API ページ、API の使用に関する注意事項がいくつかあります。最初の注意事項には、次のように明記されています。
これはゼロクリック情報 API であるため、ほとんどのディープクエリ (トピック名以外) は空白になります。
これらのフィールドのリストは次のとおりです。
Abstract: ""
AbstractText: ""
AbstractSource: ""
AbstractURL: ""
Image: ""
Heading: ""
Answer: ""
Redirect: ""
AnswerType: ""
Definition: ""
DefinitionSource: ""
DefinitionURL: ""
RelatedTopics: [ ]
Results: [ ]
Type: ""
残念かもしれませんが、彼らのAPIは結果を切り捨ててあなたに提供しません。おそらく作業を高速化するためであり、使用する以外に何もできないようです。ダックダックゴー。
したがって、明らかに、その場合には API は適切な方法ではありません。
私にとっては、残された道は1つしかありません。それは、生のHTMLを取得することです。duckduckgo.comそして、例えば次のように解析する。html5ライブラリ(HTML が適切に構造化されていることは言及する価値があります)。
また、HTML 構造は変更される可能性がある一方で、API は通常、変更が公開されるまで安定したままであるため、HTML ページを解析することは、データをスクラップするための最も信頼性の高い方法ではないことにも言及する価値があります。
ここでは、このような解析がどのように実現されるかの例を示します。美しいスープ:
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 バージョンには異なるリンクがあります。
- http://duckduckgo.com/?q=例# JavaScript バージョン
- http://duckduckgo.com/html/?q=例# 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 に なし の部分)。