marcy's Lab

理系大学生のブログ

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から引っ張ってきてまとめやすくすることを今回のプログラムの目標とさせてください。

自然言語処理系の機械学習は経験があるので、あらすじから地名や駅名を抜き出す処理も自動化してみたいとも思ってますが、それはまた今度ということで!