ミニロトの結果を取得

TSV保存

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import csv

options = Options()
options.set_headless()
driver = webdriver.Firefox(options=options)

driver.get(
    'https://www.mizuhobank.co.jp/retail/takarakuji/loto/miniloto/index.html')

# ブラウザ操作

html = driver.page_source
driver.quit()

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

with open('minoloto.tsv', 'a') as fw:
    writer = csv.writer(fw, dialect='excel-tab', lineterminator='\n')

    for table in soup.select(
            '#mainCol > article > section > section > section > div > div.sp-none > table'
    ):

        result = [i.get_text(strip=True) for i in table.find_all(['th', 'td'])]

        print(result)
        temp = [result[i].strip('()') for i in [1,3,5,6,7,8,9,10]]

        writer.writerow(temp)

昨日はできたのに今日するとKasperskyのネット決済保護機能が働いて スクレイピングできなくてびっくりした。

取得

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import datetime
import locale

options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)

driver.get(
    'https://www.mizuhobank.co.jp/retail/takarakuji/loto/miniloto/index.html')

# ブラウザ操作

html = driver.page_source
driver.quit()

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

for table in soup.select(
        '#mainCol > article > section > section > section > div > div.sp-none > table'
):

    result = [i.get_text(strip=True) for i in table.find_all(['th', 'td'])]

    # print(result)

    locale.setlocale(locale.LC_NUMERIC, 'Japanese_Japan.932')

    loto_list = {
        'count': int(result[1].strip('第回')),
        'date': datetime.datetime.strptime(result[3], '%Y年%m月%d日'),
        'win_num': result[5:10],
        'bou_num': result[10].strip('()'),
        'prize_1st': {
            'lot': locale.atoi(result[12].rstrip('口')),
            'prize': locale.atoi(result[13].rstrip('円'))
        },
        'prize_2nd': {
            'lot': locale.atoi(result[15].rstrip('口')),
            'prize': locale.atoi(result[16].rstrip('円'))
        },
        'prize_3rd': {
            'lot': locale.atoi(result[18].rstrip('口')),
            'prize': locale.atoi(result[19].rstrip('円'))
        },
        'prize_4th': {
            'lot': locale.atoi(result[21].rstrip('口')),
            'prize': locale.atoi(result[22].rstrip('円'))
        },
        'sales_amount': locale.atoi(result[24].rstrip('円'))
    }

    print(loto_list['count'], loto_list['date'])
    print(loto_list['win_num'], loto_list['bou_num'])

pandas

qiita.com

news.mynavi.jp

amalog.hateblo.jp

pandas: powerful Python data analysis toolkit — pandas 0.23.0 documentation

www.atmarkit.co.jp

www.atmarkit.co.jp

www.atmarkit.co.jp

# 型確認
df.dtypes

# 欠損値のカウント
df.isnull().sum()

# 欠損値確認
df[df.isnull().any(axis=1)]



#文字除去
df['xxx'].str.strip('yyy')

# 型変換
df['xxx'].astype(np.int64)

# 抽出
df1 = df.iloc[:, 3:5]

# 置換

## 条件がTrueの時はそのまま、Falseの時はNaN
df['xxx'].where(df['xxx'] == 'hoge')

## 条件がTrueの時はNaN、Falseの時はそのまま
df['xxx'].mask(df['xxx'] == 'hoge')


# dfをそのまま適用
inplace=True

# datetimeをtimeを分離
df['time'] = df.index.time.tolist()
df['time'] = df['datetime'].dt.time.tolist()

#ピボットテーブル
pv = df.pivot_table(values = 'xxx', index = 'yyy', columns='zzz', aggfunc = sum, fill_value = 0)

# 順位
df['xxx'].rank(ascending=False, method='min')

# ソート
df.sort_values(['xxx', 'yyy', 'zzz'], ascending=[True,True, True], inplace=True)
dfs = pd.read_html(url, header=0, index_col=0, match='xxxxx')

pandas.read_html(
    io,
    match='.+',
    flavor=None,
    header=None,
    index_col=None,
    skiprows=None,
    attrs=None,
    parse_dates=False,
    tupleize_cols=None,
    thousands=', ',
    encoding=None,
    decimal='.',
    converters=None,
    na_values=None,
    keep_default_na=True)

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_html.html

df = pd.read_csv(url, encoding='shift_jis', skiprows=1, header=0, index_col=0)

pandas.read_csv(
    filepath_or_buffer,
    sep=', ',
    delimiter=None,
    header='infer',
    names=None,
    index_col=None,
    usecols=None,
    squeeze=False,
    prefix=None,
    mangle_dupe_cols=True,
    dtype=None,
    engine=None,
    converters=None,
    true_values=None,
    false_values=None,
    skipinitialspace=False,
    skiprows=None,
    nrows=None,
    na_values=None,
    keep_default_na=True,
    na_filter=True,
    verbose=False,
    skip_blank_lines=True,
    parse_dates=False,
    infer_datetime_format=False,
    keep_date_col=False,
    date_parser=None,
    dayfirst=False,
    iterator=False,
    chunksize=None,
    compression='infer',
    thousands=None,
    decimal=b'.',
    lineterminator=None,
    quotechar='"',
    quoting=0,
    escapechar=None,
    comment=None,
    encoding=None,
    dialect=None,
    tupleize_cols=None,
    error_bad_lines=True,
    warn_bad_lines=True,
    skipfooter=0,
    skip_footer=0,
    doublequote=True,
    delim_whitespace=False,
    as_recarray=None,
    compact_ints=None,
    use_unsigned=None,
    low_memory=True,
    buffer_lines=None,
    memory_map=False,
    float_precision=None)

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

石手川ダムのリアルタイムダム諸量一覧表でpandas練習

imabari.hateblo.jp

!pip install lxml

import pandas as pd
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 石手川ダムのリアルタイムダム諸量一覧表
url = 'http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080150020&KIND=3&PAGE=0'

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')

    # ページからデータのリンク先URLを取得
    link = urljoin(url, soup.select_one('body > center > p > a').get('href'))
    print(link)


    # データーフレームに読み込み
    df = pd.read_csv(
        link,
        skiprows=9,
        encoding='shift_jis',
        names=[
            '年月日', '時刻', '流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性',
            '放流量', '放流量属性', '貯水率', '貯水率属性'],
        parse_dates={'日時':['年月日', '時刻']},
        index_col=['日時'],
        # 貯水率が0の時は欠損にする
        na_values=0
    )
    # df['日時']=pd.to_datetime(df['日時'], format='%Y/%m/%d %H:%M')
    # 日時と貯水率以外は削除
    df.drop(['流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性', '放流量', '放流量属性', '貯水率属性'], axis=1, inplace=True)

# データ確認
df
df.plot()

# 欠損部チェック
df[df.isnull().any(axis=1)]

# 欠損部補完(前の値で置き換え)
dfh = df.fillna(method='ffill')
dfh.plot()

df.dtypes

type(df.index[0])

わからない

  1. 年月日と時刻を結合して日時を作成できたがdatetimeにならない
  2. 欠測、未受信の場合の欠損値の補完
    • 正常値の属性は半角スペース
    • 欠測は属性全部が$
    • 未受信の場合流域平均雨量属性は-でそれ以外の属性は#
    • 半角スペース以外の時は欠損値を上から補完
!pip install lxml

import pandas as pd
import datetime

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 早明浦ダムのリアルタイムダム諸量一覧表
url = 'http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0'

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')

    # ページからデータのリンク先URLを取得
    link = urljoin(url, soup.select_one('body > center > p > a').get('href'))
    print(link)


    # データーフレームに読み込み
    df = pd.read_csv(
        link,
        skiprows=9,
        encoding='shift_jis',
        names=[
            '年月日', '時刻', '流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性',
            '放流量', '放流量属性', '貯水率', '貯水率属性'],
        parse_dates=['年月日'],
        # na_values=0
    )


def conv(temp):
    H, M = map(int, temp.split(':'))
    return datetime.timedelta(hours=H, minutes=M)


df['日時'] = df['年月日'] + df['時刻'].apply(conv)
df.set_index('日時', inplace=True)

df.dtypes

df.head(10)

# 属性が欠測、未受信の場合は欠損値にする 
df['流域平均雨量'] = df['流域平均雨量'].where(df['流域平均雨量属性'] == ' ')
df['貯水量'] = df['貯水量'].where(df['貯水量属性'] == ' ')
df['流入量'] = df['流入量'].where(df['流入量属性'] == ' ')
df['放流量'] = df['放流量'].where(df['放流量属性'] == ' ')
df['貯水率'] = df['貯水率'].where(df['貯水率属性'] == ' ')

# 貯水率のみにする
rate_se = df.loc[:, '貯水率']
rate_se.head(10)

# 欠損値のカウント
rate_se.isnull().sum()

# 欠損部チェック
rate_se[rate_se.isnull()]

# グラフ表示
rate_se.plot()

# 欠損値補完(前の値で置き換え)
rate_correct = rate_se.fillna(method='ffill')

# 欠損値補完(後の値で置き換え)
rate_correct = rate_se.fillna(method='bfill')
rate_correct

# グラフ表示
rate_correct.plot()

# 1時間毎に変更
rato_hour = rate_correct.asfreq(freq='H')
rato_hour

# グラフ表示
rato_hour.plot()

# 欠損値を除去
rate_del = rate_se.dropna()
rate_del.plot()

FC今治の順位をスクレイピング

import datetime
import requests
from bs4 import BeautifulSoup

url = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1277'
r = requests.get(url)

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

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

    update_str = soup.select_one(
        '#page_detail > div > div > div > p').get_text(strip=True).rstrip('更新')
    update = datetime.datetime.strptime(update_str, '%Y/%m/%d')

    # print(update)

    result = [[
        x.get_text(strip=True) for x in y.select('td')
    ] for y in soup.select('#page_detail > div > div > div > table > tr')[2:]]

    for i in result:
        if '今治' in i[1]:
            print('{}現在のFC今治の順位は{}位です'.format(
                update.strftime('%m/%d'), i[0]))
            break

Pandas

!pip install lxml

import pandas as pd

url = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1277'
dfs = pd.read_html(url, skiprows=2)

df = dfs[0]

# タイトル行追加
df.columns = ['順位', 'チーム名', '勝点', '試合数', '勝利', '勝利H', '勝利A', '引分', '引分H', '引分A', '敗戦', '敗戦H', '敗戦A', '得失点差', '得点', '失点']
# タイトル列追加
df.set_index('順位', inplace=True)

df

df.sort_values(by=["得点", "得失点差"], ascending=False).reset_index()

df.sort_values(by=["勝利H", "勝利A"], ascending=False).reset_index()

df.sort_values(by=["敗戦H", "敗戦A"], ascending=False).reset_index()

df['回数H'] = df['勝利H'] + df['引分H'] + df['敗戦H']
df['回数A'] = df['試合数'] - df['回数H']

df['勝率H'] = df['勝利H'] / df['回数H']
df['引分率H'] = df['引分H'] / df['回数H']
df['敗率H'] = df['敗戦H'] / df['回数H']

df['勝率A'] = df['勝利A'] / df['回数A']
df['引分率A'] = df['引分A'] / df['回数A']
df['敗率A'] = df['敗戦A'] / df['回数A']

df.style.format({'勝率H':"{:.2%}", '敗率H':"{:.2%}",'引分率H':"{:.2%}",'勝率A':"{:.2%}",'敗率A':"{:.2%}",'引分率A':"{:.2%}"})
#df.sort_values(by=["勝率H", '勝利H'], ascending=False).reset_index()

Colaboratoryでスクレイピング

2021/04/18現在利用できません

news.mynavi.jp

https://colab.research.google.com/

f:id:imabari_ehime:20180416172850p:plain

import pandas as pd
import requests
from bs4 import BeautifulSoup


url = 'http://www.river.go.jp/kawabou/ipDamGaikyo.do?init=init&areaCd=88&prefCd=3801&townCd=&gamenId=01-0903&fldCtlParty=no'

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, 'html5lib')

    result = [[
        x.get_text(strip=True) for x in y.find_all(['th', 'td'])
    ] for y in soup.select('body > div.gaikyoCntt > table > tbody > tr ')]

    df = pd.DataFrame(data=result[1:], columns=result[0])
    df.set_index('ダム名', inplace=True)

df

Pandas

pip3じゃなくてpipだとできた

!pip install lxml
import pandas as pd

url = 'http://www.river.go.jp/kawabou/ipDamGaikyo.do?init=init&areaCd=88&prefCd=3801&townCd=&gamenId=01-0903&fldCtlParty=no'
dfs = pd.read_html(url, header=0, index_col=0)
dfs[7]

f:id:imabari_ehime:20180417085825g:plain

愛媛県動物愛護センターから迷い犬猫情報を取得しTwitterに投稿

import tempfile
from urllib.parse import urljoin

import requests
import twitter
from bs4 import BeautifulSoup

# 迷い犬猫情報にアクセスし、HTMLを取得する
url = 'http://www.pref.ehime.jp/h25123/4415/mayoi.html'
r = requests.get(url)

# エラーがないか確認する
if r.status_code == requests.codes.ok:

    # BeautifulSoupを使い迷い犬猫を取得する
    soup = BeautifulSoup(r.content, 'html.parser')

    for table in soup.select('#tmp_contents > table.datatable'):

        # タイトル取得
        caption = table.select_one('caption > h3').get_text(strip=True)

        if '犬' in caption:
            tribe = '犬'
        elif '猫' in caption:
            tribe = '猫'
        else:
            tribe = ''

        # 一行目ヘッダーのため二行目から取得する
        for row in table.select('tbody > tr')[1:]:

            # 迷い犬猫情報を取得する
            dogcat = [cell.get_text(strip=True) for cell in row.select('td')]

            # 写真のURLを取得する
            img_url = urljoin(url, row.select_one('img')['src'])

            # print(img_url)

            # 写真をダウンロードする
            res = requests.get(img_url)

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

                # 写真をファイルに一時保存する
                with tempfile.TemporaryFile() as fp:

                    fp.write(res.content)
                    fp.seek(0)
                    fp.read()

                    twit = '愛媛県動物愛護センター {0}\n\n拾得・捕獲場所:{1[0]}\n種類:{1[1]}\n毛色:{1[2]}\n性別:{1[3]}\n体格:{1[4]}\n備考:{1[5]}\n\n#愛媛県 #迷い{2}\n\n{3}'.format(
                        caption, dogcat, tribe, url)

                    # print(twit)

                    api = twitter.Api(
                        consumer_key='',
                        consumer_secret='',
                        access_token_key='',
                        access_token_secret='')

                    # Twitterに投稿する
                    status = api.PostUpdate(twit, media=fp)

au光のルーターをBL1000HWに交換

2020/9/1現在 通信が遅いまたはつながらなかったり不具合が多いので別途無線ルーターを取り付けたら快適になったので現在は内蔵の無線LANはOFFにしている。

internet.watch.impress.co.jp

www.aterm.jp

今使っているatermよりアンテナの数も多いBL1000HWに3000円で交換できるようなので交換申込した。

設定

11axモードをOFF バンドステアリングをOFF 今のところWi-Fi安定している。

良いところ

  • アンテナが2.4GHz:送信4×受信4、5GHz:送信4×受信4でスピードは速い。
  • 10GBASE-T/5GBASE-T/2.5GBASE-TのLANポートが1つある。

悪いところ

  • Wi-Fiがかなり不安定。切れるとしばらく接続不能。バンドステアリングがダメなのかな?5GHzのは比較的切れてない
  • GoogleHomeとAmazonEchoはほぼ同時期に切れる(週1・2回)。本体再起動では直らずルータ再起動で直る。目覚まし代わりにしているので朝切れているとやばい。
  • ASUS ME572CLは2~3日ぐらいで接続不能。本体再起動では直らずルータ再起動で直る。
  • XperiaXZとiPhone7は切れたことがない。g07+は最初1回だけ接続不能になったが最近は調子がいい。他機器が接続不能になっていてもこの機器は普通につながる。
  • パソコンだとSSIDが表示されない。スマホは問題なし。→11axモードをOFFにするとOK。 www.aterm.jp

  • ログが見れない。いつから切れているのか原因も確認する方法がない。

  • スマホで固定電話」で話したが途切れるらしく結局固定電話で電話しなおした。ルーターの目の前でもダメだった。でも内線電話は便利かも。※検証機種済み機種ではない。
  • 4/8から4/19現在バンドステアリングを切っているが今のところ安定している。GoogleHomeは5Ghzでは接続できなかった目視2mぐらいで障害物はドアぐらい。 www.au.com