PythonでDuckDuckGo APIを使っていろいろな検索結果を取得する

PythonでDuckDuckGo検索結果を取得するときの、用途や設定ごとのコードをまとめます。

# 実行環境
- Windows 11
- Python 3.11
- duckduckgo_search==4.5.0

# ライブラリのインストール

```sh:ターミナル
pip install duckduckgo-search
```

# 基本の検索

```Python
from duckduckgo_search import DDGS
import json

# クエリ
with DDGS() as ddgs:
    results = list(ddgs.text(
        keywords='東京',      # 検索ワード
        region='jp-jp',       # リージョン 日本は"jp-jp",指定なしの場合は"wt-wt"
        safesearch='off',     # セーフサーチOFF->"off",ON->"on",標準->"moderate"
        timelimit=None,       # 期間指定 指定なし->None,過去1日->"d",過去1週間->"w",
                              # 過去1か月->"m",過去1年->"y"
        max_results=4         # 取得件数
    ))

# レスポンスの表示
for line in results:
    print(json.dumps(
        line,
        indent=2,
        ensure_ascii=False
    ))
```

```json:出力
{
  "title": "Tokyo - Wikipedia",
  "href": "https://en.wikipedia.org/wiki/Tokyo",
  "body": "Tokyo (/ ˈ t oʊ k i oʊ /; Japanese: 東京, Tōkyō, ⓘ), officially the Tokyo Metropolis (東京都, Tōkyō-to), is the capital of Japan and one of the most populous cities in the world with a population of over 14 million residents as of 2023. The Tokyo metropolitan area, which includes Tokyo and nearby prefectures, is the world's most-populous metropolitan area with 40.8 million ..."
}
{
  "title": "東京の観光公式サイトgo Tokyo",
  "href": "https://www.gotokyo.org/jp/index.html",
  "body": "東京の観光ルート、有名スポット、食事、クルーズや船・ボートの楽しみ方、運河や川沿いのエリア紹介、宿泊先検索など、東京都全域のあらゆる観光情報を掲載している公式サイトです。新しい観光スポットやイベント、アトラクション、グルメ、文化などのトレンドや新しい観光スポット、東京ならではの魅力的な過ごし方をご紹介します。"
}
{
  "title": "東京都 - Wikipedia",
  "href": "https://ja.wikipedia.org/wiki/東京都",
  "body": "東京の玄関口である東京駅は東海道新幹線、東北新幹線を始めとする新幹線の起点であり、特定都区市内および東京山手線内の中心駅とされている。 関東地方に本社を所在する大手私鉄9社すべての列車が区部に乗り入れ、うち8社が自社路線を有する。"
}
{
  "title": "東京でまず行くべきはここ!定番の観光スポット28選をご紹介",
  "href": "https://www.knt.co.jp/travelguide/kokunai/010/",
  "body": "東京は浅草や上野、浜松町などの定番観光スポットを紹介しています。東京スカイツリー®や歌舞伎座、東京タワーなどの人気スポットや、浅草や上野の歴史や文化、動物園やパンダなどの魅力を満喫できるスポットを見つけてください。"
}
```

検索結果は1件1件がJSONになっていて、それぞれの記事のタイトル(`title`)、リンク(`href`)、抜粋部分(`body`)が与えられます。

# 検索ワードのAND条件

`keywords`の検索ワードを`[A] [B]`とすることで、AとB両方のワードに引っかかる検索結果が得られます。

```Python
with DDGS() as ddgs:
    results = list(ddgs.text(
        keywords='東京 大阪',
        region='jp-jp',
        safesearch='off',
        timelimit=None,
        max_results=4
    ))
```

```json:出力
{
  "title": "東京 - 大阪 │ 高速バス･飛行機･新幹線 が今なら最安値￥4,500～で予約可能",
  "href": "https://idou.me/search/all/tokyo/osaka",
  "body": "東京と大阪の高速バス、飛行機、新幹線の最安値を一括で検索できるサイトです。出発地と目的地を選択すると、各種交通手段の予約方法や料金を比較できます。令和6年能登半島地震の影響で運行状況も確認できます。"
}
{
  "title": "東京から大阪の乗換案内 - ジョルダン",
  "href": "https://www.jorudan.co.jp/norikae/route/東京_大阪.html",
  "body": "東京 から 大阪 復路を検索する 2024/02/20（火） 19:11 出発 条件変更 印刷 始発 終電 おすすめ順 到着が早い順 所要時間順 乗換回数順 安い順 経路 1 早 一本後 前後行き方 一本前 定期代 19:21 発 → 22:04 着 総額 14,520円 所要時間 2時間43分 乗換 1回 距離 556.4km Myルート Myポイント 印刷 テキスト Googleカレンダー Yahooカレンダー 運行情報 JR京都線 便利な機能使ってみませんか？ 乗換案内PREMIUM Amazonで販売中! 条件変更 違う便を比較検索 会員限定 会員限定 経路 2 一本後 前後行き方 一本前 定期代 19:33 発 → 22:34 着 総額 14,200円 所要時間 3時間1分 乗換"
}
{
  "title": "東京発→大阪行き飛行機・格安航空券・Lcc 往復¥9,160-スカイスキャナー",
  "href": "https://www.skyscanner.jp/routes/tyoa/osaa/tokyo-to-osaka.html",
  "body": "スカイスキャナーは東京発大阪行きの格安航空券やLCC、往復便の最安値を比較できるサイトです。月や日付を選択して、乗客数や航空会社を指定して、お得に予約できます。"
}
{
  "title": "東京発 ～ 大阪行きの高速バス・夜行バス予約【バス比較なび】",
  "href": "https://www.bushikaku.net/search/tokyo_osaka/",
  "body": "バス比較なびは東京発 大阪行きの高速バス・夜行バスの予約や料金を比較できるサイトです。2023年2月25日の最安値カレンダーや各種プラン、バス会社の情報も掲載しています。"
}
```

# 検索ワードのNG条件

`keywords`の検索ワードを`[A] -[B]`とすることで、Aのワードを含んでBのワードを含まない検索結果が得られます。

```Python
with DDGS() as ddgs:
    results = list(ddgs.text(
        keywords='東京 -東京都',
        region='jp-jp',
        safesearch='off',
        timelimit=None,
        max_results=4
    ))
```

```json:出力
{
  "title": "東京の観光公式サイトgo Tokyo",
  "href": "https://www.gotokyo.org/jp/index.html",
  "body": "東京都オフィシャル観光サイト。東京の観光ルート、有名スポット、食事、クルーズや船・ボートの楽しみ方、運河や川沿いのエリア紹介、宿泊先検索など、東京都全域のあらゆる観光情報を掲載しています。"
}
{
  "title": "Tokyo - Wikipedia",
  "href": "https://en.wikipedia.org/wiki/Tokyo",
  "body": "Tokyo (/ ˈ t oʊ k i oʊ /; Japanese: 東京, Tōkyō, ⓘ), officially the Tokyo Metropolis (東京都, Tōkyō-to), is the capital of Japan and one of the most populous cities in the world with a population of over 14 million residents as of 2023. The Tokyo metropolitan area, which includes Tokyo and nearby prefectures, is the world's most-populous metropolitan area with 40.8 million ..."
}
{
  "title": "【2023年】東京観光で行きたい名所!東京旅行おすすめ人気スポット30選 - [一休.com]",
  "href": "https://www.ikyu.com/kankou/area8023/",
  "body": "東京を代表する観光名所や東京の見どころまとめ、東京旅の中でしか出会えない東京の魅力をお楽しみください。東京タワー、六本木ヒルズ、東京スカイツリー（r）、表参道など人気スポットの観光情報をご紹介!人気スポットに近いおすすめレストラン（朝食、ランチ、ディナー）や人気 ..."
}
{
  "title": "東京 - Wikipedia",
  "href": "https://ja.wikipedia.org/wiki/東京",
  "body": "東京（とうきょう、英: Tokyo ）は、日本の地名。 関東平野の南部に位置し、東京湾に面する都市。 日本の首都機能がある 。. 墨田区上空から見た東京（東京スカイツリーから、2014年）。 画面右下から左上へ流れる川は隅田川 都庁舎展望室から南東方面を見た東京の夜景"
}
```

# 期間指定検索(発展)

`timelimit`の値を`YYYY-MM-DD..YYYY-MM-DD`形式で、開始日と終了日を指摘することで、任意の期間の検索結果を取得できる。

```python
with DDGS() as ddgs:
    results = list(ddgs.text(
        keywords='東京',
        region='jp-jp',
        safesearch='off',
        timelimit='2024-01-01..2024-01-07',
        max_results=4
    ))
```

```json:出力
{
  "title": "今人気なのはこれ!東京のイベントランキング｜レッツエンジョイ東京",
  "href": "https://www.enjoytokyo.jp/event/list/ranking/",
  "body": "東京にある全国各地のアンテナショップをご紹介。おうちで気軽に楽しめるご当地グルメ、特産品を使ったご当地スイーツ、幻の地酒、産地直送の新鮮野菜など、東京にいながら旅行気分でショッピングを楽しめます。"
}
{
  "title": "【東京自由行2024】東京行程全攻略/旅遊花費/交通/景點美食推薦 - Alina愛琳娜的旅遊記食",
  "href": "https://alina00.com/tokyo-travel/",
  "body": "東京自由行 2024 怎麼玩？日本東京行程規劃其實很簡單，東京旅遊全攻略彙整最熱門的東京景點美食推薦、機加酒旅遊花費、東京近郊一日遊，還有交通方便的東京住宿、逛街好買的購物、伴手禮；用5天4夜東京行程規劃整理東京花費預算多少錢，帶你們一篇搞懂、輕鬆出發!"
}
{
  "title": "東京の「フリーきっぷ」おすすめは？【2024年版】Jr、東京メトロ、都営地下鉄を上手に乗り放題! | タビリス",
  "href": "https://tabiris.com/archives/tokyo-freeticket/",
  "body": "東京メトロ24時間券. 価格：おとな600円、こども300円. 東京メトロ全線が24時間乗り放題になるきっぷです。銀座、渋谷、新宿、池袋、上野、秋葉原といった主要繁華街のほか、霞ヶ関や六本木、表参道、浅草など、jr線では行けないエリアも網羅しています。"
}
{
  "title": "3月開催の東京イベント人気ランキング｜レッツエンジョイ東京",
  "href": "https://www.enjoytokyo.jp/event/list/ranking/its09/",
  "body": "現在選択中の条件を解除する. 3月. TOP. 「東京 3月」の開催中または開催予定のイベントをレッツエンジョイ東京のアクセス数をもとにランキング。. 気になるイベントは開催期間や開催場所、最寄駅、地図、料金などをチェック!."
}
```

# 画像検索

`ddgs.text`を`ddgs.images`へ置き換えることで、画像検索ができる。

```python
with DDGS() as ddgs:
    results = list(ddgs.images(
        keywords='東京',
        region='jp-jp',
        safesearch='off',
        timelimit=None,
        max_results=4
    ))
```

```json:出力
{
  "title": "Tokyo Nightscape : (壁紙3)浜松町駅 世界貿易センタービル展望台シーサイドトップより",
  "image": "http://livedoor.blogimg.jp/tokyo_nightscape/imgs/8/6/86cd9d9d.jpg",
  "thumbnail": "https://tse4.mm.bing.net/th?id=OIP.WrlgD13-4FTS4tOQR-_CRAHaEK&pid=Api",
  "url": "http://blog.livedoor.jp/tokyo_nightscape/archives/6706367.html",
  "height": 2592,
  "width": 4608,
  "source": "Bing"
}
{
  "title": "東京タワー - 東京のシンボルに上って、首都東京を見下ろそう ! - Go Guides",
  "image": "https://a.cdn-hotels.com/gdcs/production187/d1325/4a6fd520-e65d-43b5-9388-c68cf9cc0b85.jpg",
  "thumbnail": "https://tse1.mm.bing.net/th?id=OIP.7j4lBDqBLSrdDxpAbk8K0gHaE7&pid=Api",
  "url": "https://jp.hotels.com/go/japan/tokyo-tower",
  "height": 1066,
  "width": 1600,
  "source": "Bing"
}
{
  "title": "東京晴空塔 - Klook香港",
  "image": "https://res.klook.com/images/fl_lossy.progressive,q_65/c_fill,w_1295,h_863/w_80,x_15,y_15,g_south_west,l_Klook_water_br_trans_yhcmh3/activities/ea2aktqnvppeqrpsntfj/東京SKYTREE®晴空塔門票.jpg",
  "thumbnail": "https://tse2.mm.bing.net/th?id=OIP.tYQ3D8I9iSbaE5daHjvaKwHaE7&pid=Api",
  "url": "https://www.klook.com/zh-HK/activity/41352-tokyo-skytree/",
  "height": 863,
  "width": 1295,
  "source": "Bing"
}
{
  "title": "デートに最適!無料で行ける東京の絶景夜景スポット厳選15選",
  "image": "http://torasuke.jp/wp-content/uploads/2015/06/ff13b9e121bfc69398dc3faf7cd90a43.jpg",
  "thumbnail": "https://tse4.mm.bing.net/th?id=OIP.g9OkYA7JjJZJdfUvL89SXQHaE8&pid=Api",
  "url": "http://torasuke.jp/kanto/tokyo/642.html",
  "height": 3648,
  "width": 5472,
  "source": "Bing"
}
```

出力の形式は通常の検索と同様で、1件1件がJSONで取得できる。
JSONの中には画像のリンクやサムネイル画像のリンク、掲載元記事のリンク、画像のサイズなどが入っている。

# ニュース検索

`ddgs.text`を`ddgs.news`へ置き換えることで、画像検索ができる。

```python
with DDGS() as ddgs:
    results = list(ddgs.news(
        keywords='東京',
        region='jp-jp',
        safesearch='off',
        timelimit=None,
        max_results=4
    ))
```

```json:出力
{
  "date": "2024-02-24T08:18:17+00:00",
  "title": "FC東京 新加入のMF荒木が2得点の大暴れ C大阪に引き分け",
  "body": "◇明治安田J1リーグ第1節　C大阪2―2FC東京（2024年2月24日　ヨドコウ） FC東京（昨季11位）が新加入MF荒木遼太郎（22）の2得点を挙げる活躍でC大阪（昨季9位）に2―2で引き分けた。 背番号71がいきなり東京サポーターのハートをわしづかみにした。",
  "url": "https://www.msn.com/ja-jp/news/opinion/fc東京-新加入のmf荒木が2得点の大暴れ-c大阪に引き分け/ar-BB1iO2Rl",
  "image": "https://img-s-msn-com.akamaized.net/tenant/amp/entityid/BB1iNVRv.img?w=1200&h=718&m=4&q=97",
  "source": "スポニチアネックス on MSN.com"
}
{
  "date": "2024-02-24T03:22:00+00:00",
  "title": "ダイヤの指輪など200万円相当盗んだ疑い 66歳と34歳の男2人を逮捕 ...",
  "body": "東京・大田区の貴金属店で、1人が店員の注意を引き、もう1人がダイヤの指輪などを盗んだ疑いで、男2人が逮捕された。住所不定の兒山弘容疑者（66）と増山洋平容疑者（34）は2023年11月、大田区の貴金属店でダイヤの指輪など10点あわせて200万円相当を盗んだ疑いがもたれている。警視庁によると、増山容疑者が買い物客を装って店員に接客をさせている隙に、兒山容疑者が鍵がかかっていないショーケースから指輪な",
  "url": "https://www.fnn.jp/articles/-/662130",
  "image": "https://fnn.ismcdn.jp/mwimgs/1/9/600/img_1908a913c1f71b65cfa3747f20b2e73882978.jpg",
  "source": "FNNプライムオンライン"
}
{
  "date": "2024-02-24T07:16:00+00:00",
  "title": "山里、オードリー東京Dにしみじみ",
  "body": "お笑いコンビ・南海キャンディーズの山里亮太が、21日深夜放送のTBSラジオ『水曜JUNK　山里亮太の不毛な議論』（毎週水曜　深1：00）に出演。\"たりないふたり\"の相方であるオードリー・若林正恭が、18日にラジオイベント『オードリーのオールナイトニッポンin東京ドーム』を行ったことを受け、率直な感想を口にした。",
  "url": "https://www.asahi.com/and/entertainment/424529827/",
  "image": "https://www.asahicom.jp/and/data/wp-content/uploads/2024/02/20240219_105902_size640wh_73322328.jpg",
  "source": "朝日新聞社"
}
{
  "date": "2024-02-24T08:13:00+00:00",
  "title": "C大阪とFC東京は痛み分けのドロー決着 新加入の荒木遼太郎が2 ...",
  "body": "2024明治安田J1リーグ第1節が24日に行われ、セレッソ大阪とFC東京が対戦した。  　小菊監督が就任して3年目となったC大阪は、日本代表の 毎熊晟矢 や 香川真司 に加え、 登里享平 、 田中駿汰 、ルーカス・フェルナンデスら新戦力がスタメン入り。また、新加入のヴィトール・ブエノがベンチ入りを果たした。今季から背番号『13』に変更した清武弘嗣はメンバー外となった。  　一方、ピーター・クラモフ",
  "url": "https://news.yahoo.co.jp/articles/2a5f6356f914d3d93f465e7519d71fa437c66b9c",
  "image": "https://newsatcl-pctr.c.yimg.jp/t/amd-img/20240224-01865549-soccerk-000-1-view.jpg?exp=10800",
  "source": "Yahoo!ニュース"
}
```

出力の形式は通常の検索と同様で、1件1件がJSONで取得できる。
JSONの中には日時や記事のタイトル、記事の抜粋、掲載元記事のリンクなどが入っている。

# 他の機能
DDGS()の中を覗いてみると、maps、proxies、suggestions、translate、videosなどの関数があり、地図検索などいろんなことができそうである。
少し試してみて、使い方がよくわからなかったので今回は説明を省略します。