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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

1397閲覧

Goを使ったログイン方法

kez_yuyuyu

総合スコア9

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/11/03 21:39

編集2022/11/03 21:40

やりたいこと

  • 現在Go言語を用いてスクレイピングをしたいと考えております。(Netflixの動画の閲覧履歴)
  • しかしスクレイピングしたい画面が,ログインを行なった後の画面のため一度ログインを行ってからスクレイピングをする必要があります。

方針

  • 具体的にはcookieをheaderに入れることでログインを省略したいと考えており、cookieの値を受け取ることはできたのですがheaderに埋め込んでgetリクエストを行うことができません。
  • というかそもそもこの方針が合っているのかすらわかりません。

失敗例

  • getでhtmlファイルのデータを受け取ろうとするとログイン画面のものを受け取ってしまいます。本来であればここでログイン後の画面が欲しいです。

該当のソースコード

go

1func GetCookieHandler(webPage string) []*http.Cookie { 2 3 jar, err := cookiejar.New(nil) 4 if err != nil { 5 log.Printf("クッキーの取得に失敗しました: %s", err) 6 } 7 8 client := &http.Client{Jar: jar} 9 res, err := client.Get(webPage) 10 11 if err != nil { 12 log.Printf("サイトへの接続に失敗しました: %s", err) 13 } 14 set_cookie_url, err := url.Parse(webPage) 15 if err != nil { 16 log.Printf("クッキーの取得に失敗しました: %s", err) 17 } 18 cookies := jar.Cookies(set_cookie_url) 19 20 defer res.Body.Close() 21 22 return cookies 23} 24 25// メイン 26func main() { 27 webPage := ネトフリの履歴のurl 28 cookies := GetCookieHandler(webPage) 29 http.HandleFunc(webPage, func(w http.ResponseWriter, 30 r *http.Request) { 31 for _, cok := range cookies { 32 http.SetCookie(w, cok) 33 } 34 }) 35 36 res, err := http.Get(webPage) 37 if err != nil { 38 log.Printf("htmlの取得に失敗しました: %s", err) 39 } 40 defer res.Body.Close() 41 42 //ここからスクレイピング 43 doc, _ := goquery.NewDocumentFromReader(res.Body) 44 fmt.Println(doc) 45 doc.Find(".login-signup-now").Each(func(i int, s *goquery.Selection) { 46 fmt.Println(s.Text()) 47 }) 48} 49

どうか解決策を教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

いくつか誤解があるようなので指摘を。

http.HandleFunc(...)はHTTPサーバー用の機能であって、クライアント側でこれを実行する意味はありません。
http.SetCookie(...)もサーバーがクライアントに返すレスポンスにCookieをセットする処理でGoによるHTTPクライアントとしては何も影響はないです。

http.Getはcookieやヘッダーを極力付与しないHTTPクライアントですので、
これを使っている限り取得したcookieをサーバーに送ることはありません。
HTTPリクエストにヘッダーやCookieを乗せる方法は以下の機能を利用します。

https://pkg.go.dev/net/http/cookiejar#example-New
https://pkg.go.dev/net/http#Client.Do

この状況から進めるならブラウザのデバッガ機能でHTTPヘッダーの内容が
目的のページが表示されるまでに
どのように「クライアントからサーバー」に
「サーバーからクライアント」にヘッダーの内容をよく観測してみてください。
そして自作のクライアントの送るヘッダー、受けたヘッダーを表示して同じになっているか確認しましょう。

また、これらを一通りクリアしてもログイン後のページが見れない場合という状況もあり得ます。
それはサーバー側が何らかの理由でロボットによる情報取得を制限していることがあるからです。
それもやはり観察と自身で作ったクライアントプログラムのやろうとすることの違いを見つけるしか対策はありません。
(いちばんシンプルな事例はUser-Agentの違いとか)
ただこのあたりはブラックボックスとの戦いになるのでやみくもにやり始めると全く目的を果たせず時間がかかってしまいます。
まずは前述の前半戦をクリアすることが重要です。

投稿2022/11/03 22:48

編集2022/11/03 23:13
nobonobo

総合スコア3367

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

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

kez_yuyuyu

2022/11/04 02:05

返信ありがとうございます。勉強不足で理解が足りていないのですが、 つまりは jar.SetCookies(u, cookies) でjarにクッキーを追加したのち、c := http.Client{Jar: jar}といった形で構造体を作りそれをc,get(url)みたいな形にすればいいということでしょうか?
kez_yuyuyu

2022/11/04 11:40

ありがとうございます。 また質問なのですが、こちらcookieをセットしてhttpリクエストを送る場合はクッキーをセットするのはgoogle.comにセットしてネトフリの画面にgetを送ればいいのでしょうか?
kez_yuyuyu

2022/11/04 11:42

つまり1. google.comにcookieをセット 2. セットして作ったhttp.Clientのメソッドのgetを用いて引数のurlにはネットフリックスのulrを指定するみたいな感じです。
nobonobo

2022/11/04 13:59

google.comとNetflixの関係がこちらにはわかりません。一般に言えるのはドメインを限定したcookie得た場合、そのcookieは他のドメインに送信されることはありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問