【问题标题】:Downloading file with webscraper sometimes yields HTML page使用 webscraper 下载文件有时会产生 HTML 页面
【发布时间】:2014-10-23 20:22:16
【问题描述】:

我有一个 C# 应用程序来访问来自第三方网站的数据。我正在使用 WebClient 并调用 DownloadData 并处理字节(DownloadFile 会产生类似的结果)。

直到最近,这还不错。现在,通常情况下,我得到的不是所需的 XML 文件,而是类似于以下内容的 html 页面:

<!-- _localBinding -->
<!-- _lcid="1033" _version="" -->
<html>
    <head>
        <meta HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8" />
        <meta HTTP-EQUIV="Expires" content="0" />
        <noscript>
            <meta http-equiv="refresh" content="0; url=/_layouts/spsredirect.aspx?noscript=1" />
        </noscript>
        <script language="javascript" src="/_layouts/1033/init.js"></script>
        <script language="javascript" src="/_layouts/1033/core.js"></script>
        <script language="javascript">

        var requestedUrl = escapeProperly(window.location.href);
        STSNavigate("/CustomErrors/ErrorPage.aspx?oldUrl=" + requestedUrl);

    </script>
    </head>
    <body></body>
</html>

我很困惑为什么这会从持续工作变成持续给我带来问题。有时,我仍然可以获得预期的 XML 文件。您知道这个问题可能是什么以及如何解决它吗?

值得注意的是,如果我在浏览器中手动单击下载链接,则会在文件下载之前弹出并关闭一个 javascript 窗口。我正在使用 WebBrowser 拦截该弹出窗口的非静态 URL,并将该链接(和标头/cookie 信息)传递给 WebClient。该链接类似于https://foo.bar/Something.axd?Session=1234vv1234Format=XML

感谢您的宝贵时间

【问题讨论】:

    标签: c# web-scraping screen-scraping webclient


    【解决方案1】:

    第三方页面似乎正在引发异常。这可能是由于您传递的参数造成的,也可能是它们本身的问题。最好的做法是联系提供商并查看记录了哪些错误(希望他们将它们记录在某处)。否则你只会猜测你做错了什么。

    会话查询字符串参数中是否可能存在未正确处理的编码\转义字符?这将是我的第一个猜测,因为没有任何真正的错误细节。

    【讨论】:

    • 感谢您的快速回复!这让人放心。他们的网站似乎有很多错误,但这也是我第一次做这样的事情。至于查询字符串,我在 URL 中看到的唯一特殊字符是 = + 和 &
    • 我曾经经常使用支付网关,但我们会遇到这样的怪事。我很早就发现你可以花三天时间猜测这样的问题,然后通过一封电子邮件给他们的支持团队最终解决它。试图在看不到错误的情况下调试错误是非常困难的。
    【解决方案2】:

    如果它抛出一个错误,我会尝试收集 HTTP 状态代码,你可以通过使用 HttpWebRequest 和 HttpWebResponse 来做到这一点(我相信这些早于 WebClient)。仍然有一些棘手的方法可以使用 WebClient 并检索状态代码,我会在您实际下载之前检查内容类型。

    在任何情况下,即使提供错误页面,服务器也应使用适当的 HTTP 状态代码进行响应。 (至少在一个完美的世界里)。

    【讨论】:

    • 我使用 Dmitry 的代码 stackoverflow.com/questions/3574659/… 来确定状态代码。在我下载之前:0。之后:200 OK。下载的数据:上面的 HTML 页面。
    • 很多时候,当使用自定义错误页面时,状态码会丢失。甚至 ASP.NET CustomErrors 也会屏蔽状态码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多