[Bug]使用duckduckgo的duckduckgo_search API搜索图片出现了错误

现在在kaggle上学习一个课程,第一课主要是识别图片里面是不是鸟🐦。其中一步是使用duckduckgo 搜索图片,源码:

复制代码
from duckduckgo_search import ddg_images
from fastcore.all import *
from fastbook import search_images_ddg


def search_images(term, max_images=30):
    print(f"Searching for '{term}'")
    return L(search_images_ddg(term, max_results=max_images)).itemgot('image')

#NB: `search_images` depends on duckduckgo.com, which doesn't always return correct responses.
#    If you get a JSON error, just try running it again (it may take a couple of tries).
urls = search_images('bird photos', max_images=1)
urls[0]

直接出现了下面的错误

复制代码
opt/conda/lib/python3.7/site-packages/duckduckgo_search/compat.py:60: UserWarning: ddg_images is deprecated. Use DDGS().images() generator
  warnings.warn("ddg_images is deprecated. Use DDGS().images() generator")
/opt/conda/lib/python3.7/site-packages/duckduckgo_search/compat.py:64: UserWarning: parameter page is deprecated
  warnings.warn("parameter page is deprecated")
/opt/conda/lib/python3.7/site-packages/duckduckgo_search/compat.py:66: UserWarning: parameter max_results is deprecated
  warnings.warn("parameter max_results is deprecated")
---------------------------------------------------------------------------
HTTPStatusError                           Traceback (most recent call last)
/tmp/ipykernel_18/2432147335.py in <module>
      1 #NB: `search_images` depends on duckduckgo.com, which doesn't always return correct responses.
      2 #    If you get a JSON error, just try running it again (it may take a couple of tries).
----> 3 urls = search_images('bird photos', max_images=1)
      4 urls[0]

/tmp/ipykernel_18/1717929076.py in search_images(term, max_images)
      4 def search_images(term, max_images=30):
      5     print(f"Searching for '{term}'")
----> 6     return L(ddg_images(term, max_results=max_images)).itemgot('image')

/opt/conda/lib/python3.7/site-packages/duckduckgo_search/compat.py in ddg_images(keywords, region, safesearch, time, size, color, type_image, layout, license_image, max_results, page, output, download)
     80         type_image=type_image,
     81         layout=layout,
---> 82         license_image=license_image,
     83     ):
     84         results.append(r)

/opt/conda/lib/python3.7/site-packages/duckduckgo_search/duckduckgo_search.py in images(self, keywords, region, safesearch, timelimit, size, color, type_image, layout, license_image)
    425         cache = set()
    426         for _ in range(10):
--> 427             resp = self._get_url("GET", "https://duckduckgo.com/i.js", params=payload)
    428             if resp is None:
    429                 break

/opt/conda/lib/python3.7/site-packages/duckduckgo_search/duckduckgo_search.py in _get_url(self, method, url, **kwargs)
     87                 logger.warning(f"_get_url() {url} {type(ex).__name__} {ex}")
     88                 if i >= 2 or "418" in str(ex):
---> 89                     raise ex
     90             sleep(3)
     91         return None

/opt/conda/lib/python3.7/site-packages/duckduckgo_search/duckduckgo_search.py in _get_url(self, method, url, **kwargs)
     81                 if self._is_500_in_url(str(resp.url)) or resp.status_code == 202:
     82                     raise httpx._exceptions.HTTPError("")
---> 83                 resp.raise_for_status()
     84                 if resp.status_code == 200:
     85                     return resp

/opt/conda/lib/python3.7/site-packages/httpx/_models.py in raise_for_status(self)
    747         error_type = error_types.get(status_class, "Invalid status code")
    748         message = message.format(self, error_type=error_type)
--> 749         raise HTTPStatusError(message, request=request, response=self)
    750 
    751     def json(self, **kwargs: typing.Any) -> typing.Any:

HTTPStatusError: Client error '403 Forbidden' for url 'https://duckduckgo.com/i.js?l=wt-wt&o=json&s=0&q=bird%20photos&vqd=4-120319640991756807142594628538299407667&f=%2C%2C%2C%2C%2C&p=1'
For more information check: https://httpstatuses.com/403

另外我还尝试了在Google的colab里面试了一下,也出现了下面的错误

复制代码
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-10-dd751e9bd5d7> in <cell line: 1>()
----> 1 from duckduckgo_search import ddg_images
      2 from fastcore.all import *
      3 
      4 def search_images(term, max_images=30):
      5     print(f"Searching for '{term}'")

ImportError: cannot import name 'ddg_images' from 'duckduckgo_search' (/usr/local/lib/python3.10/dist-packages/duckduckgo_search/__init__.py)

其实还是版本的问题,做下面的修复即可:

原来的search_images_ddg API已经不能用了,直接用fastbook中新的API search_images_ddg 即可,并且新的API似乎不支持。

复制代码
!pip install fastbook

from fastbook import search_images_ddg


# urls = search_images('bird photos', max_images=1)
urls = search_images_ddg('bird photos', max_images=1)
urls[0]

好了,大功告成了,还有问题的话可以参考一下我的note:

Hello World Hello bird - Is it a bird | Kaggle

相关推荐
郭枫寅1 小时前
第二课 Python 注释与规范格式
python
郭枫寅1 小时前
第三课 Python中的简单数据类型
python
郭枫寅1 小时前
第四课 Python基础语法(一)
python
JavaEdge在掘金2 小时前
解决 Maven os.detected.classifier 报错:快速修复指南
python
HEY_FLYINGPIG4 小时前
【FLASK】FLASK应用中的多用户并行登录与加密
后端·python·flask
fydw_7154 小时前
Flask-login 处理授权逻辑
后端·python·flask
ZHOU_WUYI4 小时前
Flask 动态模块注册
后端·python·flask
Blossom.1184 小时前
基于深度学习的智能图像增强技术:原理、实现与应用
人工智能·python·深度学习·神经网络·机器学习·tensorflow·sklearn
CodingLife4 小时前
Mac系统下, VS Code 中Python虚拟环境配置
python
黄豆匿zlib5 小时前
Python中的其他数据结构:除了列表和元组,还有哪些?
数据结构·windows·python