webスクレイピングで今日の天気と気温を取得

# はじめに
はじめまして、webスクレイピング素人です。

BeautifulSoupを使って[tenki.jp](https://tenki.jp/)から調布市の今日の天気と気温を取得してみました。
# 環境
言語

- python  

使用ライブラリ

- requests
- BeautifulSoup4

# HTMLソースの取得、解析
[調布の天気ページ](https://tenki.jp/forecast/3/16/4410/13208/)のHTMLソースを`requests.get`で取得して`BeautifulSoup`で解析

```python
import requests
from bs4 import BeautifulSoup


#tenki.jpの目的の地域のページのURL(東京都調布市)
url = 'https://tenki.jp/forecast/3/16/4410/13208/'

#HTTPリクエスト
r = requests.get(url)

#プロキシ環境下の場合は以下を記述
"""
proxies = {
    #自分のプロキシのアドレスを記述
    "http":"http://proxy.xxx.xxx.xxx:8080",
    "https":"http://proxy.xxx.xxx.xxx:8080"
}
r = requests.get(url, proxies=proxies)
"""


bsObj = BeautifulSoup(r.content, "html.parser")
```

Chromeで閲覧してF12で調べてみると、
今日の天気情報はsectionタグのtoday-weatherクラスに入っている。  

![調布の今日の天気](https://qiita-image-store.s3.amazonaws.com/0/190128/088b67e1-0bb8-ef38-de8d-649acc74bde1.png "調布の今日の天気")

この部分を取得する。

```python
today = bsObj.find(class_="today-weather")
```

todayの中身はこんな感じになる。

```:todayの中身
<section class="today-weather"><!-- 今日の天気 -->
<h3 class="left-style">今日 06月13日<span class="weekday">(水)</span><span class="roku-you">[先負]</span></h3>
<div class="weather-wrap clearfix">
<div class="weather-icon">
<img alt="晴" height="60" src="https://static.tenki.jp/images/icon/forecast-days-weather/01.png" title="晴" width="94"/>
<p class="weather-telop">晴</p> </div>
<div class="date-value-wrap"><div class="forecast-days-temp-telop"><span class="forecast-natsu">夏日</span></div> <dl class="date-value">
<dt class="high-temp sumarry">最高</dt>
<dd class="high-temp temp"><span class="value">27</span><span class="unit">℃</span></dd>
<dd class="high-temp tempdiff">[+1]</dd>
<dt class="low-temp sumarry">最低</dt>
<dd class="low-temp temp"><span class="value">20</span><span class="unit">℃</span></dd>
<dd class="low-temp tempdiff">[0]</dd>
</dl><!-- /.date_value -->
</div><!-- /.date-value-wrap -->
</div><!-- /.weather_wrap -->
<div class="precip-table">
<table>
<tr>
<th>時間</th>
<th>00-06</th>
<th>06-12</th>
<th>12-18</th>
<th>18-24</th>
</tr>
<tr class="rain-probability">
<th>降水確率</th>
<td><span class="grey">---</span></td>
<td>0<span class="unit">%</span></td>
<td>0<span class="unit">%</span></td>
<td>0<span class="unit">%</span></td>
</tr>
<tr class="wind-wave">
<th>風</th>
<td colspan="4">北の風</td>
</tr> </table>
</div><!-- /.precip_table -->
</section>
```

ここから目的の天気と気温情報を取得したい。

お天気はpタグに入っている

```python
weather = today.p.string #天気
```

気温情報はさらにdivタグのdate-value-wrapクラスに入っている。

```python
temp = today.div.find(class_="date-value-wrap")
```

```:中身
<div class="date-value-wrap"><div class="forecast-days-temp-telop"><span class="forecast-natsu">夏日</span></div> <dl class="date-value">
<dt class="high-temp sumarry">最高</dt>
<dd class="high-temp temp"><span class="value">27</span><span class="unit">℃</span></dd>
<dd class="high-temp tempdiff">[+1]</dd>
<dt class="low-temp sumarry">最低</dt>
<dd class="low-temp temp"><span class="value">20</span><span class="unit">℃</span></dd>
<dd class="low-temp tempdiff">[0]</dd>
</dl><!-- /.date_value -->
</div>
```

具体的な数値はddタグに入っているのでそれぞれ取り出す

```python
#ddタグをすべて取り出す
temp=temp.find_all("dd")
#最高気温
temp_max = temp[0].span.string
#最高気温の前日比
temp_max_diff=temp[1].string
#最低気温
temp_min = temp[2].span.string
#最低気温の前日比
temp_min_diff=temp[3].string
```

それでは取得した中身を見てみましょう

```python
print("天気:{}".format(weather))
print("最高気温:{} {}".format(temp_max,temp_max_diff))
print("最低気温:{} {}".format(temp_min,temp_min_diff))
```

```:出力(2018/6/13)
天気:晴
最高気温:27 [+1]
最低気温:20 [0]
```

できました。

以上の内容をまとめたコードがこちらです。

```python:weather_tenkijp.py
#ライブラリのインポート
import requests
from bs4 import BeautifulSoup


#tenki.jpの目的の地域のページのURL（今回は東京都調布市）
url = 'https://tenki.jp/forecast/3/16/4410/13208/'

#HTTPリクエスト
r = requests.get(url)

#プロキシ環境下の場合は以下を記述
"""
proxies = {
    "http":"http://proxy.xxx.xxx.xxx:8080",
    "https":"http://proxy.xxx.xxx.xxx:8080"
}
r = requests.get(url, proxies=proxies)
"""

#HTMLの解析
bsObj = BeautifulSoup(r.content, "html.parser")

#今日の天気を取得
today = bsObj.find(class_="today-weather")
weather = today.p.string

#気温情報のまとまり
temp=today.div.find(class_="date-value-wrap")

#気温の取得
temp=temp.find_all("dd")
temp_max = temp[0].span.string #最高気温
temp_max_diff=temp[1].string #最高気温の前日比
temp_min = temp[2].span.string #最低気温
temp_min_diff=temp[3].string #最低気温の前日比

#結果の出力
print("天気:{}".format(weather))
print("最高気温:{} {}".format(temp_max,temp_max_diff))
print("最低気温:{} {}".format(temp_min,temp_min_diff))
```

# おわりに
拙い文ですが読んでいただきありがとうございました。
# 参考記事
[PythonとBeautiful Soupでスクレイピング](https://qiita.com/itkr/items/513318a9b5b92bd56185)