如何完全下载页面源代码而不是部分下载?

时间:2016-10-24 23:37:49

标签: javascript c# selenium

我正在从网站上抓取动态数据。出于某种原因,我得到的PageSource()是部分的。但是,当我直接从Chrome或Firefox浏览器查看页面源时,它并不是部分的。我想知道一个能让我完全从页面中删除数据的答案。

对于我的应用程序,我想使用.Net Web浏览器或类似程序以编程方式进行搜索。我尝试过使用Selenium WebDriver 2.48.2和ChromeDriver;我也试过PhantomJSDriver;我也试过WebClient;还有HttpWebRequest。全部使用.Net 4.6.1。

网址:http://contests.covers.com/KingOfCovers/Contestant/PendingPicks/ARTDB

以下任何一项都无效......

尝试#1:HttpWebRequest

    var urlContent = "";

    try
    {
        var request = (HttpWebRequest) WebRequest.Create(url);
        request.CookieContainer = new CookieContainer();
        if (cookies != null)
        {
            foreach (Cookie cookie in cookies)
            {
                request.CookieContainer.Add(cookie);
            }
        }

        var responseTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,request.EndGetResponse,null);

        using (var response = (HttpWebResponse)await responseTask)
        {

            if (response.Cookies != null)
            {
                foreach (Cookie cookie in response.Cookies)
                {
                    cookies.Add(cookie);
                }
            }

            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                urlContent = sr.ReadToEnd();
            }
        }

尝试#2:WebClient

// requires async method signature
            using (WebClient client = new WebClient())
            {
                var task = await client.DownloadStringTaskAsync(url);

                return task;
            }

尝试#3:PhantomJSDriver

   var driverService = PhantomJSDriverService.CreateDefaultService();
        driverService.HideCommandPromptWindow = true;
        using (var driver = new PhantomJSDriver(driverService))
        {
            driver.Navigate().GoToUrl(url);

            WaitForAjax(driver);

            string source = driver.PageSource;

            return source;
        }

    public static void WaitForAjax(PhantomJSDriver driver)
    {
        while (true) // Handle timeout somewhere
        {
            var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
            if (ajaxIsComplete)
                break;
            Thread.Sleep(100);
        }
    }

我还尝试使用页面对象模型的ChromeDriver。这段代码太长了,无法粘贴在这里;尽管如此:它与其他3次尝试具有完全相同的结果。

预期结果

来自网址的数据表已完整,没有任何数据丢失。例如,以下是与下面的屏幕截图进行比较的屏幕截图。要注意的是,没有&#34; ...&#34;。相反,有数据。这可以通过在Firefox或Chrome中打开网址,右键单击和查看页面源来重现。

enter image description here

实际结果

观察&#34; ...&#34;是一个很大的差距,如屏幕截图中的箭头所示。应该有很多行内容代替#34; ...&#34;。这可以使用上述任何尝试再现。

enter image description here

请注意,网址是动态数据。您可能看不到与屏幕截图完全相同的结果。尽管如此,练习可以重复,它只是看起来与屏幕截图不同。快速测试以了解缺少数据是比较页面源行数:&#34;完成&#34;数据集的行数几乎是html中的两倍。

1 个答案:

答案 0 :(得分:1)

好的,按要求。很高兴有所帮助。 :)

但在您的C#中,您是否正在复制?,在您的代码中有 - &gt; urlContent = sr.ReadToEnd();你怎么看,从这里复制结果?您是否正在从调试器中复制?如果是这样,它可能是调试器的对象检查器的修剪。您是否尝试过从urlContent获取结果并保存到文件?例如。 System.IO.File.WriteAllText(@"temp.txt",urlContent);