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

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

ただいまの
回答率

87.48%

python3 で画像データをスクレイピング出来ない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 662

score 59

Beautifulsoupとrequestsを使って厚生労働省(https://www.mhlw.go.jp/stf/newpage_11043.html)の以下の画像ファイルをスクレイピングにより取得しようとしているのですが出来ませんでした。
恐らくimgに指定の画像が入っていると思います。
取得した画像ファイルが特別なものなのでしょうか。
どなたかお分かりになる方、質問にお答えくださると幸いです。
よろしくお願いいたします。

コロナの感染者数

import requests
from bs4 import BeautifulSoup
from lxml import html

target_url='https://www.mhlw.go.jp/stf/newpage_11043.html'
res = requests.get(target_url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.content, "html.parser")
elems=soup.select('a')
img=soup.select('.m-grid__col1')[0].find('img')
r = requests.get(img['src'])
with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
    file.write(r.content)
---------------------------------------------------------------------------
InvalidSchema                             Traceback (most recent call last)
<ipython-input-475-b6e5e58c21be> in <module>
----> 1 r = requests.get(img['src'])
      2 with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
      3     file.write(r.content)

/usr/local/lib/python3.7/site-packages/requests/api.py in get(url, params, **kwargs)
     73 
     74     kwargs.setdefault('allow_redirects', True)
---> 75     return request('get', url, params=params, **kwargs)
     76 
     77 

/usr/local/lib/python3.7/site-packages/requests/api.py in request(method, url, **kwargs)
     58     # cases, and look like a memory leak in others.
     59     with sessions.Session() as session:
---> 60         return session.request(method=method, url=url, **kwargs)
     61 
     62 

/usr/local/lib/python3.7/site-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    531         }
    532         send_kwargs.update(settings)
--> 533         resp = self.send(prep, **send_kwargs)
    534 
    535         return resp

/usr/local/lib/python3.7/site-packages/requests/sessions.py in send(self, request, **kwargs)
    638 
    639         # Get the appropriate adapter to use
--> 640         adapter = self.get_adapter(url=request.url)
    641 
    642         # Start time (approximately) of the request

/usr/local/lib/python3.7/site-packages/requests/sessions.py in get_adapter(self, url)
    729 
    730         # Nothing matches :-/
--> 731         raise InvalidSchema("No connection adapters were found for '%s'" % url)
    732 
    733     def close(self):
InvalidSchema: No connection adapters were found for 'data:image/png;base64,iVBORw0KGgoA・・・'
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

実際のHTMLを見て無いのでしょうか?
<img src="https://" />じゃなくて、<img src="data:" />ですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/29 14:48

    ありがとう御座います。確かにアドレスバーに入力した所画像が表示されました。
    さらに質問で申し訳ないのですがこの dataスキームをpng画像に変換して保存する方法はありますでしょうか。調べても出てこなかったのでよろしければ教えて頂けると幸いです

    キャンセル

  • 2020/04/29 15:14

    説明を読んでも理解できなかったということでしょうか?
    src="data:image/png;base64,~~~~"
    の ~~~ の部分を取り出して、base64でデコードします。
    取り出しは、固定文字列の削除なのでreplaceで。
    デコードはbase64.b64decode()で。
    デコード結果がバイト列になるので、ファイルにバイナリーモードで書き出します。

    キャンセル

  • 2020/04/30 16:15

    ありがとう御座います。
    f = open('test.png', 'wb') # バイナリモードでファイルに書き込み
    f.write(base64.b64decode(img)) # \n (LF)で保存される
    f.close()
    にて出来ました。

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る