如果您访问DuckDuck Go API页面,则会发现有关使用API??的一些注意事项。第一个注释清楚地表明:
由于这是一个零点击的Info API,因此大多数深层查询(非主题名称)将为空白。
这是这些字段的列表:
Abstract: ""
AbstractText: ""
AbstractSource: ""
AbstractURL: ""
Image: ""
heading: ""
Answer: ""
Redirect: ""
AnswerType: ""
DeFinition: ""
DeFinitionSource: ""
DeFinitionURL: ""
RelatedTopics: [ ]
Results: [ ]
Type: ""
所以可能有些遗憾,但是他们的API只是截断了很多结果,而没有提供给您。可能会更快地工作,并且看起来除了使用DuckDuckGo.com之外什么都做不到。
因此,显然,在这种情况下,API并非可行之路。
对于我来说,我只剩下一种方法:从duckduckgo.com检索原始html并使用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版本仅包含 results ,并且对于 相关搜索, 您必须使用JavaScript版本。(html
网址中没有此部分)。