pythonでwebクローリング,webスクレイピング,文字取得と画像保存
下準備
import re
import requests
from pathlib import Path
import requests
from bs4 import BeautifulSoup
作業フォルダを作る
output_folder = Path('作業フォルダ')
output_folder.mkdir(exist_ok=True)
yahoo天気のデータを取得したい
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 で該当ワードを検索する。
class="yjMt"が確認できた。
soupで要素を指定して取得
today = soup.select('.yjMt')
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>]
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&lon=139.4472&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&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&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&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
別解
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")
以上
today_pict.save("today_pict.png")
Author And Source
この問題について(pythonでwebクローリング,webスクレイピング,文字取得と画像保存), 我々は、より多くの情報をここで見つけました https://qiita.com/Ringa_hyj/items/8a05f5841e75a3a1501b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .