【问题标题】:How do I get last modified date of website如何获取网站的最后修改日期
【发布时间】:2022-01-23 19:30:22
【问题描述】:

当我单击在 Chrome 中加载网站的单元格时,我在 DataGridView 单元格中有网站 URL。我只使用 VS 2019 和 VB.Net 我没有安装 ASP.Net。
我从一些可以追溯到 2011 年的 SO 帖子中尝试了一堆不同的概念
几乎没有成功,我找到了一个看起来可行但没有结果的功能,我将发布该代码。
我的问题是如何获得网站的最后修改日期?
如果仅使用 VB.Net 不可行,请指出我需要的其他工具的参考。

Public Property DateTime_LastModified As String
Dim webPAGE As String

此代码位于 DataGridView 的单击事件中

        ElseIf gvTxType = "View" Then
        webPAGE = row.Cells(2).Value.ToString()
        'Modified: <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        Process.Start(webPAGE)
        GetDateTimeLastModified(requestUriString)
        Label1.Text = DateTime_LastModified
        'Dim strPath As String = webPAGE + "javascript : alert(document.lastModified)"
        'Dim strPath As String = Request.PhysicalPath
        'Server.MapPath
        'Label1.Text = System.IO.File.GetLastWriteTime(webPAGE).ToString()
        'Label1.Text = strPath '"Modified: " + System.Web.UI.GetLastWriteTime(strPath).ToString()
        'Label1.Text = strPath + "Modified:" + System.MapPath.Request.ServerVariables.Get("SCRIPT_NAME")
        'Process.Start(webPAGE)

这是我从答案中尝试的编辑

Public Class GetURLdate1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim strURL As String
        strURL = TextBox1.Text

        Dim client = New HttpClient()
        Dim msg As New HttpRequestMessage(HttpMethod.Head, strURL)
        Dim resp = client.SendAsync(msg).Result
        Dim strLastMod As String = resp.Content.Headers.LastModified.ToString

        MsgBox("Last mod as string date" & vbCrLf & strLastMod)

    'Dim lastMod As DateTime = CDate(strLastMod)

    'MsgBox(lastMod)

End Sub

Private Sub GetURLdate1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    TextBox1.Text = "https://www.youtube.com/c/stevinmarin/videos"
    '"https://stackoverflow.com/questions/70825821/how-do-i-get-last-modified-date-of-website"

End Sub

为 strLastMod 返回 NO 值

【问题讨论】:

  • 查看文档,很确定 response.LastModified 日期不是您想要的。那是响应内容的日期/时间最后一次修改并继续谈论实体的时间。也许stackoverflow.com/questions/23644436/… 可能会以正确的方式指出您,但我怀疑任何结果的有效性都是 100% 取决于单个服务器/站点
  • @Hursey 感谢您提供的链接,我同意似乎每个站点的结果都是个人的。当我使用 RSS 提要阅读器时,它有一个设置,当它抓取站点时,我选择查看 RSS 提要阅读器仅在发布新内容时添加站点。这些都是 YouTube 木工网站。该网站解释了网站的日期webnots.com/how-to-find-last-updated-date-of-a-web-page
  • 查看我的第二次编辑 - 我发布代码以获取最后修改日期。那时,您可以做任何您想做的事情 - 开始一个新流程,跳转到该网页 - 使用您现有的代码,我们不关心您所做的 - 但我刚刚添加的代码片段是您如何获得最后修改的日期。如果您想开始一些过程或其他什么?当然,无论如何都要这样做 - 但这与获取最后修改日期有关。无需混合代码的两部分。如前所述,此代码对于 winforms(桌面)或 asp.net(web)应用程序上的代码的工作方式相同。

标签: asp.net vb.net


【解决方案1】:

好的,所以不清楚您是否需要一个例程来获取网格中的所有 URL,并更新每个站点/url 的最后更新?

或者您只想在单击按钮跳转到站点时更新站点?

两者都很容易做到。

我的意思是,假设我们有这个标记 - 放入一个网格视图(我让向导创建了它)。

然后我把datasoruce控件吹掉,然后从GV中去掉datasoruce ID设置

所以,我有这个标记:

    <div style="padding:35px">
        <asp:GridView ID="GridView1" runat="server" CssClass="table" Width="65%"
            AutoGenerateColumns="False" DataKeyNames="ID" >
            <Columns>
                <asp:BoundField DataField="Url" HeaderText="Url" ItemStyle-Width="500" />
                <asp:BoundField DataField="LastUpDated" HeaderText="Last UpDated"  />
                <asp:BoundField DataField="LastVisit" HeaderText="Last Visit"  />
                <asp:TemplateField HeaderText="View" ItemStyle-HorizontalAlign="Center" >
                    <ItemTemplate>
                        <asp:Button ID="cmdJump" runat="server" Text="View" CssClass="btn"
                            OnClick="cmdJump_Click"
                            />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <br />
        <asp:Button ID="cmdGetAll" runat="server" Text="Upate all Last updated" CssClass="btn" />
    </div>

好的,我加载 gv 的代码是这样的:

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadGrid()
    End If
End Sub

Sub LoadGrid()

    Using conn = New SqlConnection(My.Settings.TEST4)

        Using cmdSQL = New SqlCommand("SELECT * FROM tblSites", conn)

            Dim rstData As New DataTable
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
            GridView1.DataSource = rstData
            GridView1.DataBind()

        End Using

    End Using

End Sub

现在我们有了这个:

好的,所以只需将飞机简按钮放入 GV。当我单击该按钮时,我将更新最后一次访问 - 不清楚您是否还希望它更新给定 url 的最后一次更新?

我们可以两者兼得。

那么,我们删除了一个简单的按钮?好吧,让它在我们上次访问(单击)跳转到该站点时更新)。

Protected Sub cmdJump_Click(sender As Object, e As EventArgs)

    Dim cmdView As Button = sender
    Dim gRow As GridViewRow = cmdView.NamingContainer
    Dim PKID As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")

    ' udpate with last visit click
    Using conn = New SqlConnection(My.Settings.TEST4)
        Using cmdSQL = New SqlCommand("update tblSites SET LastVisit = @Visit WHERE ID = @ID", conn)

            conn.Open()
            cmdSQL.Parameters.Add("@Visit", SqlDbType.DateTime).Value = Date.Now
            cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = PKID
            cmdSQL.ExecuteNonQuery()

        End Using
    End Using

    ' Now jump to that url
    Response.Redirect(gRow.Cells(0).Text)

End Sub

用于获取和更新给定 URL 的所有最新更新(每一行)的按钮是这样的:

Protected Sub cmdGetAll_Click(sender As Object, e As EventArgs) Handles cmdGetAll.Click

    Using conn = New SqlConnection(My.Settings.TEST4)

        Using cmdSQL = New SqlCommand("SELECT * FROM tblSites", conn)

            Dim rstData As New DataTable
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)

            For Each OneRow As DataRow In rstData.Rows

                Dim client = New HttpClient()
                Dim msg As New HttpRequestMessage(HttpMethod.Head, OneRow("Url").ToString)
                Dim resp = client.SendAsync(msg).Result
                Dim lastMod As DateTimeOffset? = resp.Content.Headers.LastModified
                OneRow("LastUpDated") = lastMod.Value.ToString
            Next

            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)
            da.Update(rstData)

            ' now re-load grid
            LoadGrid()

        End Using

    End Using

End Sub

所以,上面有更新所有 URL 数据的代码。

但是,您的问题似乎表明,当您单击 GV 行按钮时,您还想使用来自网站 url 的最后更新信息获取/保存/更新 GV 的给定行?

好的,那么,我们修改我们的点击代码,既更新我们的最后一次点击访问,又得到那个网站的最后更新信息。

所以,只需将按钮单击行代码更改为:

Protected Sub cmdJump_Click(sender As Object, e As EventArgs)

    Dim cmdView As Button = sender
    Dim gRow As GridViewRow = cmdView.NamingContainer
    Dim PKID As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")

    Dim client = New HttpClient()
    Dim msg As New HttpRequestMessage(HttpMethod.Head, gRow.Cells(0).Text)
    Dim resp = client.SendAsync(msg).Result
    Dim lastMod As DateTime = resp.Content.Headers.LastModified.ToString

    ' udpate with last visit click, and also get laste update from web site
    Using conn = New SqlConnection(My.Settings.TEST4)

        Dim strSQL As String =
            "update tblSites SET LastVisit = @Visit,LastUpdated = @LastUpDate WHERE ID = @ID"
        Using cmdSQL = New SqlCommand(strSQL, conn)

            conn.Open()
            cmdSQL.Parameters.Add("@Visit", SqlDbType.DateTime).Value = Date.Now
            cmdSQL.Parameters.Add("@LastUpDate", SqlDbType.DateTime).Value = lastMod
            cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = PKID
            cmdSQL.ExecuteNonQuery()

        End Using
    End Using

    ' Now jump to that url
    Response.Redirect(gRow.Cells(0).Text)

End Sub

编辑:不使用 asp.net

我现在在您的帖子中看到您建议您不使用 asp.net。但是,如果您说使用 vb.net 桌面 + gridview,上述代码的工作方式几乎相同。换句话说,代码应该是相似的,其中包括获取该网站日期的代码。

所以,您需要使用跟随超链接,但代码是从网站获取日期,甚至是您的桌面通用表单布局。结果——即使你的网格看起来与上面的网页非常相似,这里的整体想法也同样适用于桌面或基于网络的网页。我的意思是,如果你安装了 Visual Studio,那么你可以在上面尝试 - 因为 VS 确实为你安装了 web 位和部件。

Edit #2 - 获取最后修改日期的代码。

没有一些进程启动,从不建议这样使用。因此,您需要的代码是这样的:

    webPAGE = row.Cells(2).Value.ToString()
    Dim client = New HttpClient()
    Dim msg As New HttpRequestMessage(HttpMethod.Head,webPAGE)
    Dim resp = client.SendAsync(msg).Result
    Dim lastMod As DateTime = resp.Content.Headers.LastModified.ToString

    MsgBox("DATE " & lastMod)

Edit#3:代码作为获胜表单

好的,所以我们创建一个空白的新窗体。

放入文本框,放入按钮。

我们有这个代码:

Imports System.Net.Http

Public Class GetURLdate1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim strURL As String
        strURL = TextBox1.Text

        Dim client = New HttpClient()
        Dim msg As New HttpRequestMessage(HttpMethod.Head, strURL)
        Dim resp = client.SendAsync(msg).Result
        Dim strLastMod As String = resp.Content.Headers.LastModified.ToString

        MsgBox("Last mod as string date" & vbCrLf & strLastMod)

        Dim lastMod As DateTime = strLastMod

        MsgBox(lastMod)

    End Sub

    Private Sub GetURLdate1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        TextBox1.Text =
            "https://stackoverflow.com/questions/70825821/how-do-i-get-last-modified-date-of-website"

    End Sub

所以,我用这个网页作为网址。

当我运行这个表单时——点击按钮,我看到了:

【讨论】:

  • 我正计划链接到该网站,如果修改日期大于今天,则继续访问,否则只需关闭该网站。我不知道如何从 VB.Net 代码中关闭站点。仍在研究这个想法。感谢您为回答所花费的精力和时间。将尝试测试我通过您的编辑假设 VS 不需要安装 asp.net 的代码?
  • IIS 与此有什么关系?请参阅我的编辑 #3 - 我将其显示为 winforms 示例。
  • You are using HttpClient wrong 它意味着被实例化一次并被一遍又一遍地重用。此外,Last Modified 标头绝不是必需的响应标头。无法保证服务器会告诉您上次修改资源的时间。
  • RSS 是一种基于 XML 的联合格式,它提供的元数据超出了通过纯 HTTP 必须提供的元数据。据我所知,联合组织可以通过他们自己的数据库独立跟踪上次修改。
  • 无法保证这些方法中的任何一个都会产生可用的最后修改值。另外,就 YouTube 而言,“上次修改”是什么意思?他们可能会动态生成每个页面;那么“最后修改”是什么意思呢?当我查看视频页面时,我看到了一个日期,但那是它上传的日期。您需要检查 DOM 以找到该元素的选择器以抓取该日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2019-02-26
相关资源
最近更新 更多