如果您访问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 BeautifulSoupimport urllibimport resite = 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=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变量中的结果是指向搜索引擎输出的第一个 结果 (不是 相关搜索 )的链接:
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/examplehttps://twitter.com/examplehttps://www.facebook.com/leadingbyexamplehttp://www.trythisforexample.com/http://www.myspace.com/leadingbyexample?_escaped_fragment_=https://www.youtube.com/watch?v=CLXt3yh2g0shttps://en.wikipedia.org/wiki/Example_(musician)http://www.merriam-webster.com/dictionary/example...请注意,纯HTML版本仅包含 results ,并且对于 相关搜索, 您必须使用Javascript版本。(
html网址中没有此部分)。



