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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1415閲覧

req.raw.decode_content = Trueの解説をお願いします。。

sinsotu_S

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/05 08:14

編集2022/06/05 12:36

https://qiita.com/revvve44/items/49f474fc1f05098bd670
上記記事より

python

1def download(url, file_name): 2 req = requests.get(url, stream=True) 3 if req.status_code == 200: 4 with open(file_name + ".png", 'wb') as f: # pngをbinでfileに書き出し 5 req.raw.decode_content = True 6 shutil.copyfileobj(req.raw, f) # fileにpng画像データをコピー

のreq.raw.decode_content = Trueの文の意味が色々調べても分かりません。

reqを .rawをつけることでなにをやっているのか,また.decode_content=Trueにすることでどうなるのか。
教えていただければ幸いです。

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

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

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

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

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

meg_

2022/06/05 10:54 編集

コードは「コードの挿入」で記入してください。 Qiitaの記事作成者には質問されましたか? > 色々調べても腹落ちしません。 何が「腹落ちし」ないのでしょうか?
sinsotu_S

2022/06/05 12:50

コメントありがとうございます。 初投稿のため,書式に不手際があり失礼しました。 先程Quitaの記事作成者の方に質問を致しました。 >何が「腹落ちし」ないのでしょうか? 画像検索から画像を保存するという同様の他の記事でも,決まったようにreq.raw.decode_content = Trueの一文がありました。ただ,この一文を取り除いても正常に動いたのでなぜこの一文が必要になるのか,という点と.rawと.decode_contentで何をしているのか自分では調べても解決しきらなかったので解説を教えていただきたく質問しました。
quickquip

2022/06/05 23:38 編集

情報は質問を編集して追記してください。 あと、正直、調べた結果としてここを読んで、ここはわかったけど、ここの意味がわからなかった、みたいな情報がないと答えづらい質問ではあります。どこを説明すればいいのか判断できないので。。。
guest

回答1

0

ベストアンサー

まずrequests.Responseのドキュメントにあたりますよね。
https://requests.readthedocs.io/en/latest/api/#requests.Response.raw

File-like object representation of response (for advanced usage). Use of raw requires that stream=True be set on the request. This requirement does not apply for use internally to Requests.

と出てくるのでstream=Trueの時にセットされるファイルライクのオブジェクトだと分かりますね。

stream=Trueをセットして型を見ますね。

python

1>>> import requests 2>>> req = requests.get('https://teratail.com/', stream=True) 3>>> print(type(res.raw)) 4<class 'urllib3.response.HTTPResponse'>

urllib3のドキュメントにあたる必要があるとわかるわけです。PyPIからドキュメントに行って"decode_content"で検索しますよね。

https://urllib3.readthedocs.io/en/stable/reference/urllib3.response.html?highlight=decode_content

decode_content – If True, will attempt to decode the body based on the ‘content-encoding’ header.

っ書いてあるんで ‘content-encoding’ ヘッダが関係することが分かりますね。decode_contentがTrueだと、content-encoding ヘッダに従って本体ほデコードしようと試みるよ、と。

content-encoding ヘッダの振る舞いが分かっていればここで理解できて調査終了ですね。
そうでないならMDNとかを読みにいきますね。

この時点で私は挙動が推測できています。
content-encoding ヘッダが例えばgzipに設定されているレスポンスをこの処理で取得する時、decode_content=Trueを指定しないとネットワークを流れてきたgzip圧縮されたデータが取得できて、decode_content=Trueを指定するとヘッダを見てくれて自動でgzipでデコードしてくれたデータが取得されるんだろうな、と思っています。
そこで確認するコードを書きます。

python

1import shutil 2 3req = requests.get('https://teratail.com/', stream=True) 4if req.status_code == 200: 5 req.raw.decode_content = True 6 with open('decode_content_true_test', 'wb') as f: 7 shutil.copyfileobj(req.raw, f) 8 9req = requests.get('https://teratail.com/', stream=True) 10if req.status_code == 200: 11 with open('decode_content_false_test', 'wb') as f: 12 shutil.copyfileobj(req.raw, f)

として、macOSなのでターミナルに戻って

shell

1% file decode_content_false_test 2decode_content_false_test: gzip compressed data, from Unix, original size modulo 2^32 220957 3% file decode_content_true_test 4decode_content_true_test: HTML document text, Unicode text, UTF-8 text, with very long lines (20700), with CRLF line terminators

としてやると、decode_content=Trueがないとgzip形式、decode_content=Trueがあるとテキストファイル形式で取得できることが確認できました。

投稿2022/06/05 23:29

編集2022/06/05 23:31
quickquip

総合スコア11038

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

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

quickquip

2022/06/05 23:39

結果として「なんでstream=Trueを指定したんだ?」というのが一番腹落ちしないポイントでしたね。。。
sinsotu_S

2022/06/07 02:20

ご回答ありがとうございました! ひとつひとつ調べ方や確かめ方にそって解説していただけて感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問