連休ももうすぐ終わってしまいます。なんか、ブログ書けないかなと思って、興味のあったスクレイピングをやってみました。最初、pythonでやっていたのですが、pythonだと定期的に通知することがちょっとむずかしい(常時立ち上げ等)ので、今回はGASを使ってみました。GASは、GoogleAppsScriptであり、Googleが開発・提供しているプログラミング言語です。JavaScriptというWebブラウザ上で動作するプログラミング言語がベースになっています。
書いたコードは下記のとおり。コメントは記入のとおり。
//交通取り締まり情報をline notifyに通知する
function test_myfun() {
//新聞が掲載しているので、新聞のurlを指定する。
//letなのでこのブロックのみの変数となる。
let url = "https://www.***********.co.jp/category/news-****/
//上記のurlのソースを取得する。
let html = UrlFetchApp.fetch(url).getContentText("utf-8")
//urlデータを抜き取りする。"<a href=" ~ "</a>"の間をとってくる。
//iterate()は複数を取得。リストになる。
let newsList = Parser.data(html)
.from ("<a href=")
.to("</a>")
.iterate();
//日付を取得する
。Dateはクラスなので、newでインスタンスするみたい。
var d = new Date()
// 数字を文字列にする。
// Logger.log((d.getMonth()+1).toString())
// Logger.log((d.getDay()+1).toString())
m = (d.getMonth()+1).toString()
d = (d.getDay()+1).toString()
//半角を全角化する
if(m.match(/[0-9]/g)){
m = m.replace(/[0-9]/g,
String.fromCharCode(m.charCodeAt(0) + 0xFEE0))
}
if(d.match(/[0-9]/g)){
d = d.replace(/[0-9]/g,
String.fromCharCode(d.charCodeAt(0) + 0xFEE0))
}
md = m + "月" + d + "日"
//Logger.log(md)
//上記で取得したハイパーリンク別のデータを確認する。
//newsListの配列数すべてを実施する。
for(var i = 0 ; i < newsList.length; i++){
//確認用 newsListの中身を出力
// Logger.log("news::::"+newsList[i]);
// 日付を含んだ情報を判定し、している場合、titleとハイパーリンク先を取得する。
if(newsList[i].match(md)){
var title = Parser.data(newsList[i])
.from ("title\">").to("<")
.iterate();
var hylink = Parser.data(newsList[i])
.from ("\"").to("\"")
.build();
}
}
//確認用 title,hylinkの中身を出力
// Logger.log("hylink:::"+hylink)
// Logger.log("title:::"+title[0])
//直接入力するurlがわからないため、上記の方法で日別のurlを取得している。
//取得したurlで当日の取り締まり情報を取得する。
//抜き取りの仕方は上記と同じ。
url = "https://www.****************.co.jp"+hylink
// Logger.log(url)
html = UrlFetchApp.fetch(url).getContentText("utf-8")
// Logger.log(html)
let news = Parser.data(html)
.from ("<meta name=\"description\" content=\"")
.to("\" />")
.build();
//確認用 中身を出力
// Logger.log(news)
var mes = news.split(" ")
for(let i in mes){
//確認用 中身を出力
// Logger.log(mes[i])
}
// line notify に通知する。
let line_url = "https://notify-api.line.me/api/notify"
let access_token = '**************************'
let options = {
"method": "post",
"payload": {"message":"交通取り締まり情報\n"+md+"\n"+mes[1]+"\n"+mes[2]+"\n"+mes[3]+"\n"+mes[4]},
"headers": {
"Authorization": "Bearer " + access_token }
}
UrlFetchApp.fetch(line_url,options);
}
ライブラリを使用しています。Parserライブラリが必要です。インストールのIDは下記のとおり。(出典:https://specially198.com/scraping-with-gas-using-parser-library/)
1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
Parserを使うとfromとtoで抜き取り箇所を指定できるようになります。
linenotifyは、アクセストークンの発行が必要になります。access_tokenの部分を発行したトークンに修正してください。
情報ができましたら、あとは、トリガーをかけるだけ。

トリガーを追加をクリックして、下記の状態を保存すれば完了。デプロイとは、urlで使用できるようにすることで、実行するデプロイとは、バージョンを決めることになります。バージョンが分かれていなければ、最新(Head)が選択されます。


このように通知がくるようになります。
このように、ネットの情報を必要な部分だけ、定期的に送ることができるようになります。GASだと、サーバーもたてなくていいので楽ですしね。
発信者のhtml内容が変わると変更が必要ですが、欲しい情報を定期的に知れるのはよいのではないでしょうか?
連休が終わってしまう。。。
ラズパイ使ってみたいので、やってみようかな~。