超初心者がサンマルクカフェの店舗情報をスクレイピングしてみた

はじめに

初投稿です。今回は北海道にあるサンマルクカフェの店舗情報をPythonスクレイピングしてみました。具体的には、店舗名・住所・電話番号を抜き出します。

あまりキレイなコードではないかもですが、とりあえずスクレイピングできたので投稿してみました。もっと良いコードがあれば直しておきます。

スクレイピングをするにあたって、キノコードさんのYouTube動画を大いに参考にさせていただきました。ありがとうございます! 参考:https://www.youtube.com/watch?v=EYffrAY5CNI

想定する読者

自分と同じく超初心者で、「スクレイピングを初めてやってみよう!」という人向けに書いていきます。ちなみに私はPython触れ始めて1か月の文系大学生です。

環境

Python3.9.6 Windows10 version2004

コードエディタはVScodeを使いました。

いざ、スクレイピング

まずはライブラリの準備

スクレイピングをする際にはいくつかライブラリをインポートする必要があります。

from bs4 import BeautifulSoup
import requests
import time
import pandas as pd 
from os import error

Beautifulsoup・・・webサイトを解析するために必要。

requests・・・PythonからHTTP接続するために必要。

time・・・処理に一定の時間を置くために必要。これを使わないとサーバーに過重な負荷をかけてしまい、サイバー攻撃をしているとみなされる場合があります。

pandas・・・スクレイピングをしたデータをデータフレームにする(データをキレイな形にする)ために使用。

error・・・最後にcsvファイルに落とし込むとき、文字化け対策するのに使いました。

まだこれらのパッケージをインストールしていない人は上のコードを書く前にコマンドプロンプトから「pip install ○○(パッケージ名。今回であればbs4,requests,pandasなど)」と打ち込んでおきましょう。VScodeのターミナルに書いてもokです。

webページを読み込む

ここから、実際にスクレイピングをしていきます。今回は北海道のサンマルクカフェの店舗情報を取りたいのでそのリンクを変数urlとして指定しました。一番下の変数soupはウェブページ全体を抜き出していることを表します。

url = "https://www.saint-marc-hd.com/b/saintmarc/attr/?kencode=01&brand_type=CFE"
r = requests.get(url) #指定したurlに接続
time.sleep(3) #3秒間隔を置く
soup = BeautifulSoup(r.text,"html.parser") #webページのhtmlを解析

次に、ctrl+shift+Iでwebサイトの構造を見ます。こんな感じの画面になります。画面中央上にある矢印マーク(画像の赤丸部分)を押したあと、webページ上の任意の部分にマウスを合わせると、右画面のhtmlに対応部分が表示されます。

Inkedスクレイピング1-1.jpg

まず、店舗情報が書いてある部分全体を抜き出します。今回のwebページにはdivタグのclass=MapiTableWrapInnerのところが該当しそうです。

そして、さきほど抜き出したsoup(webページ全体)の中からfind関数を用いて上記の部分を抜き出します。

ここで注意したいのは「class」という言葉は「if」などと同じようにPythonで既に使用されているので(予約語)、「class」という名前の変数をつけることができません。そのため、以下のコードではclass_としています。

content = soup.find(class_ = "MapiTableWrapInner")

次に、店舗名が書いてあるブロックを探してみます。今回のwebページでは店舗名が書いてあるのはdtというタグのようなので、それを全部抜き出せば店舗名を抜き出せそうです。 ただ、get_dtはhtmlのコードもくっついてきてしまうようです。

#店舗名を全部抜き出したい=dtタグを抜き出す!
get_dt = content.find_all("dt")

なので、店舗名のテキストだけ抜き出して、それをリスト化したいところです。

#店舗名をテキストだけ取り出し、それをリスト化する
shop_names = []
for i in range(len(get_dt)):
    shop_name = get_dt[i].text
    shop_names.append(shop_name)

print(shop_names)

これで、店舗名をテキストのみ抜き出して、リスト化することができました。 同じように、住所や電話番号を抜き出します。

#住所をテキストだけ取り出し、それをリスト化する
get_address = content.find_all(class_ = "MapiInfoAddr")
len(get_address)
shop_addresses = []
for i in range(len(get_address)):
    shop_address = get_address[i].text
    shop_addresses.append(shop_address)

print(shop_addresses)

#電話番号をリスト化し、それをリスト化する
get_tel = content.find_all("li")
get_tel[1].text
len(get_tel)
shop_tels = []
for i in range(len(get_tel)):
    shop_tel = get_tel[i].text
    shop_tels.append(shop_tel)

shop_tels

これで、店舗名・住所・電話番号を抜き出せました。 ここからはエクセルに落とすときにキレイな形になるようにする作業です。

#店舗名、住所、電話番号を辞書型にする
result = {
    "店舗名" : shop_names,
    "住所" : shop_addresses,
    "電話番号": shop_tels
}

result

#データフレームにする
df = pd.DataFrame(result)

データフレームにできたら最後はcsvファイルに落とし込みます。

df.to_csv("309cafe-Hokkaido.csv",index=False,encoding="shift-jis",errors = "ignore")
#shift-jisだとエラーが出てきてしまうので、それは無視する

encodingはWindowsの人はshift-jis、Macの人はutf-8にします。私はWindowsなので、encoding="shift-jis"としたのですが、errorsを指定しないとこんなメッセージが出てしまいました。 スクリーンショット 2021-09-02 194243.png

これは"\xa0"という文字を読み込めないよ!というメッセージです。これを無視して読み込めばよいとのことなので、errors="ignore"と指定してあげればきちんとコードが実行されます。csvファイルを開いてみると、きちんと文字化けなく、スクレイピングした情報も欠損なくきちんと表示されています。 スクリーンショット 2021-09-02 194742.png

以上で今回の記事を終わります。最後まで見てくださりありがとうございました!

Pythonで自動ログイン、ダウンロード、ファイル移動

シゴトがはかどる Python自動処理の教科書 クジラ飛行机 (著) を読んで役に立った部分のメモ

処理の内容は以下の通り 1.ログインが必要なサイトに自動ログイン 2.ダウンロード箇所まで移動 3.ファイル名を指定してダウンロード 4.ダウンロードしたファイルを指定の箇所に移動させる

import shutil, time, requests, urllib, datetime
from bs4 import BeautifulSoup

loginURL = "任意のURL" +  "ログインボタンを押したら追加されるパラメータ" 
userId, password = ("適当なユーザー名", "適当なパスワード")
date = datetime.datetime.now().strftime('%Y%m%d%H%M')
print(date)
fileName = f'./{date}.csv'

def loginDownload():
    session = requests.Session()
    res = session.post(loginURL, params={
        "ログインフォームのユーザー名に対応するnameタグ" : userId,
        "ログインフォームのパスワードに対応するnameタグ" : password
    })
    time.sleep(1)
    url1 = getLink(res.text, "任意のラベル") 
    mypageHTML = session.get(url1).text
    time.sleep(1)
    url2 = getLink(mypageHTML, "任意のラベル")
    download(session, url2)
    print("ダウンロードに成功しました!")
    


def getLink(html, label):
    soup = BeautifulSoup(html, "html.parser")
    for a in soup.find_all("a"):
        if label in a.text:
            url = urllib.parse.urljoin(loginURL, a["href"])
            print("url = ", url)
            return url
    print(label + "が見つかりません")
    quit()

def download(session, csvURL):
    res = session.get(csvURL)
    with open(fileName, "wt") as fp:
        fp.write(res.text)


if __name__ == "__main__":
    loginDownload()
    shutil.move(fileName, "./test")

業務で必要な部分の一部を学ぶことができた。 ダウンロードしたファイルの中身について処理を行う必要があるが、 追々追記予定。

SIerの配属ガチャが怖いから応用情報も取った話

前回の記事で内定者期間に基本情報を取った話をしました。今回は研修期間中に応用情報を取った話をしようと思います。

受験しようと思った動機 タイトルにもある通り配属ガチャが怖いから。

基本情報は研修期間中に取る人がそこそこいた(半分ぐらい?)ので基本情報を持っているだけでは配属ガチャで優位に立てないと思ったから。

学生期間や研修期間は時間があるのに、応用情報に落ちたら「努力できないやつ」と評価されそうだと思ったから(被害妄想)

試験の全体感と学習スケジュール 学習期間:約1.5か月 

学習時間:30時間ぐらい。

スケジュールはこんな感じで進めました。

4月中旬 試験本番

4月上旬~試験一週間前ぐらい 過去問で7割取れるようにする

3月中旬~4月上旬 ひたすら過去問回す

3月上旬~中旬 選択問題を決める

3月上旬 とりあえず午前の過去問を解く

午前対策 正直、基本情報持ってる人なら問題ないかと思われます。

基本情報でも過去の応用情報から出題されてたり、逆に過去の基本情報から応用情報に出てたりしますしね。

いきなり過去問道場やって6割超えたので、すぐに午後対策に移りました。

暇な時にスマホアプリで午前問題の過去問をポチポチやってた感じです。

午後対策 以下を選択しました。

・情報セキュリティ

・経営戦略

・組み込みシステム開発

・情報システム開発

・システム監査

正直、今回の試験は「配属ガチャで有利になるために合格すること」が第一目標だったので役に立てるとかそういう高尚なことは完全に度外視しました。

経営戦略とシステム監査はほぼ勉強しなくても本番の集中力さえあれば解けます。なので、過去問も全然やってません。(1,2回分解いてこれは勉強しなくても大丈夫、というか勉強しても点数が変わらなそうと判断した)

組み込みシステム開発は実はもともと選択する予定ではありませんでした。一応、過去問を2,3回分ぐらい解いて補欠要員として入れてはいたんですけどね。

なんで当日これを選んだかというともともと解く予定だったシステムアーキテクトが1問目から何言ってるかわからず、これはやばいと判断したからです。システムアーキテクトは過去問では簡単な計算問題ばかりだったのでカモだと思ってたんですが、本番で裏切られましたね。

きちんと勉強したのは情報システム開発と情報セキュリティです。

情報セキュリティは基本情報の時同様、知識が重要な単元だとわかっていたので重点的に勉強しました。基本情報に比べて細かめの知識(攻撃方法とその対策などは必須)が問われやすいので、間違えた問題は参考書で復習しました。

情報システム開発はCI/CDとかなんかかっこよさそうなテーマがよく出てたので、興味で勉強してました。ネット上では情報システム開発は避けろとか書かれてますが、知識問題が大半の回と読解が大半の回で二極化していた印象です。

読解の回はカモなので、あとは集中力の問題です。

知識問題に関してはセキュリティと同じように参考書で復習すれば問題ないです。

ネットワークのように参考書にすらのってない用語が無限に問われまくるみたいなことはないので、パターンさえ覚えれば案外大したことないと思います。

試験の結果とまとめ 試験自体は午前午後ともに70点で合格しました。

この記事の内容の薄さからわかる通り、合格という結果だけが残りました。

有益性ゼロです。

正直、基本情報と同じ勉強方法でokなのでわざわざ書くことがないです(笑)

基本情報の知識があれば、ちょっと細かめの知識を追加で覚えればokです。

今度別の資格を受ける時はもっと有意義な勉強をしようと思います。

それでは。

SIerの配属ガチャが怖いから基本情報を取った話

10月に基本情報技術者試験を受けて、11月末に正式に合格発表されたので筆を執りました。

受験した動機

タイトル通り、配属で少しでもプラスになるようにと思った次第です。

会社によっては入社前に取るのが必須とのことですが、私の入る会社は必須というわけではありませんでした。

入社後、4月の試験で取りましょうね(推奨)ぐらいのテンションだと認識しています。

また、内定後イベントやOB訪問では

・配属は割と希望が通りやすい

・実は基本情報を取っていない人もそこそこいる

・資格の有無は配属に影響しない(人事部公式見解)

といった話を小耳にはさんでいたので、正直、配属ガチャのために取らなくても大丈夫そうです。

とはいえ、

・内定後の面談でリクルーターから「基本情報を取っておくと配属希望は通りやすい(意訳)」という話を聞いた

・4月に受験すると基本情報の正式な合格発表が配属面談までに間に合わない可能性がある

・良くも悪くも資格が評価される会社であるという口コミ

・実際に会社のwebサイトでも資格取得人数を掲載している(さすがに基本情報は載ってませんが)

という理由からすぐに取ってしまおうと思い、受験しました。

学習スケジュール

学習期間は2か月程度で、学習時間は100時間程度かなと思います。

8月下旬に勉強開始 10月中旬に午前試験(cbt)を受験 10月下旬に午後試験(cbt)を受験

午前対策と午後対策に充てた時間の比率は2:8ぐらいです。

やったこと

他のサイトに書いてあるようなことを実行しただけなので大したことはしていませんが、一応書いておきます。

午前対策

・最初の10日程度で参考書を1周

・2,3回分過去問道場で演習してみる

スマホアプリで確認

・直前に2,3回分過去問道場で演習

参考書は説明をみながら章末の問題を解いていくやり方で進めました。 いまいち理解できなくてもとにかく一周することを優先しました。

ちなみに参考書は栢木先生のものを使いました。

ネット上ではキタミ式が推奨されていましたが、書店で手に取ってみて絵が多すぎたのが個人的には使いにくいなと思ったので、イラストと文字のバランスがちょうど良い栢木先生の方にしました。

参考書を一読した後、過去問道場の演習で6,7割取れたので、とりあえず午後対策に移ることにしました。

そのあと午前を全くほったらかしたというわけではありませんが、最初の2週間で最低限の知識をインプットした後はにしむら工房というアプリで空き時間にちょくちょく確認しました。そして、午前試験の2,3日前に過去問道場で再確認したという感じです。

午後対策

・選択問題でどれを選ぶか決める

・過去問道場でひたすら演習

この2つですかね。

選択問題は、ソフトウェア設計・データベース・マネジメント系・表計算を勉強しました。

ネットワークとハード/ソフトは午前対策の中でとっつきにくいと感じたので捨てることにしました。

過去問演習をしてみた所感

情報セキュリティ・・・知識重視。知識と読解力があれば時間はかからない(10分~15分程度)

ソフトウェア設計・・・国語力と集中力が必要。知識はそれほど必要ないが、時間がかかる。(30分程度)

データベース・・・知識が必須。知識があれば時間はかからない。(10分程度)

マネジメント系・・・国語力と集中力が必要。商学部なので、あまり勉強しなくても点数取れそうだと感じた。(所要時間は20~30分)

表計算・・・知識と国語力と集中力が必要。面倒くさい。当日Pythonがいけなさそうなとき用の保険で勉強。

アルゴリズム・・・国語力と集中力が最も必要。演習必須。

2回分ぐらい解いてみてソフトウェア設計とマネジメント系は国語力さえあれば何とかなると判断し、あまり勉強しないことにしました。

アルゴリズムは最初解いたときは3割ぐらいしか取れなかったので、過去問道場にあるものをひたすら演習しました。

情報セキュリティとデータベースは知識さえあればいけると判断したので、アルゴリズムの休憩がてら情報セキュリティとデータベースの演習をしました。

試験の所感

IPAの規約により詳しいことは言えないのですが、午前試験は思ったより初見の問題が多く難しいと感じました。スコアレポートでは71.25点でした。

午前試験の結果。結構苦戦してます。

一方で、午後試験は易しめだったと感じました。ハード・ソフトはあまり対策していなかったのですが、問題を見てこれはいけると判断してハード・ソフトを選択し、解く予定だったソフトウェア設計を捨てました。

逆にPythonを解こうとしたのですが、残り時間を加味してちょっと時間がかかりそうだと判断し、表計算で手堅く半分ぐらい点数を取りました。

序盤は時間的に余裕だったのですが、アルゴリズムで慎重になりすぎた結果、後半時間が押しました。

体感では60点いったかどうかぐらいかなと思っていましたが、アルゴリズムで健闘したのでスコアレポートでは76.5点とれました。

午後試験の結果。Pythonを途中で諦めたのが不覚。

今後に向けて

とりあえず、基本情報受かりましたと会社に報告しました。

基本情報に受かった人は4月の応用情報の受験が必須らしいので、応用情報も取得しようと思います。

応用まで取って、研修でも良い成績を残せればだいぶ配属希望が通りやすくなるのではないかと考えていますが、これで配属ガチャ失敗したら落差がやばそうなので、あまり期待はしないように心掛けていきます。

とまあ、長くなりましたがこんな感じで筆を置きたいと思います。

参考文献

基本情報技術者(FE)の午後問題で70点以上を取るための勉強方法

基本情報技術者試験の表計算に出題される関数一覧とExcelを用いた簡単な練習方法 - わえなび ワード&エクセル問題集 waenavi

基本情報技術者試験ドットコム