Excel (VBA) |
![]() ![]() |
(Windows 10 Pro : Microsoft 365)
ブログ管理について
投稿日時: 23/03/22 09:12:47
投稿者: 自作の友
|
---|---|
ブログに投稿した数が約1200件あります。この投稿したブログの日付/タイトル/URLを自動で抽出したいのですが適当の方法が有りましたらご教示ねがいます🙇♂️⤵️。 |
![]() |
投稿日時: 23/03/22 09:43:23
投稿者: simple
|
---|---|
こんにちは。
|
![]() |
投稿日時: 23/03/22 10:24:18
投稿者: 自作の友
|
---|---|
私のブログのURLです。
|
![]() |
投稿日時: 23/03/22 12:51:25
投稿者: simple
|
---|---|
こちらの規定をご覧になれば、
・2012年7月から現在までの年月ごとにページ内容(HTMLテキスト)を取得します。 年月の指定は簡単に繰り返しに持ち込めると思います。 ・取得したHTMLテキストを元に、正規表現を使って、 ・年月日 ・タイトル ・URL を取得します。(1ページに最大5個あります) ・継続記事へのpaging指定 <a rel="next" href="http://query1576.livedoor.blog/archives/2012-07.html?p=2"> があれば、そのURLを使って、同じ処理を繰り返します。参考にしてください。 トライして不明点があれば、継続して質問してください。 |
![]() |
投稿日時: 23/03/22 13:04:18
投稿者: 自作の友
|
---|---|
有難うございました。
|
![]() |
投稿日時: 23/03/23 20:49:50
投稿者: simple
|
---|---|
トライしてみて下さいとは申し上げたものの、
A列 B列 1 2023年03月 2023-03 2 2023年02月 2023-02 3 2022年09月 2022-09 (以下略) ・A列に、ネットのアーカイブ文字列をコピーペイスト ・B1 に =A1 と入力して、書式を "yyyy-mm" とユーザー定義指定。 ・B1を下に、最終行までコピーペイスト ■コードの扱い ・下記のコードを標準モジュールにコピーして、 ・main プロシージャを実行します。 ・最初の二つのアーカイブ(2023-03,2023-02)だけを対象に実行するようにしています。 最初はそれで確認してみてください。 ・OKであれば、全アーカイブに対象を拡大して下さい。(コード中の■箇所に注目して下さい) Option Explicit Dim re As Object Dim re2 As Object Dim myCount As Long Dim mat() As String Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub main() Dim url As String Dim s As String Dim k As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") '結果書き込みシート '■要修正 Set ws2 = Worksheets("Sheet2") '対象となる年月文字列を書いたシート'■要修正 Call setRegExp '正規表現の設定 myCount = 1 '結果を書き込む動的配列の大きさを初期設定 '年月別アーカイブを順次処理 For k = 1 To 2 ' 検証のため一部に限定しています。 '■要修正 'For k = 1 To ws2.Cells(Rows.Count, "B").End(xlUp).Row '■OKであればこちら s = ws2.Cells(k, "B").Text DoEvents Application.StatusBar = s url = "http://query1576.livedoor.blog/archives/" & s & ".html" '情報(年月日/URL/タイトル/category1URL/category1)を取得 Call do_job(url) Next '結果の配列をシートに書き込む ws1.[A1].Resize(UBound(mat, 2), 5) = Application.Transpose(mat) Application.StatusBar = False MsgBox "処理終了" Erase mat End Sub Function do_job(url As String) Dim html As String Dim m As Object Dim next_url As String html = getHtml(url) 'HTMLテキストを取得 Sleep 1000 'サーバーへの負荷を考慮して間隔(1秒)を置く Call getInformation(html)'情報(年月日/URL/タイトル/category1URL/category1)を取得 If re2.test(html) Then '次ページがあれば Set m = re2.Execute(html) next_url = m(0).submatches(0) '次ページのURL Call do_job(next_url) '再帰実行 End If End Function Sub setRegExp() '------- 情報取得用の正規表現パターン Dim pat As String Set re = CreateObject("VBScript.RegExp") re.Global = True '一か所だけでなく、マッチする箇所はすべて pat = "<header class=""article\-header"">\s*" pat = pat & "<p class=""article\-date""><time datetime="".*?"" itemprop=""datePublished"">(.*?)</time></p>\s*" pat = pat & "<h1 class=""article\-title"" itemprop=""name""><a href=""(.*?)"" itemprop=""url"">(.*?)</a></h1>" pat = pat & "[\s\S]*?" pat = pat & "<dl><dt>カテゴリ:</dt><dd class=""article\-category1""><a href=""(.*?)"">(.*?)</a>" re.Pattern = pat '------- 「次へ」の取得用の正規表現パターン Set re2 = CreateObject("VBScript.RegExp") re2.Pattern = "<a rel=""next"" href=""(.*?)"">" End Sub 'HTMLテキストs から、特定の条件を満たす文字列を取得 Function getInformation(s As String) Dim m As Object Dim k As Long Dim j As Long Set m = re.Execute(s) For k = 0 To m.Count - 1 ReDim Preserve mat(1 To 5, 1 To myCount) For j = 1 To 5 mat(j, myCount) = m(k).submatches(j - 1) Next myCount = myCount + 1 Next End Function Function getHtml(url As String) As String Const adTypeBinary = 1 Const adTypeText = 2 Dim HttpRequest As Object Dim Strm As Object Set HttpRequest = CreateObject("MSXML2.XMLHTTP") Set Strm = CreateObject("ADODB.Stream") With HttpRequest .Open "GET", url, False .send End With With Strm .Type = adTypeBinary .Open .Write HttpRequest.responseBody .Position = 0 .Type = adTypeText .Charset = "UTF-8" getHtml = .ReadText() .Close End With End Function なお、DOM(Document Object Model)を作成して、タグ情報を頼りに情報を取得することも 可能です。 そのほうが汎用的かも知れませんが、正規表現で抜き出したほうが速度は上がります。 |
![]() |
投稿日時: 23/03/23 21:14:58
投稿者: 自作の友
|
---|---|
本当にありがとうございます。暫くは時間が掛かると思いますが結果は報告させて頂きます。 |
![]() |
投稿日時: 23/03/24 11:13:18
投稿者: 詠み人知らず
|
---|---|
Option Explicit
|
![]() |
投稿日時: 23/03/24 11:50:47
投稿者: 自作の友
|
---|---|
詠み人知らず 様
|
![]() |
投稿日時: 23/03/29 20:15:26
投稿者: simple
|
---|---|
私のコードについて訂正です。
|
![]() |
投稿日時: 23/04/02 10:40:06
投稿者: 自作の友
|
---|---|
皆さんから貴重なアイディアを頂きましたので、これを元に検討を加えたいと思います。
|