c# WebBrowser登录后怎样直接用HttpWebRequest抓取数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# WebBrowser登录后怎样直接用HttpWebRequest抓取数据相关的知识,希望对你有一定的参考价值。

我抓的页面有很多页,有时甚至几十页都有,我想用线程,可是webbrowser这个控件用线程不行,所以我才想到用webbrowser登录之后,用httpwebrequest来抓取数据

HttpWebRequest跟webbrowser是两个东西
如果你用webbrowser的话,直接通过webbrowser的属性就可以得到html源文件,然后解析就行了
用HttpWebRequest的话,就需要HttpWebResponse response = (HttpWebResponse)request.GetResponse();来获取response数据
参考技术A 不可能,别把微软当傻子好不好?这是明显的安全漏洞,怎麼可以有?

在 C# 中注销网站后立即拒绝重新登录

【中文标题】在 C# 中注销网站后立即拒绝重新登录【英文标题】:Re-logging in was rejected immediately after logging out of a web site in C# 【发布时间】:2015-09-29 19:48:34 【问题描述】:

我正在用 C# 开发一个控制台应用程序来从网站上进行一些后台抓取。没有使用 webbrowser、winform 或 ASP 等,只是简单的 http 请求和响应。

我有这个退出站点的问题并且会话仍然存在,所以我在退出后很快就被拒绝重新登录,因为该站点只允许一个并发用户登录。我已经做了谷歌研究,还没有发现任何线索。

这是退出代码:

    public HttpResult logout()
    
        HttpHelper http = new HttpHelper();
        HttpItem item = new HttpItem()
        
            URL = "https://w w w.mysite.com/logoff",
            Method = "get",
            ResultCookieType = ResultCookieType.CookieCollection,
            Allowautoredirect = true,
        ;
        HttpResult res = http.GetHtml(item);

        return res;
    

我使用 Httpwatch 来查看请求/响应标头以及 cookie。我发现响应包含三个 cookie,注销后的值为零。我的印象是,在浏览器的情况下,这些 cookie 会更新,因此重新登录请求将被重定向到登录页面。我怎样才能像浏览器一样做到这一点?

【问题讨论】:

您应该将登录请求获得的cookie分配给注销请求。简单的方法是使用相同的请求实例。 我强制注销的主要原因是我需要确保在重复测试抓取时不会拒绝我的重新登录。一旦我关闭了我的应用程序,我就不确定在哪里可以按照您的建议获取旧 cookie。旧会话通常会在 5 分钟后过期,因此我可以再次登录,但仍然很麻烦。 我不知道 HttpHelper 类,但我想你可以在 Login HttpResult 中获取 Cookie(CookieCollection 或 CookiesContainer)。您可以存储 cookie 以在注销请求中重复使用它们。我认为从注销请求中获得的 cookie 与此无关。我宁愿认为注销失败是因为注销请求不包含预期的 cookie。 这里是 HttpResult 的打印输出:STAT%5FUID=6E884BB1-A1CC-4244-A9C5-926AF4CF6B61 STAT%5FUNIQUE%5FUID=8EEDF377-D29D-4AF8-AAE0-3AF4B5358ED4 IV%5FUID=0 IV %5FUID%5FKEY=0 UKL=0 JSESSIONID=a7Ph4Ebj3Jq5 HttpHelper 只是一个封装类,用于封装 HttpRequest 和 HttpResponse 的细节。从 HttpResult 打印出的 cookie 及其值看起来与我使用 IE 和 HttpWatch 看到的完全相同,因此注销部分成功,只是新 cookie 没有像浏览器那样写入文件,因此旧 cookie(仍然有效)是仍然可以用于登录。如何删除旧的并添加新的? 【参考方案1】:

我遇到的问题是由于 TerminateProcess 关闭导致我的主应用程序在有机会运行之前关闭以及注销。 因此,我将 TerminateProcess 替换为软关闭,它会在我的主应用程序关闭之前向注销发出信号以正常运行。我还取消了登录前使用的注销步骤。这样,cookie 将在注销时失效并存储。现在,如果我在注销后立即尝试登录,一切都很好,因为 cookie 具有魔力。吸取的一个教训是,我们需要在发出请求时使用 CookieCollection 而不是简单的 cookie。前者将负责更新 cookie 容器中的 cookie。

【讨论】:

以上是关于c# WebBrowser登录后怎样直接用HttpWebRequest抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

怎样用delphi 获取网页html源代码(网页需登录)

c#添加webBrowser控件,如何实现自动填写打开的网页中的登录帐号,密码,并且自动登陆?

在 C# 中注销网站后立即拒绝重新登录

C# webbrowser怎么判断登录是不是成功?

C# winform webbrowser 自动登录网站?

C# 使用webBrowser控件获取网页中的账号密码登录网页元素并自动填写模拟自动登录?