2012-07-30 15 views
12

संपादित करें अब मुझे एहसास है कि एपीआई बस अपर्याप्त है और यह भी काम नहीं कर रहा है। मैं अपने प्रश्न को पुनर्निर्देशित करना चाहता हूं, मैं अपने "मैं भाग्यशाली महसूस कर रहा हूं" का उपयोग करके डकडकगो को स्वत: जादुई रूप से खोजना चाहता हूं। इसलिए मैं उदाहरण के लिए "स्टैक ओवरफ्लो" खोज सकता हूं और मुख्य परिणाम ("https://stackoverflow.com/") को अपने परिणाम के रूप में प्राप्त कर सकता हूं।डकडकगो एपीआई परिणाम वापस नहीं कर रहा है

मैं डकडकगो एपीआई का उपयोग कर रहा हूं। Here

और मैंने पाया कि का उपयोग करते समय:

r = duckduckgo.query("example") 

परिणाम अर्थात् एक मैनुअल खोज नहीं प्रतिबिंबित करते हैं,: में

for result in r.results: 
    print result 

परिणाम:

>>> 
>>> 

कुछ भी नहीं।

और results में एक इंडेक्स की तलाश में सीमाओं में से एक त्रुटि है, क्योंकि यह खाली है।

मुझे अपनी खोज के लिए परिणाम कैसे प्राप्त करना चाहिए?

यह (अपने दस्तावेज उदाहरण के अनुसार) एपीआई लगता सवालों के जवाब देने और r.answer.text

के रूप में की "मैं डकी महसूस कर रहा हूँ" एक तरह से देने के लिए माना जाता है लेकिन वेबसाइट को इस तरह से किया जाता है कि मैं इसे खोज नहीं सकता और सामान्य तरीकों का उपयोग करके परिणामों का विश्लेषण नहीं कर सकता।

मैं जानना चाहता हूं कि मुझे इस साइट या इस साइट से किसी अन्य विधि के साथ खोज परिणामों को कैसे पार्स करना है।

धन्यवाद।

उत्तर

26

आप जाएँ DuckDuck Go API Page, आप एपीआई का उपयोग के बारे में कुछ नोट मिल जाएगा। पहले नोट स्पष्ट रूप से है कि कहते हैं:

इस के रूप में एक शून्य-क्लिक करें जानकारी API, सबसे गहरी प्रश्नों (गैर विषय के नाम पर) खाली हो जाएगा।

एक यहाँ उन क्षेत्रों की सूची है: एक दया

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

तो यह हो सकता है, लेकिन उनके एपीआई सिर्फ परिणाम का एक समूह ट्रंकेटस और उन्हें आप को दे नहीं करता है; संभवतः तेजी से काम करने के लिए, और ऐसा लगता है कि DuckDuckGo.com का उपयोग करने के अलावा कुछ भी नहीं किया जा सकता है।

तो जाहिर है, उस मामले में एपीआई जाने का रास्ता नहीं है।

मेरे लिए, मुझे केवल एक ही रास्ता दिखाई देता है: duckduckgo.com से कच्चे HTML को पुनर्प्राप्त करना और इसका उपयोग करके इसे पार्स करना html5lib (यह उल्लेख करने लायक है कि उनके एचटीएमएल अच्छी तरह से संरचित है)।

यह भी है कि HTML पृष्ठों को पार्स,, डेटा स्क्रैप क्योंकि एचटीएमएल संरचना को बदल सकते हैं सबसे विश्वसनीय तरीका नहीं है, जबकि आम तौर पर एपीआई स्थिर रहता है जब तक परिवर्तन सार्वजनिक रूप से घोषणा कर रहे हैं उल्लेख करने के लिए लायक।

यहाँ और कैसे इस तरह के पार्स 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' 

मुख्य पृष्ठ पर प्रत्यक्ष क्वेरी किए जाने की समस्या यह है कि यह करने के लिए जावास्क्रिप्ट का उपयोग करता है आवश्यक परिणाम (संबंधित विषय नहीं) उत्पन्न करें, ताकि आप केवल परिणाम प्राप्त करने के लिए 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 में संग्रहीत HTML संस्करण अलग लिंक है चर पहले परिणाम (नहीं एक relat के लिए एक लिंक है एड खोज) है कि खोज इंजन आउटपुट:

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-only संस्करण में केवल परिणाम हैं, और संबंधित खोज आपको जावास्क्रिप्ट का उपयोग करना होगा संस्करण। (यूआरएल में html हिस्सा vithout)।

+0

धन्यवाद। यह मुझे समझने में मदद करता है कि समस्या क्या है, आपको यह कहां मिला? : पी मैंने डकडकगो के नियमित एचटीएमएल पेज के लिए एक पार्सर लिखने की कोशिश की, लेकिन मुझे समस्याएं थीं क्योंकि यह जावा या कुछ का उपयोग करती है और परिणाम उचित एचटीएमएल प्रारूप में नहीं आये ... –

+0

यह सुंदर सूप के साथ मेरे लिए ठीक काम करता है। –

+0

उत्तर को अपडेट करेगा, यह गलत है, परिणाम आपको संबंधित खोजों से मिलता है। –

0

प्रयास करें:

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

इसी परिणाम, कुछ भी नहीं। समस्या यह है कि r.results एक खाली सरणी है, एपीआई कोई परिणाम नहीं दे रहा है। –

+0

हाँ, अब मैं देखता हूं। उदाहरण के लिए r.related [0] .text ठीक काम – couchemar

+0

r.related रिटर्न संबंधित खोज/प्रश्न जो मैं नहीं प्राप्त करने की कोशिश कर रहा हूं ... हालांकि कुछ मामलों में यह उपयोगी हो सकता है। जाहिर है कि यह एक प्रकार का "डक्ट-टेप समाधान" –

0

यदि यह आपके आवेदन सूट, आप भी संबंधित खोजों

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

यह पैदावार की कोशिश कर सकते:

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

पहले से ही मेरे सवाल जो मैं स्वीकार कर लिया और के लिए इनाम दिया का जवाब मिलने के बाद - मुझे एक अलग समाधान मिला, जिसे मैं यहां पूर्णता के लिए जोड़ना चाहता हूं। और उन सभी को धन्यवाद, जिन्होंने मुझे इस समाधान तक पहुंचने में मदद की। भले ही यह समाधान मैंने नहीं पूछा है, यह भविष्य में किसी की मदद कर सकता है।

इस साइट पर और कुछ समर्थन मेल के साथ एक लंबी और कठिन बातचीत के बाद मिला:

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

देता है लिंक –

+0

हां लगता है, ऐसा लगता है। क्षमा करें - मैंने धागे का मुख्य बिंदु यहां पोस्ट किया है। बाकी के अधिकांश समस्याओं के बारे में सिर्फ एक आगे और आगे चर्चा थी। –

0

के लिए: https://duck.co/topic/strange-problem-when-searching-intel-with-my-script

और यहाँ (धागा ऊपर पोस्ट में एक जवाब से) समाधान कोड है पायथन 3 उपयोगकर्ता, @ रोस्टिस्लाव डिज़िंको कोड का प्रतिलेखन:

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) 
संबंधित मुद्दे