2012-07-30 35 views
12

Chỉnh sửa Tôi hiện nhận ra API đơn giản là không đủ và thậm chí không hoạt động. Tôi muốn chuyển hướng câu hỏi của mình, tôi muốn có thể tự động tìm kiếm duckduckgo bằng cách sử dụng "Tôi cảm thấy chán nản". Vì vậy, tôi có thể tìm kiếm cho "stackoverflow" ví dụ và nhận được trang chính ("https://stackoverflow.com/") là kết quả của tôi.API duckduckgo không trả lại kết quả

Tôi đang sử dụng API duckduckgo. Here

Và tôi thấy rằng khi sử dụng:

r = duckduckgo.query("example") 

Các kết quả không phản ánh một tìm kiếm sử dụng, cụ thể là:

for result in r.results: 
    print result 

Kết quả trong:

>>> 
>>> 

Không có gì.

Và tìm kiếm chỉ mục trong results dẫn đến lỗi ngoài giới hạn, vì nó trống.

Làm cách nào để nhận kết quả tìm kiếm?

Dường như API (theo ví dụ tài liệu của nó) có nghĩa vụ phải trả lời câu hỏi và đưa ra một loại "Tôi cảm thấy người chăn nuôi" trong hình thức r.answer.text

Nhưng trang web được thực hiện theo cách như vậy mà tôi không thể tìm kiếm và phân tích kết quả bằng các phương pháp thông thường.

Tôi muốn biết cách phân tích kết quả tìm kiếm bằng API này hoặc bất kỳ phương pháp nào khác từ trang web này.

Cảm ơn bạn.

Trả lời

26

Nếu bạn truy cập DuckDuck Go API Page, bạn sẽ tìm thấy một số lưu ý về việc sử dụng API. Các ghi chú đầu tiên nói rõ ràng rằng:

Vì đây là API thông tin không nhấp chuột, truy vấn sâu nhất (tên không có chủ đề) sẽ để trống.

Một đây là danh sách những lĩnh vực:

Abstract: "" 
AbstractText: "" 
AbstractSource: "" 
AbstractURL: "" 
Image: "" 
Heading: "" 
Answer: "" 
Redirect: "" 
AnswerType: "" 
Definition: "" 
DefinitionSource: "" 
DefinitionURL: "" 
RelatedTopics: [ ] 
Results: [ ] 
Type: "" 

Vì vậy, nó có thể là một điều đáng tiếc, nhưng API của họ chỉ truncates một loạt các kết quả và không cung cấp cho họ với bạn; có thể làm việc nhanh hơn và dường như không có gì có thể được thực hiện trừ khi sử dụng DuckDuckGo.com.

Vì vậy, rõ ràng, trong trường hợp đó, API không phải là cách để đi.

Đối với tôi, tôi chỉ thấy một lối thoát bên trái: truy xuất html thô từ duckduckgo.com và phân tích cú pháp nó bằng cách sử dụng, ví dụ: html5lib (điều đáng nói đến là html của họ được cấu trúc tốt).Cũng cần phải phân tích cú pháp các trang html không phải là cách đáng tin cậy nhất để xóa dữ liệu, bởi vì cấu trúc html có thể thay đổi, trong khi API thường ổn định cho đến khi thay đổi được công bố công khai.

Dưới đây là và ví dụ về cách có thể được phân tích như vậy đạt được với 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 

này kịch bản in:

u'Eixample, an inner suburb of Barcelona with distinctive architecture' 

Vấn đề truy vấn trực tiếp trên trang chính là nó sử dụng JavaScript để tạo ra các kết quả yêu cầu (không liên quan đến chủ đề), vì vậy bạn có thể sử dụng phiên bản HTML để chỉ nhận được kết quả. phiên bản HTML có liên kết khác nhau:

Hãy xem những gì chúng ta có thể nhận được:

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'] 

Kết quả được lưu trữ trong first_link biến là liên kết đến kết quả đầu tiên (không phải là relat ed tìm kiếm) mà kết quả đầu ra công cụ tìm kiếm:

http://www.iana.org/domains/example

Để có được tất cả các liên kết, bạn có thể duyệt qua thấy các thẻ (các dữ liệu khác trừ các liên kết có thể được nhận cách tương tự)

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 
... 

Lưu ý rằng phiên bản chỉ HTML chỉ chứa kết quả và cho tìm kiếm có liên quan bạn phải sử dụng JavaScript phiên bản. (vithout html một phần trong url).

+0

cảm ơn bạn. điều này giúp tôi hiểu vấn đề là gì, bạn đã tìm thấy điều đó ở đâu? : P tôi đã thử viết một phân tích cú pháp cho trang html thường xuyên của duckduckgo, nhưng tôi đã gặp vấn đề bởi vì nó sử dụng java hoặc một cái gì đó và kết quả không đi ra ở định dạng html thích hợp ... –

+0

Nó hoạt động tốt cho tôi với BeautifulSoup. Sẽ cập nhật câu trả lời –

+0

tốt, điều đó sai, kết quả bạn nhận được là từ các tìm kiếm có liên quan. –

0

Hãy thử:

for result in r.results: 
    print result.text 
+0

cùng một kết quả, không có gì. vấn đề là r.results là một mảng trống, API không trả lại kết quả nào cả. –

+0

vâng, tôi thấy bây giờ. r.related [0] .tiếp theo ví dụ làm việc tốt – couchemar

+0

r.related trả về tìm kiếm/truy vấn liên quan mà không phải là những gì tôi đang cố gắng để có được mặc dù ... mặc dù trong một số trường hợp nó có thể hữu ích. rõ ràng đó là một loại "giải pháp băng keo" –

0

Nếu nó phù hợp với ứng dụng của bạn, bạn cũng có thể thử tìm kiếm liên quan

r = duckduckgo.query("example") 
for i in r.related_searches: 
    if i.text: 
     print i.text 

sản lượng này:

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 
2

Sau khi đã nhận được một câu trả lời cho câu hỏi của tôi mà tôi chấp nhận và tặng thưởng cho - Tôi tìm thấy một giải pháp khác, mà tôi muốn thêm vào đây để hoàn thành. Và cảm ơn tất cả những người đã giúp tôi đạt được giải pháp này. Mặc dù đây không phải là giải pháp mà tôi đã yêu cầu, nó có thể giúp một người nào đó trong tương lai.

Tìm thấy sau một cuộc nói chuyện dài và cứng trên trang web này và với một số mail hỗ trợ: https://duck.co/topic/strange-problem-when-searching-intel-with-my-script

Và đây là mã giải pháp (từ một câu trả lời trong chủ đề được đăng trên đây):

>>> import duckduckgo 
>>> print duckduckgo.query('! Example').redirect.url 
http://www.iana.org/domains/example 
+0

Liên kết dường như đã chết –

+0

Có, có vẻ như vậy. Xin lỗi - Điểm chính của chuỗi mà tôi đã đăng ở đây. Hầu hết phần còn lại chỉ là một cuộc thảo luận về các vấn đề. –

0

Đối người dùng python 3, phiên mã của mã @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) 
Các vấn đề liên quan