質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

799閲覧

【Ruby】【cron】cronだとうまくいかない

jiaetakoga

総合スコア96

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2020/08/02 14:45

編集2020/08/03 13:09

県別のコロナのHPが更新された時だけLINE通知する仕組みを作っています。

ターミナルより

Ruby

1ruby korona_check.rb

と実行した場合、ページが更新されていない時は通知されませんが、
cronで実行するとページが更新されていなくても通知が来ます。
※ifの判定結果が正しく作動していないようです

対応方が分かればご教示ください。

ruby

1#!/usr/bin/env ruby 2#-*- coding: utf-8 -*- 3 4require "open-uri" 5require "nokogiri" 6require 'net/http' # LINE 7require 'uri' # LINE 8 9url = "https://www.pref.shizuoka.jp/kinkyu/covid-19-keikailevel.html" 10charset = nil 11 12# open-uriにてdom読み込み 13html = open(url) do |f| 14 charset = f.charset 15 f.read 16end 17 18# 読み込んだものから、Nokogiri でスクレイピング 19contents = Nokogiri::HTML.parse(html,nil,charset) 20list = [] 21contents.xpath('//h1').each do |tr| 22 tr_content = tr.content 23 list.push(tr_content) 24end 25 26# textファイル(設定ファイル)の読み込み 27f = File.open("/Users/ユーザー名/Desktop/korona/config.txt") 28s = f.read 29 30# ファイルの書き込み 31def txt_write(content) 32 File.open("config.txt", mode = "w") {|f| 33 f.write(content) 34 } 35end 36 37# ラインのメッセージ送信 38 39class LineNotify 40 TOKEN = 'トークンが入ります'.freeze 41 URL = 'https://notify-api.line.me/api/notify'.freeze 42 43 attr_reader :message 44 45 def self.send(message) 46 new(message).send 47 end 48 49 def initialize(message) 50 @message = message 51 end 52 53 def send 54 Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |https| 55 https.request(request) 56 end 57 end 58 59 private 60 61 def request 62 request = Net::HTTP::Post.new(uri) 63 request['Authorization'] = "Bearer #{TOKEN}" 64 request.set_form_data(message: message) 65 request 66 end 67 68 def uri 69 URI.parse(URL) 70 end 71end 72 73# 更新日が前回と同じ(txtファイルの中身)と違う場合のみ通知 + txtファイルの更新日を上書き 74if list[1] != s 75 LineNotify.send("\n" + "【更新】#{list[1]}" + "\n" + "#{url}") 76 txt_write(list[1]) 77end

cron

1*/1 * * * * ruby /Users/ユーザー名/desktop/korona/korona_check.rb 2# 今回は仮に1分間隔としています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

cron

1*/1 * * * * export LANG=ja_JP.UTF-8; /Users/ユーザー名/.rbenv/shims/ruby /Users/ユーザー名/desktop/PATH/TO/ITEMS.rb

で解決しました。

投稿2020/08/05 11:57

jiaetakoga

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

f = File.open("/Users/ユーザー名/Desktop/korona/config.txt")

で、"/Users/ユーザー名/Desktop/korona/config.txt"を読んで、その後、

File.open("config.txt", mode = "w") {|f|

で、"/Users/ユーザー名/config.txt"に書いてますけど、それがおかしいのでは?

投稿2020/08/02 15:43

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jiaetakoga

2020/08/02 20:12

ご回答ありがとうございます。 確かに書き方が変でしたので、統一しました。 しかし、ターミナルより実行した場合はうまくいき、cronになるとダメでした。 そもそもうまく読み込んでいませんでした、、
otn

2020/08/03 00:22

> cronになるとダメでした。 どうなるのでしょうか? > そもそもうまく読み込んでいませんでした、 何をですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問