繁体   English   中英

在C#中使用HTTPWebRequest抓取GWT网站

[英]Scrape a GWT Website using HTTPWebRequest in C#

我想抓取(屏幕抓取)使用Google Web Toolkit开发的网站,而我要抓取的页面似乎是Flash页面。

我使用以下代码。

HttpWebRequest request   = (HttpWebRequest)HttpWebRequest.Create("https://xxx);
request.Method            = "POST";
request.UserAgent         = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36";
request.Headers["Cookie"] = SessionID;
request.Referer           = "xxx";
request.Accept            = "*/*";

request.Headers["X-GWT-Permutation"] = "E81756AE355F23274CB68B43D62F0248";
request.Headers["X-GWT-Module-Base"] = "https://xxx";

byte[] buffer             = System.Text.Encoding.ASCII.GetBytes(encodeData("7|0|6|https://xxx"));  //);
Stream PostData           = request.GetRequestStream();

PostData.Write(buffer, 0, buffer.Length);
PostData.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream            = response.GetResponseStream();

我得到一个抛出以下错误的输出,如下所示:/EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533“,”参数0为未知类型'java.lang.String %2F2004016611'“],0,7]

期待您的回复。

使用HttpWebRequest方法非常有效,但是以我的经验,当页面上的脚本没有可呈现的实际Web浏览器时,会导致许多问题,例如您遇到的问题。

通过将实际的WebBrowser控件放在Windows窗体上,然后将该控件导航到所需的URL,可以解决此问题。 当控件(是真正的Web浏览器)完成页面渲染后,您可以访问页面上的任何内容。 例如,如果某个文本在隐藏的DIV元素中被打乱(阻止抓取的一种常见策略),则无法从页面源中获取该文本,但是在WebBrowser控件中,您仍然可以获取该文本,因为为了显示它,它必须已被客户端脚本解密。 在WebBrowser控件中,“如果可以看到它,就可以得到它”。

编辑:最简单的实现。 只需尝试一下,看看文档源中现在是否存在缺少的源代码。

创建一个Windows窗体。 添加一个名为button1的按钮。 添加一个名为webBrowser1的WebBrowser控件,将其取消停靠并调整其大小。 添加一个名为textBox1的TextBox并使它成为多行。 然后在表单后面添加以下代码:

  private void button1_Click(object sender, EventArgs e) {
     string url = "http://google.ca";
     webBrowser1.Navigate(url);
  }

  private void webBrowser1_DocumentCompleted(object sender,
                               WebBrowserDocumentCompletedEventArgs e) {
     string pageSource = webBrowser1.Document.Body.OuterHtml;
     textBox1.Text = pageSource;
  }

将上述URL替换为您的URL。 运行表单,然后单击按钮。 查看所需的HTML现在是否出现在结果文本框中。 如果是这样,您的大多数问题现在都可以解决。 我对这项技术很幸运。 它应该解决延迟渲染的内容的任何问题,因此在实际源代码中不会以混乱的形式出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM