【问题标题】:How to completely download page source, instead of partial download?如何完全下载页面源,而不是部分下载?
【发布时间】:2017-03-06 20:49:34
【问题描述】:

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

对于我的应用程序,我想使用 .Net 网络浏览器或类似浏览器以编程方式进行抓取。我尝试将 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 次尝试的结果完全相同。

预期结果

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

实际结果

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

请注意,url 是动态数据。您可能不会看到与屏幕截图完全相同的结果。尽管如此,该练习可以重复进行,它看起来与屏幕截图不同。了解缺少数据的快速测试是比较 Page Source 行数:“完整”数据集在 html 中的行数几乎是原来的两倍。

【问题讨论】:

  • 你用什么来显示结果?..因为... 通常是一种说法,这里还有很多其他信息....例如。 1,2,3,4, ... , 99998, 99999 等
  • 我将 PageSource 直接从上述方法复制/粘贴到 Notepad++ 中。我没有看到“扩展器”或任何可以显示的隐藏内容。同样复制/粘贴到 VS2015 中。
  • 但是在你的 C# 中你是从那里复制的吗?在你的代码中你有 -> urlContent = sr.ReadToEnd(); 你怎么看,从这里复制结果?你是从调试器复制吗?如果是这样,可能是调试器的对象检查器正在修剪。您是否尝试过从 urlContent 获取结果并保存到文件?例如。 System.IO.File.WriteAllText(@"temp.txt",urlContent);
  • @Keith:下次请我喝。你搞定了。请张贴作为分数的答案。

标签: javascript c# selenium


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2020-01-21
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多