【问题标题】:How do I get HTTP web request to return complete source如何获取 HTTP Web 请求以返回完整源
【发布时间】:2012-12-27 19:00:56
【问题描述】:

我正在尝试检索网页的源代码,并且我正在使用 HTTPWebRequest,但只返回了这个:

<script type="text/javascript"> 
    window.location="index.php"; 
</script> 

我使用 fiddler 来比较 chrome 获取网页并将其与我的代码检索到的内容进行比较。

左侧是Chrome,右侧是VS代码

http://i.stack.imgur.com/Hgk9w.png

我注意到的是,内容长度没有 chrome 返回的那么大。我的代码内容长度通常在 70 字节左右,而 chrome 通常会返回 87000 字节。

我尝试过使用流和内存流。有人可以指出我正确的方向吗?

下面是我的函数:

public string GetAllCampaings()
{
    string campaigns = null;
    byte[] result;
    byte[] buffer = new byte[4096];

    HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create("http://magiclampmarketing.com/sms/manage_groups.php");
    httpWebRequest2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    httpWebRequest2.Method = "GET";
    httpWebRequest2.CookieContainer = cookieContainer;
    httpWebRequest2.KeepAlive = true;
    httpWebRequest2.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11";
    httpWebRequest2.Referer = "http://magiclampmarketing.com/sms/main.php";
    httpWebRequest2.SendChunked = false;

    WebHeaderCollection myWebHeaderCollection = httpWebRequest2.Headers;
    myWebHeaderCollection.Add("Accept-Language", "en;q=0.8");
    myWebHeaderCollection.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
    myWebHeaderCollection.Add("Accept-Encoding", "gzip,deflate,sdch");

    var sp = httpWebRequest2.ServicePoint;
    var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
    prop.SetValue(sp, (byte)0, null);

    using (WebResponse response = httpWebRequest2.GetResponse())
    {
        using (Stream responseStream = response.GetResponseStream())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                int count = 0;
                do
                {
                    count = responseStream.Read(buffer, 0, count);
                    memoryStream.Write(buffer, 0, count);

                } while (count != 0);

                result = memoryStream.ToArray();
            }
        }
    }

    return campaigns; 
}

【问题讨论】:

  • 所有被返回的 javascript 正在做的是将浏览器立即重定向到index.php。所以你正确地阅读了页面的内容,这不是你所期望的。
  • 即使正在运行 javascript,我是否仍然可以获取页面的内容?或者 httpwebrequests 不处理 javascripts?如果我打开 chrome/IE/Firefox 进入页面,登录并查看页面源代码,我有没有办法获取页面源代码?
  • 尝试在浏览器中关闭 javascript,然后访问该页面并查看源代码。看看它给了你什么。但是,是的,HttpWebRequest 根本不处理 javascript。

标签: c# .net httpwebrequest httpwebresponse


【解决方案1】:

看起来您正在使用的 chrome 浏览器已经登录到该站点并具有会话 cookie。 但是,您的代码并未突出显示您是如何传递会话 cookie 的。

从所看到的情况来看,您的程序的请求似乎正在返回一个响应,将您重定向到登录页面。

您要么必须阐明您对传递会话 cookie 的看法。或者接受你的程序正在做它应该做的事情。

【讨论】:

  • 我已经以编程方式登录到该页面并拥有会话 cookie,当我使用会话 cookie 请求此特定页面的源时,它就在这里,我只能返回那个
  • @KeithDrummond - 请求 index.php 而不是您当前请求的页面。毕竟,这就是它把你重定向到的地方。
  • 好的,我认为发生的事情是我请求的页面都是 javascript。有没有办法让我获得页面的来源,而不管需要运行的 javascript 是什么?
  • @KeithDrummond - 您请求的页面肯定不是所有的 javascript 并且您编写的程序运行良好。您唯一需要澄清或重新评估的部分是设置 cookie 容器的代码部分。我不知道如何重用会话 cookie,它是一个敏感部分。您在技术上模仿浏览器。重新访问确定 cookie 容器的代码,或详细询问另一个问题。
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2018-08-08
  • 2018-02-20
相关资源
最近更新 更多