|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import random
|
|
from abc import ABC
|
|
from functools import partial
|
|
from duckduckgo_search import DDGS
|
|
import pandas as pd
|
|
|
|
from graph.component.base import ComponentBase, ComponentParamBase
|
|
|
|
|
|
class DuckDuckGoSearchParam(ComponentParamBase):
|
|
"""
|
|
Define the DuckDuckGoSearch component parameters.
|
|
"""
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.top_n = 10
|
|
self.channel = "text"
|
|
|
|
def check(self):
|
|
self.check_positive_integer(self.top_n, "Top N")
|
|
self.check_valid_value(self.channel, "Web Search or News", ["text", "news"])
|
|
|
|
|
|
class DuckDuckGoSearch(ComponentBase, ABC):
|
|
component_name = "DuckDuckGoSearch"
|
|
|
|
def _run(self, history, **kwargs):
|
|
ans = self.get_input()
|
|
ans = " - ".join(ans["content"]) if "content" in ans else ""
|
|
if not ans:
|
|
return Baidu.be_output(self._param.no)
|
|
|
|
if self.channel == "text":
|
|
with DDGS() as ddgs:
|
|
|
|
duck_res = ['<a href="' + i["href"] + '">' + i["title"] + '</a> ' + i["body"] for i in
|
|
ddgs.text(ans, max_results=self._param.top_n)]
|
|
elif self.channel == "news":
|
|
with DDGS() as ddgs:
|
|
|
|
duck_res = ['<a href="' + i["url"] + '">' + i["title"] + '</a> ' + i["body"] for i in
|
|
ddgs.news(ans, max_results=self._param.top_n)]
|
|
|
|
print(duck_res, ":::::::::::::::::::::::::::::::::")
|
|
return DuckDuckGoSearch.be_output(duck_res) |