从 HttpWebRequest 下载时缺少某些元素?

2024-01-02

我正在使用 httpwebrequest 从给定的 url 下载数据,但很少有元素没有响应。

   Dim Request As HttpWebRequest = CType(WebRequest.Create("https://www.royalmail.com/track-your-item#/tracking-results/37005067200003B0F1FF2"), HttpWebRequest)
    Request.Timeout = 2 * 60 * 1000
    Request.Proxy = Nothing
    Request.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip
    Request.Credentials = System.Net.CredentialCache.DefaultCredentials
    Dim HttpResp As HttpWebResponse
    HttpResp = (CType(Request.GetResponse(), HttpWebResponse))
    If HttpResp.StatusCode = HttpStatusCode.OK Then
        Dim receiveStream As Stream = HttpResp.GetResponseStream()
        Dim readStream As New StreamReader(receiveStream)
        Dim sData As String
        sData = readStream.ReadToEnd()
        readStream.Close()

    Else

    End If    

当我打开 URL 时(https://www.royalmail.com/track-your-item#/tracking-results/37005067200003B0F1FF2 https://www.royalmail.com/track-your-item#/tracking-results/37005067200003B0F1FF2)在 chrome 上检查元素然后我可以看到这个元素(搜索 37005067200003B0F1FF2) 但作为回应,我没有得到这个元素(搜索 37005067200003B0F1FF2)。

使用网页浏览器控件的代码

Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click


    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    Dim sURL As String = String.Format("https://www.royalmail.com/track-your-item#/tracking-results/37005067200003B0F1FF2")
    Dim webBrowserForPrinting As WebBrowser = New WebBrowser()
    webBrowserForPrinting.ScriptErrorsSuppressed = True
    AddHandler webBrowserForPrinting.DocumentCompleted, AddressOf PrintDocument
    webBrowserForPrinting.Url = New Uri(sURL)
    webBrowserForPrinting.Navigate(sURL)

End Sub
Private Sub PrintDocument(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    Dim HTMD As HtmlDocument
    HTMD = CType(sender, WebBrowser).Document



    Dim HTC As HtmlElementCollection
    If HTMD IsNot Nothing Then
        HTC = HTMD.All
        For Each ele As HtmlElement In HTC
            MsgBox(ele.InnerHtml)

        Next
    End If

End Sub

您需要激活 WebBrowser 高级功能才能成功完成解析过程。如果未启用这些功能,则标准 IE7 模拟中的 Web 浏览器将无法完成文档。该失败是由大量脚本错误引起的。

我添加了一个带有静态方法的类(WebBrowserAdvancedFetures) 将所需的值添加到注册表中。
WebBrowserAdvancedFetures.ActivateWBAdvancedFeatures在 Form 的构造函数中调用。
您可以回滚调用WebBrowserAdvancedFetures.DeactivateWBAdvancedFeatures.

该程序如何运作:

  1. 实例化一个网页浏览器 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser class (Private browser As WebBrowser)。我们还可以使用 WebBrowser 控件(表单容器可以托管的可见控件版本),这是同样的事情。
  2. 订阅它的文件已完成 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.documentcompleted事件。每次其中之一都会提高它HtmlDocuments里面主要的WebBrowser.Document完成了。读如何获取 Frames/IFrames 内的 HtmlElement 值? https://stackoverflow.com/a/53218064/7444103有关 HtmlDocuments 嵌套的更多详细信息。
  3. In the DocumentCompleted处理程序,验证至少一个文档已准备好进行解析,检查WebBrowser.ReadyState https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.readystate = WebBrowserReadyState.Complete
  4. 当它出现时,搜索包含我们要查找的数据的 HtmlElements。
  5. 收集完所有数据后,引发一个事件,以通知解析已完成(如果需要,这还允许通知其他类的订阅者。这需要自定义EventArgs类,虽然)并禁用进一步解析HtmlDocument(在这里,这是通过设置布尔字段来完成的)。
  6. 处理新数据(这里,只是String and a DateTime对象),然后重置解析过程中使用的字段/变量。

请记住删除处理程序,在Form.FormClosed事件或自定义类中Dispose() method:

RemoveHandler DocumentParsingComplete, AddressOf OnDocumentParsingComplete
RemoveHandler browser.DocumentCompleted, AddressOf browser_DocumentCompleted

Public Event DocumentParsingComplete As EventHandler(Of EventArgs)

Private browser As WebBrowser = Nothing
Private trackingNumberValue As String = String.Empty
Private trackingDateValue As DateTime
Private documentParsed As Boolean = False
Private userAgent As String = "User-Agent: Mozilla/5.0 (Windows NT 10; Win64; x64; rv:48.0) Gecko/20100101 Firefox/48.0"

Public Sub New()
    InitializeComponent()
    WebBrowserAdvancedFetures.ActivateWBAdvancedFeatures(Path.GetFileName(Application.ExecutablePath))
    browser = New WebBrowser With {.ScriptErrorsSuppressed = True}
    AddHandler DocumentParsingComplete, AddressOf OnDocumentParsingComplete
    AddHandler browser.DocumentCompleted, AddressOf browser_DocumentCompleted
End Sub

Private Sub btnNavigate_Click(sender As Object, e As EventArgs) Handles btnNavigate.Click
    browser.Navigate("")
    browser.Document.OpenNew(True)
    documentParsed = False
    browser.Navigate("[Some URL]", "_self", Nothing, userAgent)
End Sub

Private Sub OnDocumentParsingComplete(sender As Object, e As EventArgs)
    ' Do whatever you need with these
    Console.WriteLine(trackingNumberValue)
    Console.WriteLine(trackingDateValue)

    'Then reset for further use
    trackingNumberValue = String.Empty
    trackingDateValue = DateTime.MinValue
End Sub

Private Sub browser_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    Dim wb As WebBrowser = DirectCast(sender, WebBrowser)
    If wb.ReadyState <> WebBrowserReadyState.Complete OrElse wb.Document.Forms.Count = 0 OrElse documentParsed Then Return

    Dim trackingNumberClass As String = "tracking-number-value"
    Dim trackingElement = wb.Document.GetElementsByTagName("SPAN").
        OfType(Of HtmlElement)().FirstOrDefault(Function(elm) elm.GetAttribute("className").Contains(trackingNumberClass))
    Me.trackingNumberValue = trackingElement?.InnerText

    Dim trackingDateClass As String = "ng-binding ng-scope"
    Dim trackingDateElement = wb.Document.GetElementsByTagName("SPAN").
        OfType(Of HtmlElement)().FirstOrDefault(Function(elm) elm.GetAttribute("className").Equals(trackingDateClass))

    If trackingDateElement IsNot Nothing Then
        Dim deliveryDate As String = trackingDateElement.InnerText.Split().Last().TrimEnd("."c)
        Me.trackingDateValue = Date.ParseExact(deliveryDate, "dd-MM-yyyy", Nothing)
        If Not String.IsNullOrEmpty(trackingNumberValue) Then
            documentParsed = True
            RaiseEvent DocumentParsingComplete(sender, EventArgs.Empty)
        End If
    End If
End Sub

使用此类来激活/停用 WebBrowser 控件的高级功能:

Imports Microsoft.Win32
Imports System.Security.AccessControl

Public Class WebBrowserAdvancedFetures
    Private Shared baseKeyName As String = "Software\Microsoft\Internet Explorer\Main\FeatureControl"
    Private Shared featuresKey As String = baseKeyName & "\FEATURE_BROWSER_EMULATION"
    Private Shared hardwareAccelKey As String = baseKeyName & "\FEATURE_GPU_RENDERING"

    Public Shared Sub ActivateWBAdvancedFeatures(executableName As String)
        Dim wbFeatureKey As RegistryKey = Nothing
        Dim wbAccelKey As RegistryKey = Nothing

        Try
            wbFeatureKey = Registry.CurrentUser.OpenSubKey(featuresKey, 
                RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey)
            If wbFeatureKey Is Nothing Then
                wbFeatureKey = Registry.CurrentUser.CreateSubKey(featuresKey, True)
            End If
            wbFeatureKey.SetValue(executableName, 11001, RegistryValueKind.DWord)

            wbAccelKey = Registry.CurrentUser.OpenSubKey(hardwareAccelKey, 
                RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey)
            If wbAccelKey Is Nothing Then
                wbAccelKey = Registry.CurrentUser.CreateSubKey(hardwareAccelKey, True)
            End If
            wbAccelKey.SetValue(executableName, 1, RegistryValueKind.DWord)
        Finally
            wbFeatureKey?.Dispose()
            wbAccelKey?.Dispose()
        End Try
    End Sub

    Public Shared Sub DeactivateWBAdvancedFeatures(executableName As String)
        Using wbFeatureKey = Registry.CurrentUser.OpenSubKey(
            featuresKey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey)
            wbFeatureKey.DeleteValue(executableName, False)
        End Using

        Using wbAccelKey = Registry.CurrentUser.OpenSubKey(
            hardwareAccelKey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.WriteKey)
            wbAccelKey.DeleteValue(executableName, False)
        End Using
    End Sub
End Class
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 HttpWebRequest 下载时缺少某些元素? 的相关文章

  • Iframe 相对路径挑战

    我有一个页面 在页面内有一个 Iframe 目录如下 Folder1 Folder2 IframeCSS IframeCSS Css iframePage1 html stuff css parentPage1 html 在 iframeP
  • 动态img(或视频)标签根本不加载资源,HTTP请求处于“待处理”状态

    我尝试使用以下方法在 Web 应用程序上加载资源时遇到一些问题img or videoHTML 标签 我在我的应用程序中使用 Angular 并动态设置src的参数img标签 使用ng src src 指示 没有那么多图像和资源需要加载 在
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch
  • 如何使用 PHPExcel 将 html 表格导出到 Excel?

    因为很难处理不同浏览器之间的不同标准 所以我放弃尝试使用js或jQuery导出html表 我想知道是否可以将 html 格式的表 POST 回服务器并在服务器上生成 xls 文件供用户下载 现在在服务器端使用 PHPExcel 我的代码是这
  • 是否有任何 javascript 库可以为 HTML 创建一个漂亮的结构化(树)差异?

    我正在尝试提出一个解决方案来支持我们在整个网站中使用的 历史视图 机制 对于此历史视图的 UI 我想向用户展示对象的两个修订之间发生的更改 换句话说 差异 这是一个真正的挑战 因为所讨论的对象都相当复杂 我认为最好的方法是将每个对象渲染为
  • 输入文本中固定下划线

    我试图修复所有输入文本类型中的下划线 但没有成功 Example My code input width 100 background color fcfcfc border 0 padding 10px div class col lg
  • 在 HTML 表单中使用 PUT 方法

    我可以在 HTML 表单中使用 PUT 方法将数据从表单发送到服务器吗 根据HTML标准 https www w3 org TR html5 sec forms html element attrdef form method 你可以not
  • 如何在目录中查找或获取文件名 Visual Basic.net 中具有特定单词的文件?

    我需要从名称中包含特定字符的目录中获取文件 下面的代码将返回带有以下内容的任何文件 csv扩大 问题是还有其他 csv 文件我需要保留或得不到 Dim FileLocation As DirectoryInfo New DirectoryI
  • 更改链接悬停时的正文背景颜色

    当鼠标悬停在页面上时如何更改页面背景a 我正在寻找仅 css 的解决方案 我知道你可以通过 css 到达子元素 但我不知道如何 是否可以到达主体 看看这个DEMO http jsfiddle net bhavuksuthar bjsvhze
  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • 您可以使用 JavaScript 触发自定义 HTML5 表单错误吗?

    如果我有一个像这样的输入
  • 使用 CSS Flexbox 堆叠图像

    我正在学习使用CSSflexbox 和我想在左侧渲染一个大图像 并在彼此之上渲染两个小图像 我怎样才能使用CSS弹性盒 div class container img class image1 src alt null img class
  • 在 TCPDF 中设置背景颜色

    我已经手动设置了第一页的背景颜色 如下所示 pdf gt AddPage pdf gt SetFillColor 52 21 0 76 pdf gt Rect 0 0 pdf gt getPageWidth pdf gt getPageHe
  • 带 CSS 网格的等宽侧边栏列

    是否可以让左右列具有相同的宽度 而中间列占据剩余空间 我不想设置像这样的百分比grid template columns 20 60 20 因为并不总是确定这些列的内容是什么 Flexbox 和表格似乎没有解决这个问题的方法 所以我再次尝试
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • 空 URL 哈希导致页面在 js 事件上跳转

    我有一个带有下一个和上一个按钮的照片库 如果我的某个 javascript 方法由于某种原因被破坏 那么当单击其中一个按钮时 它会向 url 添加一个哈希值 即 www google com 我知道可以给散列一个 div id 来跳转到页面
  • 捕获 XSS(跨站脚本)攻击的最佳正则表达式(Java 中)?

    杰夫实际上在净化 HTML http refactormycode com codes 333 sanitize html 但他的示例是用 C 编写的 而我实际上对 Java 版本更感兴趣 有人有更好的 Java 版本吗 他的示例是否足以直
  • 使用文本遮盖视频

    是否可以使用 HTML CSS 文本来屏蔽视频 我已经找到并设置了这种工作方式 但没有一种允许文本后面有透明背景 例如 这支笔要求您进行某种填充 它并不是真正掩盖实际视频 而是创造幻觉 https codepen io dudleystor
  • 通过 vh 和 vw 调整 css 字体大小

    所以我想根据容器的大小自动调整文本的大小 但是如果我使用类似的东西 font size 5vw 看起来不错 但是当我缩小页面时 高度开始变得太小 无论如何 我是否可以根据 vh 和 vw 调整文本大小 例如 如果我只是减小页面的宽度 那么高

随机推荐

  • 将 svn 文件夹恢复到以前的版本

    要将 SVN 中的特定文件夹恢复到之前的状态 我当前使用以下命令 svn rm folder svn commit m removed folder to revert to previous version svn co http pat
  • 如何使用 JQuery 动态创建输入元素来实现 keyup 函数?

    我不明白为什么下面的代码不起作用 JSFiddle 链接 http jsfiddle net JpwpM 1 document ready function addInput var limit 30 function addInput v
  • 3 / 2 = 1.0?真的吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 整数除法 如何产生双精度数 https stackoverflow com questions 3144610 java integer division how do you produc
  • 有没有可以发出 LLVM 字节码的 Javascript 引擎?

    我已经搜索了一段时间 但找不到任何发出 LLVM 字节码的引擎 但不知怎的 我无法相信没有这样的引擎 恕我直言 JXcore 将是您前进的最佳选择 当他们从 V8 转换为 LLVM 时 这是他们到达版本 2 时的目标 根据他们的路线图 然后
  • 如何在 Shiny 应用程序中更新 selectModUI 中的传单地图?

    我想更新selectModUI来自mapedit包针对不同的leaflet使用时的地图Shiny 下面是一个工作示例 library tidyverse library shiny library sf library leaflet li
  • 虚拟的概念

    我对 CPP 很陌生 正在学习后期绑定多态性 根据我所阅读和理解的内容 virtual 关键字用于后期绑定 它在编译时内部创建一个由 vptr 指向的 vtable 所以 例如 class BASE public virtual void
  • C++ 如何管理依赖项(例如使用 github 中的库)

    我对 C 世界很陌生 所以请原谅我提出这样一个虚拟问题 我用谷歌搜索了一下 但找不到正确的答案 我的问题相当简单 我应该如何在 C 世界中使用库 例如在 Java 中 有maven and gradle为了这个任务 在Python中 我使用
  • Ruby - 获取下一个夏令时更改

    我知道有一种方法可以确定某个时间是否是夏令时 Time now dst 但是有没有办法告诉我们下一个夏令时更改的日期 例如 谷歌返回Sunday November 12015 年下一次夏令时变更 由于这些日期是基于其他值 例如您正在使用的时
  • Springfox Swagger:无法解析指针:/definitions/Instant

    我们有一个 SpringBoot 项目 并且使用 Springfox Swagger 来生成 API 文档 有一个响应类包含 private Collection
  • 将我的登录凭据存储在 redux-react 中

    我想将我的登录凭据存储在 redux react 中 我附加了几行代码 问题的一部分 sksignup js import React Component from react import useState from react impo
  • 大虾PDF-如何获取文本框的高度

    我有一个包含动态文本的 formatted text box 当没有给出具体尺寸时 盒子似乎可以很好地扩展 问题是它似乎没有将光标移动到框的底部 因此我的文本与 formatted text box 中的文本重叠 如果我可以确定文本框的高度
  • AlarmManager Android 日常

    我正在尝试制定一个时间表 它应该每天下午 1 点或 2 点运行 目前我只能让它每 10 秒或 10 分钟运行一次 Intent myIntent new Intent AndroidAlarmService this MyAlarmServ
  • 以编程方式生成请求验证令牌

    从一个空的 MVC 项目开始 这是我的Startup cs using Microsoft AspNetCore Builder using Microsoft AspNetCore Hosting using Microsoft Exte
  • Couchbase 文档日期搜索 - DateTime.Now()

    我在 CB 中有一份文档 其中有两个日期 开始日期和结束日期 比方说 产品的价格折扣 10 折扣从今天开始到下周五结束 我怎样才能从CB获得今天有有效折扣的所有文件 我做了一个视图 其中包含以下内容 var dt new Date 得到今天
  • Richardson-Lucy 反卷积可以恢复潜在内核吗?

    我知道理查森 露西反卷积是为了恢复潜在图像 但假设我们有一个噪声图像和原始图像 我们能找到引起转变的内核吗 下面是一个 MATLAB 代码理查森 露西反卷积 http en wikipedia org wiki Richardson E2
  • OS X Server + GIT 与 SSH 集成失败并出现权限被拒绝错误

    我的 GIT 服务器托管在单独的 Linux 服务器上 我有 SSH RSA 密钥没有密码 我能够使用 Xcode 连接到 GIT 服务器 并且所有操作都可以通过 Xcode 5 0 2 在源代码管理中正常工作 我在本地计算机上安装了 OS
  • 为什么 String.length() 是一个方法?

    如果 String 对象是不可变的 因此显然不能改变它的长度 为什么length 一种方法 而不是简单地public final int length比如数组中有什么 它只是一个 getter 方法 还是进行某种计算 只是想看看这背后的逻辑
  • Apple 如何查找电子邮件中的日期、时间和地址?

    在 iOS 电子邮件客户端中 当电子邮件包含日期 时间或位置时 文本将成为超链接 只需点击链接即可创建约会或查看地图 它不仅适用于英语电子邮件 也适用于其他语言 我喜欢这个功能 并且想了解他们是如何做到的 最简单的方法是使用许多正则表达式并
  • EF6 急切加载相关实体的单个属性

    在 EF6 中 我有一个实体客户 具有实体地址的导航属性 地址实体包含属性 城市 我可以急切地加载地址实体 同时获取所有客户 如下所示 dbSet Customers Include customer gt customer Address
  • 从 HttpWebRequest 下载时缺少某些元素?

    我正在使用 httpwebrequest 从给定的 url 下载数据 但很少有元素没有响应 Dim Request As HttpWebRequest CType WebRequest Create https www royalmail