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

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

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

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

Python

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

Q&A

解決済

3回答

2515閲覧

Pythonのスクレイピングで取得できない画像がある

TOMO6181

総合スコア40

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2019/07/31 12:16

Pythonを使用したスクレイピングで、画像を取得しようとして以下のコードを作成しました。

Python

1import requests as req 2 3# 1つ目の画像取得 4reqData1 = req.get('https://cdn.nissin.com/image?id=8833&s=720') 5 6with open('./pictures/reqData1.jpg', 'wb') as file: 7 file.write(reqData1.content) 8 9# 2つ目の画像取得 10reqData2 = req.get('https://catalog-p.meiji.co.jp/imageDisp.php?type=product&id=05997&dinimda=73342') 11 12with open('./pictures/reqData2.jpg', 'wb') as file: 13 file.write(reqData2.content) 14

上記コードを実行すると、1つ目の画像であるreqData1.jpgの画像は正常に取得できるのですが、2つ目の画像であるreqData2.jpgの方の画像が
正常に取得できず、ファイルは作成されるものの開くことができません。
画像URLをブラウザ上で入力すると、両方とも画像が表示されるので、URLの誤りではないと思われます。

1つ目の画像と2つ目の画像で何が違うか、また、2つ目の画像をどのようにすれば取得できるかお教えして頂けますと幸いです。

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

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

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

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

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

otn

2019/07/31 12:45

> 開くことができません。 とは、どういうことでしょう?エディタで開けないと言うことは無いと思いますが。
TOMO6181

2019/07/31 13:35

画像表示用のソフト、例えば、Windows フォトビューアーでjpgファイルを開こうとした時に、 「Windows フォト ビューアーではこの画像を開けません。」 と表示されます。
otn

2019/07/31 13:37

画像じゃなければテキスト(html)であるのが普通です。
guest

回答3

0

User-Agentで画像を表示、非表示を判別しているようですのでUser-Agentを変更しておくと保存できます。

python

1import requests 2 3headers = { 4 'User-Agent': 5 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' 6} 7 8 9def download_img(url, file_name): 10 11 r = requests.get(url, headers=headers, stream=True) 12 13 print(r.headers) 14 15 if r.status_code == 200: 16 with open(file_name, 'wb') as fw: 17 fw.write(r.content) 18 19 20download_img( 21 "https://catalog-p.meiji.co.jp/imageDisp.php?type=product&id=05997&dinimda=73342", 22 "meiji.jpg")

投稿2019/08/01 00:42

barobaro

総合スコア1286

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

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

0

print(reqData2.headers["content-type"])

の結果が、text/htmlなので、HTMLファイルになっていることがわかりました。

中身を開けると

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ご指定のページがみつかりません。|株式会社 明治</title> <meta name="description" content="">

となっています。

ご参考にしてください。

投稿2019/07/31 13:12

hirontan

総合スコア195

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

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

TOMO6181

2019/07/31 13:31

ご回答ありがとうございます。 試したところ、確かにreqData2のcontent-typeが「test/html」になっていました。 HTMLファイルでは、画像として保存することはできないですね。
guest

0

ベストアンサー

urlopenを使用すると取得できました。

import urllib.request # 1つ目の画像取得 url1 = 'https://cdn.nissin.com/image?id=8833&s=720' reqData1 = urllib.request.urlopen(url1).read() with open('reqData1.jpg', 'wb') as file: file.write(reqData1) # 2つ目の画像取得 url2 = 'https://catalog-p.meiji.co.jp/imageDisp.php?type=product&id=05997&dinimda=73342' reqData2 = urllib.request.urlopen(url2).read() with open('reqData2.jpg', 'wb') as file: file.write(reqData2)

投稿2019/07/31 12:52

kozuketec

総合スコア156

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

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

TOMO6181

2019/07/31 13:33

解決法ありがとうございます。 requests.getではHTML形式になるものを、urlopenを使えば、画像としてちゃんと保存できるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問