Webスクレイピングを使って、「朝までハシゴの旅」のロケ地を一覧化してみた
はじめに
皆さんは、「笑ってコラえて」という番組の「朝までハシゴの旅」というコーナーをご存知でしょうか?
僕はお酒を飲むのが好きで、朝まで居酒屋をハシゴしまくるのに憧れています。それもあってか「朝までハシゴの旅」のコーナーが好きなんです。
あと、今年上京してきたので東京の飲み屋街とかにもあまり知識がありません。駅名は聞いたことあっても、それが東京都のどこら辺にあって、どれくらい賑わっているのか、とかが分かんないんです。
なので、テレビを通してその街の雰囲気が伝わってくるのがすごい好きなんですね。
ということで、これまでのロケ地を調べようと思ったんです。が、どこにもまとめられていませんでした。(自分が調べた限りでは)
で、それをまとめるには、番組のバックナンバーというページから、それぞれの放送日のあらすじが書いてあるページに飛んで、そのあらすじの文章中にある朝までハシゴの旅のロケ地を抜き出して、それを全放送分繰り返すのです。
わざと冗長に書きましたが、これを自力でやるのはさすがにめんどくさいです。
じゃあプログラム書いて自動でやったろう、というのが今回の経緯です。
プログラミング
実行環境
Windows10
Python 3.6.2
Anaconda
ライブラリのインポート
import csv import re import bs4 from urllib import request
今回Webスクレイピングに使ったのは、BeautifulSoupとurllib.requestです。
BeautifulSoupはAnacondaに入っていて、コード中のbs4がそれです。urllibはPythonの標準ライブラリです。
csvはファイル出力、reは文字列の検索に使いました。
ちなみにWebスクレイピングは初挑戦で解説サイトを見ながらコーディングしたのですが、僕が見たサイトはどれもPython 2.7でやってました。Python3用に自分でちょっと変えながらコーディングしたので、そこらへんも参考になるかもしれないです。
バックナンバーのページのHTMLを取得
笑ってコラえてのバックナンバーのページをBeautifulSoupで扱います。
url = "http://www.ntv.co.jp/warakora/next/backnumber.html" html = request.urlopen(url) soup = bs4.BeautifulSoup(html, "html.parser")
各放送日のページのHTMLを取得
ページのHTMLからliタグを全て抜き出します。
tag = soup.find_all("li")
それが下のようになっていて、各行がリストの要素となってtagリストに格納されています。
<li class="heightLine"><a href="20180801.html">2018年8月1日</a></li> <li class="heightLine"><a href="20180725.html">2018年7月25日</a></li> <li class="heightLine"><a href="20180718.html">2018年7月18日</a></li>
ここから、"20180801.html","20180725.html","20180718.html"...というのを抜き出します。
urllist = [] for i in tag: urllist.append("http://www.ntv.co.jp/warakora/next/" + i.a.get("href"))
これでそれぞれの放送日のURLをリストに入れることが出来ました。
朝までハシゴの旅コーナーがある放送のあらすじと放送日を取得
各放送日のURLをforで回して、開いていきます。
HTML内にハシゴという単語があるかどうかで、その日の放送に朝までハシゴの旅のコーナーがあるかどうかを判定します。
コーナーがある場合、コーナーのあらすじとその日付をそれぞれ別のリストに追加します。
hashigo_str = [] date = [] for j in urllist: url2 = j html2 = request.urlopen(url2) soup2 = bs4.BeautifulSoup(html2, "html.parser") hashigo = soup2.find("h3", text=re.compile("ハシゴ")) if bool(hashigo): hashigo_str.append(str(hashigo.find_next())) date.append(re.sub(r'\D', '', j))
dateというリストには朝までハシゴの旅コーナーを放送した日付が、hashigo_strというリストには日付と同じ順番でコーナーのあらすじが入っています。
このあらすじにはコーナーの出演者や場所などが書かれています。
ファイルに出力
とりあえずこのあらすじをファイルに出力します。
hashigo_list = [] hashigo_list.append(date) hashigo_list.append(hashigo_str) with open('file.csv', 'w', encoding='CP932', errors='replace') as f: writer = csv.writer(f, lineterminator='\n') writer.writerows(hashigo_list)
dateとhashigo_strをリストに入れ、このリストをcsv形式でファイル出力します。
エラー処理
open関数内のencoding='CP932', errors='replace'
がないと、
UnicodeEncodeError: 'cp932' codec can't encode character '\u2661' in position 11633: illegal multibyte sequence
というエラーが発生します。
これはHTML内に出てくる「♡」がCP932という文字コードでは使えないことで起こるエラーです。
このエラーを回避するために、encoding='CP932', errors='replace'
を加えます。
文字コードはそのままCP932を使いますが、もし文字コードに対応してない文字が現れたときにその文字を「?」に置換するようになります。
場合によっては文字を置換せずにそのまま使いたかったりするので、文字コードを変更したりすることも考えなくてはいけません。
Webスクレイピングを行う際には、プログラムの実行環境とHTMLで文字コードが違い、エラーがよく出るみたいなので、気を付けなきゃいけないですね。
実行結果
放送日 | ロケ地1 | ロケ地2 |
---|---|---|
2018年8月1日 | 溜池山王駅 | |
2018年7月18日 | 神奈川鶴見駅 | |
2018年6月20日 | 亀有駅 | |
2018年6月6日 | 下北沢 | |
2018年5月9日 | 浅草・隅田公園 | |
2018年5月2日 | 大森駅 | |
2018年4月11日 | 御徒町駅 | |
2018年3月28日 | 鶯谷駅 | |
2018年1月24日 | 亀戸駅 | |
2018年1月17日 | 奄美大島 | |
2017年12月27日 | 水道橋 | |
2017年11月22日 | 銀座 | |
2017年11月8日 | 秋山渓谷 | |
2017年11月1日 | 両国 | |
2017年10月11日 | 東中野 | |
2017年8月16日 | 板橋駅 | |
2017年8月2日 | 新宿三丁目 | |
2017年6月28日 | 八王子駅 | |
2017年6月21日 | 新小岩 | |
2017年5月31日 | 隅田公園 | |
2017年5月3日 | 王子駅 | |
2017年4月26日 | 溝の口 | |
2017年4月12日 | 広島駅 | |
2017年3月8日 | 愛媛県松山 | |
2017年2月22日 | 幡ヶ谷駅 | |
2017年2月8日 | 大門駅 | |
2017年2月1日 | 大井町 | |
2017年1月11日 | 自由が丘駅 | |
2016年12月28日 | (過去のVTR) | |
2016年11月2日 | 湯島駅 | |
2016年10月5日 | 五反田 | |
2016年9月21日 | 葛西駅 | |
2016年9月14日 | 成増 | |
2016年8月24日 | 鹿児島県天文館 | |
2016年8月3日 | 大阪 | |
2016年7月6日 | 江古田 | |
2016年6月15日 | 蒲田 | |
2016年5月18日 | 練馬 | |
2016年5月4日 | 荻窪 | |
2016年4月27日 | 隅田公園 | |
2016年4月13日 | 別府 | |
2016年3月2日 | 国分寺 | |
2016年2月17日 | 武蔵小山 | |
2016年1月20日 | 赤羽 | |
2016年1月13日 | 札幌 | 沖縄 |
2015年12月30日 | 石垣島 | |
2015年11月18日 | 阿佐ヶ谷駅 | |
2015年11月4日 | 経堂駅 | |
2015年10月14日 | 四ツ谷駅 | |
2015年10月7日 | 横浜 | |
2015年9月9日 | 京都 | |
2015年8月19日 | 調布 | |
2015年8月12日 | 三田駅 | |
2015年8月5日 | 日本橋 | |
2015年7月29日 | 博多中洲 | |
2015年7月8日 | 阿佐ヶ谷駅 | 大塚駅 |
2015年5月27日 | 吉祥寺 | |
2015年5月20日 | 大井町駅 | |
2015年5月6日 | 隅田公園 | |
2015年4月22日 | 学芸大学駅 | |
2015年4月15日 | 金沢 | |
2015年3月18日 | 札幌 | 那覇 |
2015年3月4日 | 三軒茶屋 | |
2015年2月25日 | 中井駅 | |
2015年2月18日 | 目黒駅 | |
2015年2月11日 | 門前仲町 | |
2015年2月4日 | 赤坂駅 | |
2015年1月21日 | 大宮駅 | |
2014年12月10日 | 中野駅 | |
2014年12月3日 | 蒲田駅 | |
2014年11月5日 | 浅草 | |
2014年10月29日 | 小岩 | |
2014年10月8日 | *立川 | |
2014年9月17日 | 新橋駅 | |
2014年9月10日 | 仙台 | |
2014年8月20日 | 高円寺 | |
2014年8月13日 | 上野 | |
2014年7月30日 | 北千住 | |
2014年7月16日 | 錦糸町 | |
2014年6月18日 | 恵比寿 | |
2014年5月21日 | 神田駅 | |
2014年5月14日 | 町田駅 | |
2014年5月7日 | 大崎駅 | |
2014年4月9日 | 西荻窪駅 |
正確にはプログラムの実行結果ではありません。あらすじから地名や駅名を抜き出すのは手動でやりました。
あらすじをWebから引っ張ってきてまとめやすくすることを今回のプログラムの目標とさせてください。
自然言語処理系の機械学習は経験があるので、あらすじから地名や駅名を抜き出す処理も自動化してみたいとも思ってますが、それはまた今度ということで!