使用C#抓取javascript生成的网页

时间:2014-06-18 14:51:42

标签: c# javascript html visual-studio web-scraping

我有一个webBrowser,以及Visual Studio中的标签,基本上我尝试做的是从另一个网页抓取一个部分。

我尝试使用WebClient.DownloadString和WebClient.DownloadFile,在javascript加载内容之前,他们都给了我网页的源代码。我的下一个想法是使用WebBrowser工具,只是在页面加载后调用webBrowser.DocumentText并且不起作用,它仍然提供了页面的原始来源。

有没有办法可以在javascriptload后抓取页面?

这是我试图抓的页面。

http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083

我需要从该页面获取评论,该页面已生成。

3 个答案:

答案 0 :(得分:37)

问题是浏览器通常执行javascript,结果是更新的DOM。除非您可以分析javascript或拦截它使用的数据,否则您将需要像浏览器那样执行代码。在过去我遇到了同样的问题,我利用selenium和PhantomJS来渲染页面。在呈现页面之后,我将使用WebDriver客户端来导航DOM并检索我需要的内容,发布在AJAX之后。

在高层,这些是以下步骤:

  1. 已安装的硒:http://docs.seleniumhq.org/
  2. 启动硒中心作为服务
  3. 已下载的phantomjs(无头浏览器,可以执行javascript):http://phantomjs.org/
  4. 在指向selenium hub的webdriver模式下启动了phantomjs
  5. 在我的抓取应用程序中安装了webdriver客户端nuget包:Install-Package Selenium.WebDriver
  6. 以下是phantomjs webdriver的示例用法:

    var options = new PhantomJSOptions();
    options.AddAdditionalCapability("IsJavaScriptEnabled",true);
    
    var driver = new RemoteWebDriver( new URI(Configuration.SeleniumServerHub),
                        options.ToCapabilities(),
                        TimeSpan.FromSeconds(3)
                      );
    driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";
    driver.Navigate();
    //the driver can now provide you with what you need (it will execute the script)
    //get the source of the page
    var source = driver.PageSource;
    //fully navigate the dom
    var pathElement = driver.FindElementById("some-id");
    

    有关selenium,phantomjs和webdriver的更多信息,请访问以下链接:

    http://docs.seleniumhq.org/

    http://docs.seleniumhq.org/projects/webdriver/

    http://phantomjs.org/

    编辑:更简单的方法

    似乎有一个nuget包用于phantomjs,这样你就不需要集线器了(我用一个集群以这种方式进行大规模报废):

    安装网络驱动程序:

    Install-Package Selenium.WebDriver
    

    安装嵌入式exe:

    Install-Package phantomjs.exe
    

    更新的代码:

    var driver = new PhantomJSDriver();
    driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";
    driver.Navigate();
    //the driver can now provide you with what you need (it will execute the script)
    //get the source of the page
    var source = driver.PageSource;
    //fully navigate the dom
    var pathElement = driver.FindElementById("some-id");
    

答案 1 :(得分:1)

好的我会告诉你如何使用phantomjs和selenuim启用javascript和c#

  1. 根据需要创建一个新的控制台项目名称
  2. 右手使用解决方案资源管理器
  3. 右键单击References点击Manage NuGet packages
  4. Windows将显示单击浏览而不是安装Selenium.WebDriver
  5. downold phantomjs from Phantomjs
  6. 主函数中的
  7. 键入此代码

        var options = new PhantomJSOptions();
        options.AddAdditionalCapability("IsJavaScriptEnabled", true);
        IWebDriver driver = new PhantomJSDriver("phantomjs Folder Path", options);
        driver.Navigate().GoToUrl("https://www.yourwebsite.com/");
    
        try
        {
            string pagesource = driver.PageSource;
            driver.FindElement(By.Id("yourelement"));
            Console.Write("yourelement founded");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
    
        }
    
        Console.Read();
    
  8.   不要忘记在下面的代码中将您的网站和您所浏览的元素以及phantomjs.exe路径放在您的机器中

    有充足的编码时间并感谢wbennett

答案 2 :(得分:0)

感谢wbennet,发现了https://phantomjscloud.com。足够的免费服务,可通过Web api调用来剪贴页面。

    public static string GetPagePhantomJs(string url)
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            client.DefaultRequestHeaders.ExpectContinue = false;
            var pageRequestJson = new System.Net.Http.StringContent(@"{'url':'" + url + "','renderType':'html','outputAsJson':false }");
            var response = client.PostAsync("https://PhantomJsCloud.com/api/browser/v2/{YOUT_API_KEY}/", pageRequestJson).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }

是的