副業プログラミングで勉強しよう!
実際に稼いでる方もいると思いますが、私は全然副業してません(笑)
ただ、プログラミングの勉強するのに、
なにか作りたいものがあるとか目標があれば良いんですけど、
なかなかないですよね。
なのでお金も稼いで、プログラミングも勉強しちゃいましょう!
(ランサーズとかクラウドワークスとかありますね、足元みているような方もいますし、この依頼閉め切っちゃいました~ところでこんな依頼あるよ?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円!!!かあ
相場はよくわかりません!!!
コード説明はコメントいただけたら付け加えます
0 件のコメント:
コメントを投稿