1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonでwebクローリング,webスクレイピング,文字取得と画像保存

Last updated at Posted at 2020-09-08

#下準備

import re
import requests
from pathlib import Path
import requests
from bs4 import BeautifulSoup

#作業フォルダを作る

output_folder = Path('作業フォルダ')
output_folder.mkdir(exist_ok=True)

#yahoo天気のデータを取得したい

requestsを使ってhtmlの要素を取得する。

url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'
html = requests.get(url).text

このままだと読みにくいのでBeautifulSoupで構造を書き直す

soup = BeautifulSoup(html, 'lxml')

soupを確認して取得したい情報がどこにあるか確認する。
今回は今日明日の天気を取得したいとする。

ctrl + F で該当ワードを検索する。

image.png

class="yjMt"が確認できた。

#soupで要素を指定して取得

today = soup.select('.yjMt')

divが取得したいときは select('div')
classが取得したいときは('.class')
idが取得したいときは('#id')
imgが取りたいときは selectよりsoup.find_all('img') の方が便利かも

取得できた内容を確認

today
[<h2 class="yjMt">今日明日の天気</h2>,
 <h2 class="yjMt">週間天気</h2>,
 <h2 class="yjMt">ピンポイント天気</h2>]

三つの要素が取れてしまうので、listの番号を指定して取り出す必要がある。

#同じ要領で最高最低気温を取得

high = soup.select('.high')
low = soup.select('.low')
low
[<li class="low"><em>25</em>[+2]</li>,
 <li class="low"><em>28</em>[+3]</li>]

今日明日の情報が入ってきているのでlistの番号を指定。
不要な文字列を取り除く。

today_low= str(low[0]).replace('<li class="high"><em>', '').replace('</em>', '').replace('</li>', '')

#画像の取得
webサイト上で画像を右クリック
urlをコピーしてctrl + F で該当urlを検索する。

classがpictであると分かった

pict = soup.select('.pict')
pict
[<p class="pict"><img alt="曇時々雨" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/203_day.png"/>曇時々雨</p>,
 <p class="pict"><img alt="曇のち晴" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/266_day.png"/>曇のち晴</p>,
 <div class="cmnMod pict">
 <ul>
 <li>
 <dl>
 <dt>雨雲レーダー</dt>
 <dd><a data-ylk="slk:zmradar; pos:1" href="//weather.yahoo.co.jp/weather/zoomradar/?lat=35.6965&amp;lon=139.4472&amp;z=10"><img alt="雨雲の動き" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/raincloud/1599021000/202010-0000-pf1300-20200902133000.gif?w=200&amp;h=150" width="200"/>
 </a></dd>
 </dl>
 </li><!--
 --><li>
 <dl>
 <dt>天気図</dt>
 <dd><a data-ylk="slk:chart; pos:1" href="/weather/chart/"><img alt="天気図" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/chart_v2/1599012878/WM_ChartA_20200902-090000.jpg?w=200&amp;h=150" width="200"/>
 </a></dd>
 </dl>
 </li><!--
 --><li>
 <dl>
 <dt>気象衛星</dt>
 <dd><a data-ylk="slk:stlt; pos:1" href="/weather/satellite/"><img alt="気象衛星" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/satellite_v2/1599022735/WM_H-JPN-IR_20200902-140000.jpg?w=200&amp;h=150" width="200"/>
 </a></dd>
 </dl>
 </li>
 </ul>
 </div>]

画像のurlだけが取得したい。
画像urlの前後に「"」があるので、これを指定文字として文字区切りする。
区切った後のリストから該当urlのあるリスト番号を指定する。

sp = re.split('"', str(pict))
sp[7]
'https://s.yimg.jp/images/weather/general/next/size150/203_day.png'

urlから画像を取り出してPILで表示させる

from PIL import Image
from io import BytesIO

img = requests.get(sp[7]).content
today_pict = Image.open(BytesIO(img))
today_pict

image.png

#別解

aタグ内のimgだけを取り出す方法もある

a_img = soup.select('a > img')

取り出しからsplitして、拡張子一致で画像だけに絞る

str_img = str(a_img).split('"')
l_in = [s for s in str_img if '.jpg' in s]

#保存

today_pict.save("today_pict.png")

#以上

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?