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).
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 ... –
Nó hoạt động tốt cho tôi với BeautifulSoup. Sẽ cập nhật câu trả lời –
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. –