Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

愛媛の防災情報から避難所情報を収集して整理したい #27

Open
kkd opened this issue Jul 18, 2018 · 3 comments
Open
Labels
機能改善 New feature or request 自動化 データの自動取得、記事の自動修正など。人力を使わずできるようにしたい。 被災地の人向け 被災地住人に役立つもの 見える化・視覚化 直感的に理解できるように視覚化・図解化したい。

Comments

@kkd
Copy link
Contributor

kkd commented Jul 18, 2018

http://ehime.force.com/PUB_VF_HinanjyoList

避難所の開設・閉鎖・人数が表示されているが、見づらすぎる。

@kkd kkd added 機能改善 New feature or request 見える化・視覚化 直感的に理解できるように視覚化・図解化したい。 自動化 データの自動取得、記事の自動修正など。人力を使わずできるようにしたい。 被災地の人向け 被災地住人に役立つもの labels Jul 25, 2018
@sassy
Copy link
Member

sassy commented Jul 31, 2018

TODO:
#36 (comment)

@kkd kkd added this to In progress in サイト構成・記事 Aug 3, 2018
@imabari
Copy link
Contributor

imabari commented Aug 6, 2018

ファイル名のルールがわからないので表示のみ
https://imabari.hateblo.jp/entry/2018/08/04/174753

@imabari
Copy link
Contributor

imabari commented Aug 7, 2018

YYYY-mm-dd-HHMM-{city}-hinanjo.mdというファイル名で避難所情報の記事を作成するようにしました。
cronで回すなら時間設定を変更してください。
避難所閉鎖しているところは除去しております。

import datetime
import re
import time
from urllib.parse import urljoin
import string

import requests
from bs4 import BeautifulSoup


def get_hinanjo_page(url):

    headers = {
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
    }

    r = requests.get(url, headers=headers)

    if r.status_code == requests.codes.ok:

        soup = BeautifulSoup(r.content, 'html.parser')

        body = soup.select_one('#wrap > p').get_text(strip=True)

        # 発表内容と避難所に分割
        hapyou, hinanjo = [
            i.strip() for i in body.split('(避難世帯数、避難人数は、自主避難を含む)', 2)
        ]

        #:の後の空白文字を除去
        hapyou = re.sub(r':\s+', ':', hapyou)

        # 空行を除去、改行x2で段落にする
        res_hapyou = '\n\n'.join([i.strip() for i in hapyou.splitlines() if i])

        # マルチラインで正規表現
        pattern = re.compile(
            r'^(.*?):(臨時)?避難所\s(.*?)\s+\((\d{4}/\d{2}/\d{2} \d{2}:\d{2})\)\s+避難世帯数:(.*?)\s+避難人数:(.*?)\s+?$',
            re.M)

        # 開設済み避難所のみ抽出、閉鎖済みの避難所は除外
        hinanjo_open = [i for i in pattern.findall(hinanjo) if i[2] == '開設']

        hinanjo_list = []

        # 避難所がない場合はスキップ
        if len(hinanjo_open):

            hinanjo_list.append("|避難所名|状況|避難世帯数|避難人数|更新日|")
            hinanjo_list.append("|--|--|--|--|--|")

            # 避難所を表に変換
            for i in hinanjo_open:

                hinanjo_list.append(
                    '|{0[0]}|{0[2]}|{0[4]}|{0[5]}|{0[3]}|'.format(i))

        res_hinanjo = '\n'.join(hinanjo_list)

        return res_hapyou, res_hinanjo


if __name__ == '__main__':

    url = 'http://ehime.force.com/PUB_VF_HinanjyoList'

    headers = {
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
    }
    r = requests.get(url, headers=headers)

    if r.status_code == requests.codes.ok:

        soup = BeautifulSoup(r.content, 'html.parser')

        # 現在よりn日前
        dt_now = datetime.datetime.now() - datetime.timedelta(days=1)

        # 現在よりn時間前
        # dt_now = datetime.datetime.now() - datetime.timedelta(hours=1)

        # print(dt_now)

        for dl in soup.select('#shelterArea > div > dl'):

            _date, _title = [
                p.get_text(strip=True) for p in dl.select('a > dd > p')
            ]

            # 文字から日付に変換
            dt_date = datetime.datetime.strptime(_date, '%Y/%m/%d %H:%M')

            # タイトル抽出
            title = _title.split(':')[0].strip()

            # 市町村名抽出
            city = title.split()[0].strip()

            # n日前のみ表示
            if dt_date > dt_now:

                # 避難所ページリンク生成
                link = urljoin(url, dl.select_one('a').get('href'))

                # 避難所ページをスクレイピング
                hapyou, hinanjo = get_hinanjo_page(link)

                # テンプレート
                markdown = """\
---
title: $title($date)

category:
  - $city

tag:
  - 避難所
---
$hapyou

$hinanjo
"""

                # コンテンツ
                context = {
                    'title': title,
                    'city': city,
                    'date': _date,
                    'hinanjo': hinanjo,
                    'hapyou': hapyou,
                }
                city_names = {
                    '今治市': 'imabari',
                    '新居浜市': 'niihama',
                    '西条市': 'saijo',
                    '四国中央市': 'shikokuchuo',
                    '上島町': 'kamijima',
                    '松山市': 'matsuyama',
                    '伊予市': 'iyo',
                    '東温市': 'toon',
                    '久万高原町': 'kumakogen',
                    '松前町': 'masaki',
                    '砥部町': 'tobe',
                    '宇和島市': 'uwajima',
                    '八幡浜市': 'yawatahama',
                    '大洲市': 'ozu',
                    '西予市': 'seiyo',
                    '内子町': 'uchiko',
                    '伊方町': 'ikata',
                    '松野町': 'matsuno',
                    '鬼北町': 'kihoku',
                    '愛南町': 'ainan'
                }

                # テンプレート
                template = string.Template(markdown)
                md_post = template.safe_substitute(context)

                filename = '{}-{}-hinanjo.md'.format(
                    dt_date.strftime('%Y-%m-%d-%H%M'), city_names[city])

                with open(filename, 'w') as fw:
                    fw.write(md_post)

                time.sleep(1)

            else:
                break

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
機能改善 New feature or request 自動化 データの自動取得、記事の自動修正など。人力を使わずできるようにしたい。 被災地の人向け 被災地住人に役立つもの 見える化・視覚化 直感的に理解できるように視覚化・図解化したい。
Projects
Development

No branches or pull requests

3 participants