質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

599閲覧

fetch()時にHeaders情報を指定して戻り値を取得したい(cheerio-httpcliでPOSTする場合)

moimoi_sushi

総合スコア26

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/05/24 04:30

編集2020/05/25 05:21

前提・実現したいこと

DuckDuckGoの静的ページからロケーションを日本にした検索結果を取得したいです。(URL: https://duckduckgo.com/html/
サーバーとのやり取りに関してはnode初級レベルです(HerokuとExpress.jsでGETとPOSTだけの簡単なAPIを立てられる程度)

発生している問題・エラーメッセージ

検索結果は取得できていますがロケーションが指定されていないため日本語では使い物にならない検索結果となっています。エラーは特に発生していませんが、まともな結果が返ってきません。

**「虫歯 原因」の検索結果(現状)** 巨大虫歯に挑む - YouTube 虫歯治療 - YouTube Eeデンタル【虫歯が原因で大量の膿!】 でも抜かない根管治療専門医 角化嚢胞性歯原性腫瘍 - Wikipedia ...

上記のように中国語が混じっています。

**ロケーションを日本に指定した場合の検索結果** 虫歯ができる7つの原因と自分にあった予防法 虫歯の原因は?虫歯はどうしてできるの? | 水天宮・人形町の ... 虫歯になりやすい習慣・環境とは?原因や検査、セルフ ... 虫歯の原因とは?歯を磨いてるのになぜ虫歯になるの?

該当のソースコード

javascript

1const client = require('cheerio-httpcli'), 2 $ = require('jquery'), 3 targetURL = 'https://duckduckgo.com/html'; 4 5async function duckGo (keyword) { 6 return await client.fetch(targetURL, { q: keyword, kl: 'jp-jp' }) 7 .then(result => { 8 //返ってきたDOMをトリムする処理が入っている 9 ... 10 }); 11 return duckObj; 12 }) 13 .catch((err) => { 14 console.log(err); 15 }) 16} 17exports.duckGo = duckGo

試したこと

1つ目は

client.set('headers', { 'x-duckduckgo-locale': 'ja_JP' });

上記をfetchの直前におきました。

2つ目はコードにあるようにパラメータの設定 q=hoge&kl=jp-jp(URLパラメータのページを参考に:https://duckduckgo.com/params)をfetchに指定してみました。(おそらくduckduckgoは動的ページと静的ページの2つあり、おそらく動的ページの場合でしか使えないパラメータのため日本語が返ってこなかったと思われます)

3つ目、
https://duckduckgo.com/html/ページで検索に直接パラメータをいくつか入力してみましたが、RestAPIではない?のか検索結果のURLもhttps://duckduckgo.com/html/となります。

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

DuckDuckGoのPOST情報です。

**General** Request URL: https://duckduckgo.com/html/ Request Method: POST Status Code: 200 Remote Address: 54.254.135.186:443 Referrer Policy: origin **Response Headers** access-control-allow-origin: https://duckduckgo.com access-control-expose-headers: cache-control: max-age=1 content-encoding: br content-security-policy: default-src https: blob: data: 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self' content-type: text/html; charset=UTF-8 date: Sun, 24 May 2020 03:52:22 GMT expect-ct: max-age=0 expires: Sun, 24 May 2020 03:52:23 GMT referrer-policy: origin server: nginx server-timing: total;dur=349;desc="Backend Total" status: 200 strict-transport-security: max-age=31536000 vary: Accept-Encoding x-content-type-options: nosniff x-duckduckgo-locale: ja_JP x-frame-options: SAMEORIGIN x-xss-protection: 1;mode=block **Response Headers** :authority: duckduckgo.com :method: POST :path: /html/ :scheme: https accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 accept-encoding: gzip, deflate, br accept-language: ja,en-US;q=0.9,en;q=0.8 cache-control: max-age=0 content-length: 42 content-type: application/x-www-form-urlencoded cookie: kl=jp-jp; ah=jp-jp%2Cth-th; l=jp-jp; kl=ja-ja origin: https://duckduckgo.com referer: https://duckduckgo.com/ sec-fetch-dest: document

5/25追記:
26迄に回答なかった場合、こちらはクローズしてstack overflowに投げてみたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問