副業プログラミングで勉強しよう!part1

20220531

python 副業

t f B! P L

副業 プログラミング python

副業プログラミングで勉強しよう!

実際に稼いでる方もいると思いますが、私は全然副業してません(笑)
ただ、プログラミングの勉強するのに、
なにか作りたいものがあるとか目標があれば良いんですけど、
なかなかないですよね。

なのでお金も稼いで、プログラミングも勉強しちゃいましょう!
(ランサーズとかクラウドワークスとかありますね、足元みているような方もいますし、この依頼閉め切っちゃいました~ところでこんな依頼あるよ?botみたいな詐欺ちっくな人が結構いる印象なので、私はあまりすきではありません。なので勉強としてやっています。)

実践的な課題に取り組んでみよう

なにが良いって
もちろんお金が稼げることも良いですが、
実際にやってほしいこと(問題、課題)を提示されて、それを解決する
ということができます。

問題解決力って重要だと思います。
プログラミングの力もつくし、働くことにおいて最重要なことも学べます。

さっそくやってみる

ランサーズ 副業 依頼サンプル

上記の依頼がありました。
今回はこれを実践してみます。ちなみに5000円もらえるらしいです

なんでも良いと思うのですが、
今回はpythonでやります。

環境構築等の説明は今回はしません。
というかさっぱりいきます(笑)

また、実際に依頼は受けていないため、わからないところは想定で動きます。

ざっくりやること頭出し

プログラムを作ってほしい(データだけほしいわけではない)
Excelファイルに出力したい
特定のサイトの情報がほしい(はてなブログ)
日時で期間指定をしたい
データ項目としては、閲覧数、記事タイトル、記事のURLがほしい
こんな感じでしょうか。

入力部分を作るよ!

def get_args():
    # 準備
    parser = argparse.ArgumentParser()

    parser.add_argument("--u", help="スクレイピングしたいベースURL", required=True, type=str)

    parser.add_argument("--t", help="いつまで取得するか(yyyymmdd)", type=valid_date)
    parser.add_argument("--f", help="いつから取得するか(yyyymmdd)", type=valid_date)

    # 結果を受ける
    args = parser.parse_args()

    return(args)
def get_args():
    # 準備
    parser = argparse.ArgumentParser()

    parser.add_argument("--u", help="スクレイピングしたいベースURL", required=True, type=str)

    parser.add_argument("--t", help="いつまで取得するか(yyyymmdd)", type=valid_date)
    parser.add_argument("--f", help="いつから取得するか(yyyymmdd)", type=valid_date)

    # 結果を受ける
    args = parser.parse_args()

    return(args)

argparseというライブラリを使用して、

python main.py --u "https://www.aichan-engineer.com/" --f 20220511 --t 20220529
python main.py --u "https://www.aichan-engineer.com/" --f 20220511 --t 20220529

みたいに実行できように!

add_argumentの説明は以下。
required=Trueにすると、必須パラメータになる。
typeは、入力パラメータのバリデーションを指定できます。
type=valid_dateとなってますが、関数も渡せます。(valid_dateは関数です。)
valid_dateは以下。

def valid_date(s):
    LIMIT_LENGTH = 8
    DATE_FORMAT = "%Y%m%d"
    try:
        # 2001012->2001-01-02に変換可能なため、はじいておく
        if len(s) < LIMIT_LENGTH:
            raise ValueError
        return datetime.datetime.strptime(s, DATE_FORMAT)
    except ValueError:
        msg = "not a valid date: {0!r}".format(s)
        raise argparse.ArgumentTypeError(msg)
def valid_date(s):
    LIMIT_LENGTH = 8
    DATE_FORMAT = "%Y%m%d"
    try:
        # 2001012->2001-01-02に変換可能なため、はじいておく
        if len(s) < LIMIT_LENGTH:
            raise ValueError
        return datetime.datetime.strptime(s, DATE_FORMAT)
    except ValueError:
        msg = "not a valid date: {0!r}".format(s)
        raise argparse.ArgumentTypeError(msg)

入力部分を呼ぶときは、以下のように呼べます。

def main():
    args = get_args()

    URL = args.u
    DATE_TO = args.t
    DATE_FROM = args.f
def main():
    args = get_args()

    URL = args.u
    DATE_TO = args.t
    DATE_FROM = args.f

スクレイピングするよ!

Seleniumをつかいます。BeautifulSoupを使ってもよかです。
サイトにアクセス

def access_site(siteurl):
    '''
        サイトにアクセスするメソッド
        siteurl: サイトのURL
    '''
    driver.get(siteurl)
    time.sleep(2) # 2秒待機
def access_site(siteurl):
    '''
        サイトにアクセスするメソッド
        siteurl: サイトのURL
    '''
    driver.get(siteurl)
    time.sleep(2) # 2秒待機

サイトに負荷かけないようにね、、、心配しすぎくらいがちょうどよいです。

要素取得

def get_element_list():
    return driver.find_elements_by_class_name("entrylist-contents-main")
def get_element_list():
    return driver.find_elements_by_class_name("entrylist-contents-main")

欲しい要素をバコーンとリストで取得

閲覧数取得

def get_view_number(element):
    view_number = element.find_element_by_tag_name("span").text
    view_number = view_number.replace(" USERS", "")
    return view_number
def get_view_number(element):
    view_number = element.find_element_by_tag_name("span").text
    view_number = view_number.replace(" USERS", "")
    return view_number

邪魔な文字列が入っているので削除

タイトル取得

def get_title(element):
    return element.find_element_by_tag_name("a").get_attribute("title")
def get_title(element):
    return element.find_element_by_tag_name("a").get_attribute("title")

URL取得

def get_url(element):
    return element.find_element_by_tag_name("a").get_attribute("href")
def get_url(element):
    return element.find_element_by_tag_name("a").get_attribute("href")

スクレイピング本元

def scrape(siteurl):
    df = pd.DataFrame(columns=["title", "viewer", "url"])

    access_site(siteurl)
    element_list = get_element_list()
    
    for element in element_list:
        view_number = get_view_number(element)
        title = get_title(element)
        url = get_url(element)
        df = df.append({"title": title, "viewer": view_number, "url": url}, ignore_index=True)
    
    return df
def scrape(siteurl):
    df = pd.DataFrame(columns=["title", "viewer", "url"])

    access_site(siteurl)
    element_list = get_element_list()
    
    for element in element_list:
        view_number = get_view_number(element)
        title = get_title(element)
        url = get_url(element)
        df = df.append({"title": title, "viewer": view_number, "url": url}, ignore_index=True)
    
    return df

値を入れておく入れ物はpandasのDataFrameを使いました。便利

Excelファイル出力するよ!

def toExcel(df, sheet_title):
    with pd.ExcelWriter(r"./output/output.xlsx", mode='a') as writer:
        df.to_excel(writer, sheet_name=sheet_title, index=None)
def toExcel(df, sheet_title):
    with pd.ExcelWriter(r"./output/output.xlsx", mode='a') as writer:
        df.to_excel(writer, sheet_name=sheet_title, index=None)

pandasに標準装備されているのを使う

最後にまとめるよ!

def main():
    """
        調べた感じurlの下限と上限は以下だった
        下限:https://b.hatena.ne.jp/hotentry/all/20050210
        上限:今日-1日
    """
    try:
        args = get_args()

        URL = args.u
        DATE_TO = args.t
        DATE_FROM = args.f

        tdate = datetime.date(DATE_TO.year, DATE_TO.month, DATE_TO.day)
        fdate = datetime.date(DATE_FROM.year, DATE_FROM.month, DATE_FROM.day)
        drange = abs(tdate - fdate).days

        df = pd.DataFrame()
        for i in range(drange + 1):
            date = DATE_FROM + datetime.timedelta(i)
            datestr = date.strftime('%Y%m%d')
            tmp_df = scrape.scrape(URL+datestr)
            df = df.append(tmp_df, ignore_index=True)
            print(datestr)

        sheet_title = DATE_FROM.strftime('%Y%m%d') + "から" + DATE_TO.strftime('%Y%m%d') + "までのデータ"
        export.toExcel(df, sheet_title)
    finally:
        scrape.close()
def main():
    """
        調べた感じurlの下限と上限は以下だった
        下限:https://b.hatena.ne.jp/hotentry/all/20050210
        上限:今日-1日
    """
    try:
        args = get_args()

        URL = args.u
        DATE_TO = args.t
        DATE_FROM = args.f

        tdate = datetime.date(DATE_TO.year, DATE_TO.month, DATE_TO.day)
        fdate = datetime.date(DATE_FROM.year, DATE_FROM.month, DATE_FROM.day)
        drange = abs(tdate - fdate).days

        df = pd.DataFrame()
        for i in range(drange + 1):
            date = DATE_FROM + datetime.timedelta(i)
            datestr = date.strftime('%Y%m%d')
            tmp_df = scrape.scrape(URL+datestr)
            df = df.append(tmp_df, ignore_index=True)
            print(datestr)

        sheet_title = DATE_FROM.strftime('%Y%m%d') + "から" + DATE_TO.strftime('%Y%m%d') + "までのデータ"
        export.toExcel(df, sheet_title)
    finally:
        scrape.close()

仕事じゃないからね!エラーハンドリングてきとーだね!!!

結果みてみるよ!

出力結果

タイトルにURLはいっているみたいに見えるけど、
本当に元のサイトにも入っているのよ、、、
出力結果

まあいいよいいよ、気にしない!仕事じゃないからね!!!

最後に

これで5000円!!!かあ
相場はよくわかりません!!!
コード説明はコメントいただけたら付け加えます

このブログについて

技術的に悩んだこと、やってみたことを書き溜めています。自身の復習のため、また同じ悩みがある方は参考にできるような書き方にしていきます。 趣味の競馬AI開発と競馬AIでの予想も公開していきます。 金曜日に土曜日の中央競馬(JRA)全レース予想、土曜日に日曜日の中央競馬(JRA)全レース予想を公開する予定です。

Tags

Golang (1) JavaScript (9) python (2) 機械学習 (6) 競馬 (339) 副業 (2)

注目の投稿

2023/05/28(日) 競馬AI予想(東京競馬場)

このブログを検索

アーカイブ

投稿者情報

TANDE競馬のあいちゃんのアイコンです

はじめまして。あいちゃんです。雑魚エンジニアです。趣味で機械学習をやっています。日々の勉強としてアウトプットしていきます。

QooQ