代码之家  ›  专栏  ›  技术社区  ›  sapbucket

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

  •  0
  • sapbucket  · 技术社区  · 8 年前

    我正在从网站上抓取动态数据。由于某些原因,我get()的页面源是部分的。然而,当我直接从Chrome或Firefox浏览器查看页面源代码时,这并不是部分的。我想知道一个答案,这将使我能够完全从页面上抓取数据。

    对于我的应用程序,我希望使用.Net web浏览器或类似工具以编程方式进行抓取。我尝试过使用Selenium WebDriver 2.48.2和ChromeDriver;我也尝试过PhantomJSDriver;我也尝试过WebClient;以及HttpWebRequest。所有这些都使用.NET4.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();
                }
            }
    

    // 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);
            }
        }
    

    url中的数据表完整,没有任何缺失数据。例如,这里有一个屏幕截图与下面的屏幕截图进行比较。要注意的是,不存在“…”。取而代之的是数据。这可以通过在Firefox或Chrome中打开url,右键单击并查看页面源代码来复制。

    enter image description here

    实际结果

    观察“…”是一个很大的间隙,如屏幕截图中箭头所示。应该有多行内容来代替“…”。这可以使用上述任何尝试来再现。

    enter image description here

    请注意,url是动态数据。您可能不会看到与屏幕截图完全相同的结果。尽管如此,这个练习还是可以重复的,只是看起来与屏幕截图不同。要了解是否存在缺失数据,一个快速测试是比较页面源行数:“完整”数据集在html中的行数几乎是两倍。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Keith    8 年前

    好的,按要求。很高兴能帮上忙

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