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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

Q&A

解決済

3回答

5851閲覧

あるサイトに保存されているPDFファイルが更新されたことを知る方法はありますか?

rickey

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

0グッド

0クリップ

投稿2018/04/05 00:09

編集2018/04/05 02:38

【背景】法律や条例等が更新されたことを知りたく、全都道府県の複数の法律の関するページを開き、1つ1つPDFを開いてはその更新日を見て、更新されているかを確認しています。膨大な数のHPのPDFを1つ1つ開くのが大変なので、「どのページのどのPDFが更新されたかがわかることができれば、あとはそれだけを開いて確認する」という方法ができれば時間短縮できると考えました。

【現在やったこと】市や県のHPで、内容が更新された場合、そのページの上部に更新日が書いてあることが多くそれをウェブスクレイピングするEXCEL VBAで、ページが更新されたことはわかるようにできました。
しかし、そこに保存されている目的のPDFファイルが新しくなったかは、やはり一度開いて見ないとわからない現状です。

例えば、保存しているファイルの名前があって、その名前を保存しておき、ファイルが変わった時にファイル名が変わっていれば、その違いでファイルが更新したことがわかる、とかそんなことができるのでしょうか?
何か他に方法をご存知でしたら教えてください。
↓参考までに、そのページが更新されたかをを知るのに下記のコードを作りました。
開くとこの中にたくさんのPDFがあることがわかります。
もしアイディア等あればご教授ください。

excel

1Sub 岡山県() 2Dim objIE As InternetExplorer 3 4Call ieView(objIE, "http://www.pref.okayama.jp/page/detail-3445.html") 5ThisWorkbook.Sheets(1).Cells(10, 8) = objIE.document.getElementById("content_header").Children(1).innerText 6 7End Sub 8 9'①指定URLを表示するサブルーチン「ieView」 10Sub ieView(objIE As InternetExplorer, _ 11 urlName As String, _ 12 Optional viewFlg As Boolean = True, _ 13 Optional ieTop As Integer = 0, _ 14 Optional ieLeft As Integer = 0, _ 15 Optional ieWidth As Integer = 600, _ 16 Optional ieHeight As Integer = 800) 17 18 'IE(InternetExplorer)のオブジェクトを作成する 19 Set objIE = CreateObject("InternetExplorer.Application") 20 21 With objIE 22 'IE(InternetExplorer)を表示・非表示 23 .Visible = viewFlg 24 .Top = ieTop 'Y位置 25 .Left = ieLeft 'X位置 26 .Width = ieWidth '幅 27 .Height = ieHeight '高さ 28 29 '指定したURLのページを表示する 30 .navigate urlName 31 32 End With 33 'IE(InternetExplorer)が完全表示されるまで待機 34 Call ieCheck(objIE) 35 36End Sub 37 38'②Webページ完全読込待機処理サブルーチン「ieCheck」 39Sub ieCheck(objIE As InternetExplorer) 40 41 Dim timeOut As Date 42 43 timeOut = Now + TimeSerial(0, 0, 20) 44 45 Do While objIE.Busy = True Or objIE.readyState <> 4 46 DoEvents 47 Sleep 1 48 If Now > timeOut Then 49 objIE.Refresh 50 timeOut = Now + TimeSerial(0, 0, 20) 51 End If 52 Loop 53 54 timeOut = Now + TimeSerial(0, 0, 20) 55 56 Do While objIE.document.readyState <> "complete" 57 DoEvents 58 Sleep 1 59 If Now > timeOut Then 60 objIE.Refresh 61 timeOut = Now + TimeSerial(0, 0, 20) 62 End If 63 Loop 64 65End Sub

【アドバイスを受けて試したこと】

excel

1Sub 岡山() 2Dim objIE As InternetExplorer 3Call ieView(objIE, "http://www.pref.okayama.jp/page/detail-3445.html") 4ThisWorkbook.Sheets(1).Cells(10, 8) = objIE.document.getElementById("content_header").Children(1).innerText 5Call GetLastModified(URL, "http://www.pref.okayama.jp/page/detail-3445.html") 6End Sub 7 8Function GetLastModified(URL As String) As String 9Dim httpReq As Object 10Set httpReq = CreateObject("MSXML2.XMLHTTP") 11httpReq.Open "GET", URL, False 12httpReq.send 13 14GetLastModified = httpReq.getResponseHeader("Last-Modified") 15Set httpReq = Nothing 16End Function

知識不足でエラーで動かなかったので
MSXML2.XMLHTTPで検索し、
https://tonari-it.com/excel-vba-http-request/
のサイトと回答者様のアドバイスを参考に以下のコードを作成。

excel

1Sub 読み込む() 2 Dim GetLastModified As String 3 Dim httpReq As Object 4 Set httpReq = CreateObject("MSXML2.XMLHTTP") 5 httpReq.Open "GET", "http://www.pref.okayama.jp/page/detail-3445.html", False 6 httpReq.send 7 GetLastModified = httpReq.getResponseHeader("Last-Modified") 8 Debug.Print GetLastModified 9 Set httpReq = Nothing 10End Sub

Wed, 04 Apr 2018 19:04:26 GMT
を出力することができた。

これが意味するところがなんだかわかりません。
おそらく、更新されたものがあるってことなのか?
このページにある全てのPDFについて更新日をチェックするには
どのようにすればいいんでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

HTTP ヘッダーに 'Last-Modified: ' がありますので、HTTP ヘッダーを取得して、Last-Modified: をチェックすれば、ファイルの更新日を確認できると思います。
(なお、Last-Modified は、ファイルの中身が変わっていなくても上書き保存してアップロードした場合等に更新される場合もあります。)

確認のために、質問に記載されているURL先の PDF ファイルを curl コマンドで、HTTP レスポンスを確認してみると Last-Modified: が取得できました。

$ curl --head -A "Mozilla/5.0" http://www.pref.okayama.jp/hoken/seiei/suidou/suido_pdf/03_shoukibo_youryou.pdf HTTP/1.1 200 OK Date: Thu, 05 Apr 2018 00:22:10 GMT Server: Apache Last-Modified: Fri, 19 Apr 2013 05:40:48 GMT ETag: "10c65-4dab0293ff800" Accept-Ranges: bytes Content-Length: 68709 Connection: close Content-Type: application/pdf

VBAの場合、MSXML2.XMLHTTP を使うことで、http ヘッダを取得できると思います。参照設定で追加してください。

テストしていませんが、コードとしては、こんな感じでしょうか。(エラーチェックとか入れていないので、URLやファイルがない場合等にエラーが発生すると思いますので、適宜追加してください。)

VBA

1Function GetLastModified(URL As String) As String 2 Dim HttpReq As Object 3 Set HttpReq = CreateObject("MSXML2.XMLHTTP") 4 HttpReq.Open "GET", URL, False 5 HttpReq.send 6 GetLastModified = HttpReq.getResponseHeader("Last-Modified") 7 Set HttpReq = Nothing 8End Function

投稿2018/04/05 00:52

CHERRY

総合スコア25171

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

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

kazto

2018/04/05 01:07

HTTPヘッダ参照するだけなら、ローカルキャッシュいらないですね。 勉強になりました。
rickey

2018/04/05 02:13

CHERRY様 なんとか出来ることがわかり本当にうれしいです。アドバイスありがとうございます。 書いてくださったことが、全ては理解できなかったので、自分で新たに検索をして コードを書いて、なんとか動きました。どんな文字で検索していいかもわからなかったので、 本当にありがとうございます。 教えていただいた内容をもとにプログラムを実行したのですが、 Wed, 04 Apr 2018 19:04:26 GMT という回答がでました(プログラムは質問に追加しました) これがこのページのどれの更新日に当るのかがわかりませんでした。 このページのそれぞれのPDFを指定して、特定のファイルの更新日を取得することは できるのしょうか?
CHERRY

2018/04/05 04:28

URL で指定したファイルの更新日です。 URL にhtml ファイルを指定したら htmlファイルの更新日が、pdf ファイルを指定したら pdf ファイルの更新日が取得できます。
rickey

2018/04/06 05:26

教えていただいた方法で各種ページから更新日を取得できました。本当にありがとうございました。「curl コマンドで、HTTP レスポンスを確認」というのがわからなかったのですが、調べたらVBAでも出来るようで、 以下のプログラミングでできました。おかげで本件解決できました。ありがとうございます。 Function HTTPのヘッダーを取得(url As String) Dim httpReq As Object Set httpReq = CreateObject("MSXML2.XMLHTTP") Call httpReq.Open("POST", url, False, user, Password) Call httpReq.setRequestHeader("Content-Type", "application/json;charset=utf-8") Call httpReq.setRequestHeader("User-Agent", "fuga") Dim postData As Variant postData = "name=hoge&body=piyo" Call httpReq.send(postData) Dim respData As String If httpReq.Status = 200 Then respData = httpReq.getAllResponseHeaders MsgBox respData End If End Function
guest

0

似たようなスクレイピングをやったことがあります。

どのPDFが更新されたかがわかることができれば

ローカルにいったんPDFをダウンロードしておき、MD5やSHAのハッシュ値を計算して、その値が変わっていたら内容が更新されたと判断する、みたいにすればいいのかなと思います。

http://www.atmarkit.co.jp/ait/articles/0507/30/news017.html
Windowsで標準で付属しているcertutilを使うのがよさそうです。

投稿2018/04/05 01:05

kazto

総合スコア7196

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

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

rickey

2018/04/06 00:26

回答ありがとうございます。全くしらない事がだったんですが、調べてみると、ファイルの比較できるみたいですね。ちょっとまだ理解ができてないのですが、調べてみて挑戦してみます。 ありがとうございました。
guest

0

元のPDFがあるなら、両方のPDFをバイナリ形式で読込んで、
差異があるかをチェックすればいいんじゃないかなぁ。

どこかに差異があるなら、更新されたということになるので、
自分のDiffツールでは、差分を抽出する前に、
先に差異がそもそもあるのかどうかをチェックする為に処理してます。
※PDFでも同様にバイナリ形式で読込めたので、チェック可能かと。

また、探せばVBAでPDFからテキストを抽出できそうなので、
テキストファイルをWinMerge等になげれば、
何が変わったかもすぐに分かるようになるでしょう。
http://hansuke.net/excel-vba-pdf-text
※PDF テキスト抽出 VBA で検索

投稿2018/04/05 03:59

ExcelVBAer

総合スコア1175

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

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

rickey

2018/04/06 00:25

ファイル自体を比較することができるんですね。今後使えそうなので、いろいろと調べてやってみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問